Change I2cRead() and I2cWrite() to more closely resemble I2C_MasterReadBlocking() and I2C_MasterWriteBlocking() respectively. This way, we should be able to figure out the root cause of the communication error regarding the blink script more easily.

This commit is contained in:
László Monda
2016-12-09 21:44:03 +01:00
parent c18d36e31b
commit c47105afd3

View File

@@ -92,12 +92,13 @@ status_t i2c_preamble(I2C_Type *baseAddress, uint8_t i2cAddress, i2c_direction_t
return result; return result;
} }
status_t I2cRead(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size) // status_t I2C_MasterReadBlocking(I2C_Type *base, uint8_t *rxBuff, size_t rxSize)
status_t I2cRead(I2C_Type *base, uint8_t i2cAddress, uint8_t *rxBuff, uint8_t rxSize)
{ {
status_t result = i2c_preamble(baseAddress, i2cAddress, kI2C_Read); status_t result = i2c_preamble(base, i2cAddress, kI2C_Read); // Added by Robi
if (result){ if (result) { // Added by Robi
return result; return result; // Added by Robi
} } // Added by Robi
result = kStatus_Success; result = kStatus_Success;
volatile uint8_t dummy = 0; volatile uint8_t dummy = 0;
@@ -105,94 +106,114 @@ status_t I2cRead(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8
/* Add this to avoid build warning. */ /* Add this to avoid build warning. */
dummy++; dummy++;
// /* Wait until the data register is ready for transmit. */
// while (!(base->S & kI2C_TransferCompleteFlag))
// {
// }
/* Clear the IICIF flag. */ /* Clear the IICIF flag. */
baseAddress->S = kI2C_IntPendingFlag; base->S = kI2C_IntPendingFlag;
/* Setup the I2C peripheral to receive data. */ /* Setup the I2C peripheral to receive data. */
baseAddress->C1 &= ~(I2C_C1_TX_MASK | I2C_C1_TXAK_MASK); base->C1 &= ~(I2C_C1_TX_MASK | I2C_C1_TXAK_MASK);
/* If rxSize equals 1, configure to send NAK. */ /* If rxSize equals 1, configure to send NAK. */
if (size == 1) if (rxSize == 1)
{ {
/* Issue NACK on read. */ /* Issue NACK on read. */
baseAddress->C1 |= I2C_C1_TXAK_MASK; base->C1 |= I2C_C1_TXAK_MASK;
} }
/* Do dummy read. */ /* Do dummy read. */
dummy = baseAddress->D; dummy = base->D;
while ((size--)) while ((rxSize--))
{ {
/* Wait until data transfer complete. */ /* Wait until data transfer complete. */
result=pollForFlag(baseAddress, kI2C_IntPendingFlag); result = pollForFlag(base, kI2C_IntPendingFlag); // Added by Robi
if (result){ if (result) { // Added by Robi
return result; return result; // Added by Robi
} } // Added by Robi
// while (!(base->S & kI2C_IntPendingFlag))
// {
// }
/* Clear the IICIF flag. */ /* Clear the IICIF flag. */
baseAddress->S = kI2C_IntPendingFlag; base->S = kI2C_IntPendingFlag;
/* Single byte use case. */ /* Single byte use case. */
if (size == 0) if (rxSize == 0)
{ {
/* Read the final byte. */ /* Read the final byte. */
result = I2C_MasterStop(baseAddress); result = I2C_MasterStop(base);
} }
if (size == 1) if (rxSize == 1)
{ {
/* Issue NACK on read. */ /* Issue NACK on read. */
baseAddress->C1 |= I2C_C1_TXAK_MASK; base->C1 |= I2C_C1_TXAK_MASK;
} }
/* Read from the data register. */ /* Read from the data register. */
*data++ = baseAddress->D; *rxBuff++ = base->D;
} }
return result; return result;
} }
status_t I2cWrite(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size) // status_t I2C_MasterWriteBlocking(I2C_Type *base, const uint8_t *txBuff, size_t txSize)
status_t I2cWrite(I2C_Type *base, uint8_t i2cAddress, uint8_t *txBuff, uint8_t txSize)
{ {
status_t result = i2c_preamble(baseAddress, i2cAddress, kI2C_Read); status_t result = i2c_preamble(base, i2cAddress, kI2C_Read); // Added by Robi
if (result){ if (result) { // Added by Robi
return result; return result; // Added by Robi
} } // Added by Robi
// result = kStatus_Success;
uint8_t statusFlags = 0; uint8_t statusFlags = 0;
// /* Wait until the data register is ready for transmit. */
// while (!(base->S & kI2C_TransferCompleteFlag))
// {
// }
/* Clear the IICIF flag. */ /* Clear the IICIF flag. */
baseAddress->S = kI2C_IntPendingFlag; base->S = kI2C_IntPendingFlag;
/* Setup the I2C peripheral to transmit data. */ /* Setup the I2C peripheral to transmit data. */
baseAddress->C1 |= I2C_C1_TX_MASK; base->C1 |= I2C_C1_TX_MASK;
while (size--) while (txSize--)
{ {
/* Send a byte of data. */ /* Send a byte of data. */
baseAddress->D = *data++; base->D = *txBuff++;
/* Wait until data transfer complete. */ /* Wait until data transfer complete. */
result=pollForFlag(baseAddress, kI2C_IntPendingFlag); result = pollForFlag(base, kI2C_IntPendingFlag); // Added by Robi
if (result){ if (result) { // Added by Robi
return result; return result; // Added by Robi
} } // Added by Robi
statusFlags = baseAddress->S; // while (!(base->S & kI2C_IntPendingFlag))
// {
// }
statusFlags = base->S;
/* Clear the IICIF flag. */ /* Clear the IICIF flag. */
baseAddress->S = kI2C_IntPendingFlag; base->S = kI2C_IntPendingFlag;
/* Check if arbitration lost or no acknowledgement (NAK), return failure status. */ /* Check if arbitration lost or no acknowledgement (NAK), return failure status. */
if (statusFlags & kI2C_ArbitrationLostFlag) if (statusFlags & kI2C_ArbitrationLostFlag)
{ {
baseAddress->S = kI2C_ArbitrationLostFlag; base->S = kI2C_ArbitrationLostFlag;
result = kStatus_I2C_ArbitrationLost; result = kStatus_I2C_ArbitrationLost;
} }
if (statusFlags & kI2C_ReceiveNakFlag) if (statusFlags & kI2C_ReceiveNakFlag)
{ {
baseAddress->S = kI2C_ReceiveNakFlag; base->S = kI2C_ReceiveNakFlag;
result = kStatus_I2C_Nak; result = kStatus_I2C_Nak;
} }
@@ -203,16 +224,14 @@ status_t I2cWrite(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint
} }
} }
if ((result == kStatus_Success) || (result == kStatus_I2C_Nak)) // Added by Robi
{ // Added by Robi
if ((result == kStatus_Success) || (result == kStatus_I2C_Nak)) /* Clear the IICIF flag. */ // Added by Robi
{ base->S = kI2C_IntPendingFlag; // Added by Robi
/* Clear the IICIF flag. */ // Added by Robi
baseAddress->S = kI2C_IntPendingFlag; /* Send stop. */ // Added by Robi
result = I2C_MasterStop(base); // Added by Robi
/* Send stop. */ } // Added by Robi
result = I2C_MasterStop(baseAddress);
}
return result; return result;
} }