Skip to content

Commit 431ba4b

Browse files
committed
[I2C] Review errors management
Signed-off-by: Frederic Pillon <[email protected]>
1 parent dd3050a commit 431ba4b

File tree

3 files changed

+34
-14
lines changed

3 files changed

+34
-14
lines changed

cores/arduino/stm32/twi.c

+16-8
Original file line numberDiff line numberDiff line change
@@ -762,8 +762,12 @@ i2c_status_e i2c_master_write(i2c_t *obj, uint8_t dev_address,
762762
if ((delta > I2C_TIMEOUT_TICK)
763763
|| ((err & HAL_I2C_ERROR_TIMEOUT) == HAL_I2C_ERROR_TIMEOUT)) {
764764
ret = I2C_TIMEOUT;
765-
} else if (err != HAL_I2C_ERROR_NONE) {
766-
ret = I2C_ERROR;
765+
} else {
766+
if ((err & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) {
767+
ret = I2C_NACK_DATA;
768+
} else if (err != HAL_I2C_ERROR_NONE) {
769+
ret = I2C_ERROR;
770+
}
767771
}
768772
}
769773
}
@@ -784,7 +788,7 @@ i2c_status_e i2c_slave_write_IT(i2c_t *obj, uint8_t *data, uint16_t size)
784788

785789
// Protection to not override the TxBuffer
786790
if (size > I2C_TXRX_BUFFER_SIZE) {
787-
ret = I2C_ERROR;
791+
ret = I2C_DATA_TOO_LONG;
788792
} else {
789793
// Check the communication status
790794
for (i = 0; i < size; i++) {
@@ -832,8 +836,12 @@ i2c_status_e i2c_master_read(i2c_t *obj, uint8_t dev_address, uint8_t *data, uin
832836
if ((delta > I2C_TIMEOUT_TICK)
833837
|| ((err & HAL_I2C_ERROR_TIMEOUT) == HAL_I2C_ERROR_TIMEOUT)) {
834838
ret = I2C_TIMEOUT;
835-
} else if (err != HAL_I2C_ERROR_NONE) {
836-
ret = I2C_ERROR;
839+
} else {
840+
if ((err & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) {
841+
ret = I2C_NACK_DATA;
842+
} else if (err != HAL_I2C_ERROR_NONE) {
843+
ret = I2C_ERROR;
844+
}
837845
}
838846
}
839847
return ret;
@@ -855,13 +863,13 @@ i2c_status_e i2c_IsDeviceReady(i2c_t *obj, uint8_t devAddr, uint32_t trials)
855863
ret = I2C_OK;
856864
break;
857865
case HAL_TIMEOUT:
858-
ret = I2C_TIMEOUT;
866+
ret = (obj->handle.State != HAL_I2C_STATE_READY) ? I2C_TIMEOUT : I2C_NACK_ADDR;
859867
break;
860868
case HAL_BUSY:
861-
ret = I2C_BUSY;
869+
ret = (obj->handle.State != HAL_I2C_STATE_READY) ? I2C_BUSY : I2C_NACK_ADDR;
862870
break;
863871
default:
864-
ret = I2C_TIMEOUT;
872+
ret = (obj->handle.State != HAL_I2C_STATE_READY) ? I2C_ERROR : I2C_NACK_ADDR;
865873
break;
866874
}
867875
return ret;

cores/arduino/stm32/twi.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,12 @@ struct i2c_s {
115115
///@brief I2C state
116116
typedef enum {
117117
I2C_OK = 0,
118-
I2C_TIMEOUT = 1,
119-
I2C_ERROR = 2,
120-
I2C_BUSY = 3
118+
I2C_DATA_TOO_LONG = 1,
119+
I2C_NACK_ADDR = 2,
120+
I2C_NACK_DATA = 3,
121+
I2C_ERROR = 4,
122+
I2C_TIMEOUT = 5,
123+
I2C_BUSY = 6
121124
} i2c_status_e;
122125

123126
/* Exported functions ------------------------------------------------------- */

libraries/Wire/src/Wire.cpp

+12-3
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,13 @@ void TwoWire::begin(int address, bool generalCall)
100100

101101
void TwoWire::end(void)
102102
{
103+
i2c_deinit(&_i2c);
103104
free(txBuffer);
104105
txBuffer = nullptr;
105106
txBufferAllocated = 0;
106107
free(rxBuffer);
107108
rxBuffer = nullptr;
108109
rxBufferAllocated = 0;
109-
i2c_deinit(&_i2c);
110110
}
111111

112112
void TwoWire::setClock(uint32_t frequency)
@@ -237,11 +237,20 @@ uint8_t TwoWire::endTransmission(uint8_t sendStop)
237237
// transmit buffer (blocking)
238238
switch (i2c_master_write(&_i2c, txAddress, txBuffer, txBufferLength)) {
239239
case I2C_OK :
240-
ret = 0;
240+
ret = 0; // Success
241241
break;
242-
case I2C_TIMEOUT :
242+
case I2C_DATA_TOO_LONG :
243243
ret = 1;
244244
break;
245+
case I2C_NACK_ADDR:
246+
ret = 2;
247+
break;
248+
case I2C_NACK_DATA:
249+
ret = 3;
250+
break;
251+
case I2C_TIMEOUT:
252+
case I2C_BUSY:
253+
case I2C_ERROR:
245254
default:
246255
ret = 4;
247256
break;

0 commit comments

Comments
 (0)