@@ -762,8 +762,12 @@ i2c_status_e i2c_master_write(i2c_t *obj, uint8_t dev_address,
762
762
if ((delta > I2C_TIMEOUT_TICK )
763
763
|| ((err & HAL_I2C_ERROR_TIMEOUT ) == HAL_I2C_ERROR_TIMEOUT )) {
764
764
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
+ }
767
771
}
768
772
}
769
773
}
@@ -784,7 +788,7 @@ i2c_status_e i2c_slave_write_IT(i2c_t *obj, uint8_t *data, uint16_t size)
784
788
785
789
// Protection to not override the TxBuffer
786
790
if (size > I2C_TXRX_BUFFER_SIZE ) {
787
- ret = I2C_ERROR ;
791
+ ret = I2C_DATA_TOO_LONG ;
788
792
} else {
789
793
// Check the communication status
790
794
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
832
836
if ((delta > I2C_TIMEOUT_TICK )
833
837
|| ((err & HAL_I2C_ERROR_TIMEOUT ) == HAL_I2C_ERROR_TIMEOUT )) {
834
838
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
+ }
837
845
}
838
846
}
839
847
return ret ;
@@ -855,13 +863,13 @@ i2c_status_e i2c_IsDeviceReady(i2c_t *obj, uint8_t devAddr, uint32_t trials)
855
863
ret = I2C_OK ;
856
864
break ;
857
865
case HAL_TIMEOUT :
858
- ret = I2C_TIMEOUT ;
866
+ ret = ( obj -> handle . State != HAL_I2C_STATE_READY ) ? I2C_TIMEOUT : I2C_NACK_ADDR ;
859
867
break ;
860
868
case HAL_BUSY :
861
- ret = I2C_BUSY ;
869
+ ret = ( obj -> handle . State != HAL_I2C_STATE_READY ) ? I2C_BUSY : I2C_NACK_ADDR ;
862
870
break ;
863
871
default :
864
- ret = I2C_TIMEOUT ;
872
+ ret = ( obj -> handle . State != HAL_I2C_STATE_READY ) ? I2C_ERROR : I2C_NACK_ADDR ;
865
873
break ;
866
874
}
867
875
return ret ;
0 commit comments