@@ -353,19 +353,25 @@ i2c_status_e i2c_master_write(i2c_t *obj, uint8_t dev_address,
353353{
354354 i2c_status_e ret = I2C_ERROR ;
355355 uint32_t tickstart = HAL_GetTick ();
356-
357- if (HAL_I2C_Master_Transmit_IT (& (obj -> handle ), dev_address , data , size ) == HAL_OK ){
358- ret = I2C_OK ;
359- // wait for transfer completion
360- while ((HAL_I2C_GetState (& (obj -> handle )) != HAL_I2C_STATE_READY )
361- && (ret == I2C_OK )){
362- if ((HAL_GetTick () - tickstart ) > I2C_TIMEOUT_TICK ) {
363- ret = I2C_TIMEOUT ;
364- } else if (HAL_I2C_GetError (& (obj -> handle )) != HAL_I2C_ERROR_NONE ) {
365- ret = I2C_ERROR ;
356+ uint32_t delta = 0 ;
357+
358+ do {
359+ if (HAL_I2C_Master_Transmit_IT (& (obj -> handle ), dev_address , data , size ) == HAL_OK ){
360+ ret = I2C_OK ;
361+ // wait for transfer completion
362+ while ((HAL_I2C_GetState (& (obj -> handle )) != HAL_I2C_STATE_READY )
363+ && (ret == I2C_OK )){
364+ delta = (HAL_GetTick () - tickstart );
365+ if (delta > I2C_TIMEOUT_TICK ) {
366+ ret = I2C_TIMEOUT ;
367+ } else if (HAL_I2C_GetError (& (obj -> handle )) != HAL_I2C_ERROR_NONE ) {
368+ ret = I2C_ERROR ;
369+ }
366370 }
367371 }
368- }
372+ /* When Acknowledge failure occurs (Slave don't acknowledge it's address)
373+ Master restarts communication */
374+ }while (HAL_I2C_GetError (& (obj -> handle )) == HAL_I2C_ERROR_AF && delta < I2C_TIMEOUT_TICK );
369375
370376 return ret ;
371377}
@@ -407,19 +413,25 @@ i2c_status_e i2c_master_read(i2c_t *obj, uint8_t dev_address, uint8_t *data, uin
407413{
408414 i2c_status_e ret = I2C_ERROR ;
409415 uint32_t tickstart = HAL_GetTick ();
410-
411- if (HAL_I2C_Master_Receive_IT (& (obj -> handle ), dev_address , data , size ) == HAL_OK ) {
412- ret = I2C_OK ;
413- // wait for transfer completion
414- while ((HAL_I2C_GetState (& (obj -> handle )) != HAL_I2C_STATE_READY )
415- && (ret == I2C_OK )){
416- if ((HAL_GetTick () - tickstart ) > I2C_TIMEOUT_TICK ) {
417- ret = I2C_TIMEOUT ;
418- } else if (HAL_I2C_GetError (& (obj -> handle )) != HAL_I2C_ERROR_NONE ) {
419- ret = I2C_ERROR ;
416+ uint32_t delta = 0 ;
417+
418+ do {
419+ if (HAL_I2C_Master_Receive_IT (& (obj -> handle ), dev_address , data , size ) == HAL_OK ) {
420+ ret = I2C_OK ;
421+ // wait for transfer completion
422+ while ((HAL_I2C_GetState (& (obj -> handle )) != HAL_I2C_STATE_READY )
423+ && (ret == I2C_OK )){
424+ delta = (HAL_GetTick () - tickstart );
425+ if ( delta > I2C_TIMEOUT_TICK ) {
426+ ret = I2C_TIMEOUT ;
427+ } else if (HAL_I2C_GetError (& (obj -> handle )) != HAL_I2C_ERROR_NONE ) {
428+ ret = I2C_ERROR ;
429+ }
420430 }
421431 }
422- }
432+ /* When Acknowledge failure occurs (Slave don't acknowledge it's address)
433+ Master restarts communication */
434+ }while (HAL_I2C_GetError (& (obj -> handle )) == HAL_I2C_ERROR_AF && delta < I2C_TIMEOUT_TICK );
423435
424436 return ret ;
425437}
0 commit comments