Skip to content

Commit cb891ec

Browse files
authored
Merge pull request #155 from cparata/master
Fix I2C bug for F4 platforms in IT mode
2 parents b086968 + 692d3be commit cb891ec

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

Diff for: cores/arduino/stm32/twi.c

+34-22
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)