@@ -353,19 +353,25 @@ i2c_status_e i2c_master_write(i2c_t *obj, uint8_t dev_address,
353
353
{
354
354
i2c_status_e ret = I2C_ERROR ;
355
355
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
+ }
366
370
}
367
371
}
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 );
369
375
370
376
return ret ;
371
377
}
@@ -407,19 +413,25 @@ i2c_status_e i2c_master_read(i2c_t *obj, uint8_t dev_address, uint8_t *data, uin
407
413
{
408
414
i2c_status_e ret = I2C_ERROR ;
409
415
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
+ }
420
430
}
421
431
}
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 );
423
435
424
436
return ret ;
425
437
}
0 commit comments