Skip to content

Commit c78f4fa

Browse files
author
fpr
committed
Revert "Revert "Use interrupt mode for I2C transfers""
This reverts commit 625fe2d.
1 parent 18d8875 commit c78f4fa

File tree

1 file changed

+23
-16
lines changed

1 file changed

+23
-16
lines changed

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

+23-16
Original file line numberDiff line numberDiff line change
@@ -261,14 +261,12 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
261261

262262
handle->State = HAL_I2C_STATE_RESET;
263263

264-
if(master == 0) {
265-
HAL_NVIC_SetPriority(obj->irq, 0, 1);
266-
HAL_NVIC_EnableIRQ(obj->irq);
264+
HAL_NVIC_SetPriority(obj->irq, 0, 1);
265+
HAL_NVIC_EnableIRQ(obj->irq);
267266
#ifdef STM32F1xx
268-
HAL_NVIC_SetPriority(obj->irqER, 0, 1);
269-
HAL_NVIC_EnableIRQ(obj->irqER);
267+
HAL_NVIC_SetPriority(obj->irqER, 0, 1);
268+
HAL_NVIC_EnableIRQ(obj->irqER);
270269
#endif
271-
}
272270

273271
// Init the I2C
274272
HAL_I2C_Init(handle);
@@ -341,17 +339,18 @@ i2c_status_e i2c_master_write(i2c_t *obj, uint8_t dev_address,
341339

342340
{
343341
i2c_status_e ret = I2C_ERROR;
344-
HAL_StatusTypeDef status = HAL_OK;
345-
346-
// Check the communication status
347-
status = HAL_I2C_Master_Transmit(&(obj->handle), dev_address, data, size, I2C_TIMEOUT_TICK);
342+
uint32_t tickstart = HAL_GetTick();
348343

349-
if(status == HAL_OK)
344+
if(HAL_I2C_Master_Transmit_IT(&(obj->handle), dev_address, data, size) == HAL_OK){
350345
ret = I2C_OK;
351-
else if(status == HAL_TIMEOUT)
352-
ret = I2C_TIMEOUT;
353-
else
354-
ret = I2C_ERROR;
346+
// wait for transfer completion
347+
while((HAL_I2C_GetState(&(obj->handle)) != HAL_I2C_STATE_READY)
348+
&& (ret != I2C_TIMEOUT)){
349+
if((HAL_GetTick() - tickstart) > I2C_TIMEOUT_TICK) {
350+
ret = I2C_TIMEOUT;
351+
}
352+
}
353+
}
355354

356355
return ret;
357356
}
@@ -385,9 +384,17 @@ void i2c_slave_write_IT(i2c_t *obj, uint8_t *data, uint8_t size)
385384
i2c_status_e i2c_master_read(i2c_t *obj, uint8_t dev_address, uint8_t *data, uint8_t size)
386385
{
387386
i2c_status_e ret = I2C_ERROR;
387+
uint32_t tickstart = HAL_GetTick();
388388

389-
if(HAL_I2C_Master_Receive(&(obj->handle), dev_address, data, size, I2C_TIMEOUT_TICK) == HAL_OK) {
389+
if(HAL_I2C_Master_Receive_IT(&(obj->handle), dev_address, data, size) == HAL_OK) {
390390
ret = I2C_OK;
391+
// wait for transfer completion
392+
while((HAL_I2C_GetState(&(obj->handle)) != HAL_I2C_STATE_READY)
393+
&& (ret != I2C_TIMEOUT)){
394+
if((HAL_GetTick() - tickstart) > I2C_TIMEOUT_TICK) {
395+
ret = I2C_TIMEOUT;
396+
}
397+
}
391398
}
392399

393400
return ret;

0 commit comments

Comments
 (0)