diff --git a/targets/TARGET_STM/TARGET_STM32F1/objects.h b/targets/TARGET_STM/TARGET_STM32F1/objects.h index 491cdd2e092..42bf410e965 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/objects.h +++ b/targets/TARGET_STM/TARGET_STM32F1/objects.h @@ -123,6 +123,8 @@ struct i2c_s { uint8_t slave; volatile uint8_t pending_slave_tx_master_rx; volatile uint8_t pending_slave_rx_maxter_tx; + volatile uint8_t slave_tx_transfer_in_progress; + volatile uint8_t slave_rx_transfer_in_progress; uint8_t *slave_rx_buffer; volatile uint16_t slave_rx_buffer_size; volatile uint16_t slave_rx_count; diff --git a/targets/TARGET_STM/TARGET_STM32F2/objects.h b/targets/TARGET_STM/TARGET_STM32F2/objects.h index e30629a09b0..c86aeed5dbe 100644 --- a/targets/TARGET_STM/TARGET_STM32F2/objects.h +++ b/targets/TARGET_STM/TARGET_STM32F2/objects.h @@ -128,6 +128,8 @@ struct i2c_s { uint8_t slave; volatile uint8_t pending_slave_tx_master_rx; volatile uint8_t pending_slave_rx_maxter_tx; + volatile uint8_t slave_tx_transfer_in_progress; + volatile uint8_t slave_rx_transfer_in_progress; uint8_t *slave_rx_buffer; volatile uint16_t slave_rx_buffer_size; volatile uint16_t slave_rx_count; diff --git a/targets/TARGET_STM/TARGET_STM32F4/objects.h b/targets/TARGET_STM/TARGET_STM32F4/objects.h index a71b3030b90..a59dcbd4626 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/objects.h +++ b/targets/TARGET_STM/TARGET_STM32F4/objects.h @@ -112,6 +112,8 @@ struct i2c_s { uint8_t slave; volatile uint8_t pending_slave_tx_master_rx; volatile uint8_t pending_slave_rx_maxter_tx; + volatile uint8_t slave_tx_transfer_in_progress; + volatile uint8_t slave_rx_transfer_in_progress; uint8_t *slave_rx_buffer; volatile uint16_t slave_rx_buffer_size; volatile uint16_t slave_rx_count; diff --git a/targets/TARGET_STM/TARGET_STM32L1/objects.h b/targets/TARGET_STM/TARGET_STM32L1/objects.h index 148be365af4..244a7e4b0ed 100644 --- a/targets/TARGET_STM/TARGET_STM32L1/objects.h +++ b/targets/TARGET_STM/TARGET_STM32L1/objects.h @@ -110,6 +110,8 @@ struct i2c_s { uint8_t slave; volatile uint8_t pending_slave_tx_master_rx; volatile uint8_t pending_slave_rx_maxter_tx; + volatile uint8_t slave_tx_transfer_in_progress; + volatile uint8_t slave_rx_transfer_in_progress; uint8_t *slave_rx_buffer; volatile uint16_t slave_rx_buffer_size; volatile uint16_t slave_rx_count; diff --git a/targets/TARGET_STM/i2c_api.c b/targets/TARGET_STM/i2c_api.c index 266eeaa5772..5463921084b 100644 --- a/targets/TARGET_STM/i2c_api.c +++ b/targets/TARGET_STM/i2c_api.c @@ -535,6 +535,8 @@ void i2c_init_internal(i2c_t *obj, const i2c_pinmap_t *pinmap) obj_s->slave = 0; obj_s->pending_slave_tx_master_rx = 0; obj_s->pending_slave_rx_maxter_tx = 0; + obj_s->slave_tx_transfer_in_progress = 0; + obj_s->slave_rx_transfer_in_progress = 0; #endif obj_s->event = 0; @@ -1573,6 +1575,7 @@ void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *I2cHandle) i2c_t *obj = get_i2c_obj(I2cHandle); struct i2c_s *obj_s = I2C_S(obj); obj_s->pending_slave_tx_master_rx = 0; + obj_s->slave_tx_transfer_in_progress = 0; } void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *I2cHandle) @@ -1587,9 +1590,11 @@ void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *I2cHandle) HAL_I2C_Slave_Seq_Receive_IT(I2cHandle, &(obj_s->slave_rx_buffer[obj_s->slave_rx_count]), 1, I2C_NEXT_FRAME); } else { obj_s->pending_slave_rx_maxter_tx = 0; + obj_s->slave_rx_transfer_in_progress = 0; } } else { obj_s->pending_slave_rx_maxter_tx = 0; + obj_s->slave_rx_transfer_in_progress = 0; } } @@ -1643,12 +1648,13 @@ int i2c_slave_read(i2c_t *obj, char *data, int length) _length = length; } + obj_s->slave_rx_transfer_in_progress = 1; /* Always use I2C_NEXT_FRAME as slave will just adapt to master requests */ ret = HAL_I2C_Slave_Seq_Receive_IT(handle, (uint8_t *) data, _length, I2C_NEXT_FRAME); if (ret == HAL_OK) { timeout = BYTE_TIMEOUT_US * (_length + 1); - while (obj_s->pending_slave_rx_maxter_tx && (--timeout != 0)) { + while (obj_s->slave_rx_transfer_in_progress && (--timeout != 0)) { wait_us(1); } @@ -1673,12 +1679,13 @@ int i2c_slave_write(i2c_t *obj, const char *data, int length) int ret = 0; uint32_t timeout = 0; + obj_s->slave_tx_transfer_in_progress = 1; /* Always use I2C_NEXT_FRAME as slave will just adapt to master requests */ ret = HAL_I2C_Slave_Seq_Transmit_IT(handle, (uint8_t *) data, length, I2C_NEXT_FRAME); if (ret == HAL_OK) { timeout = BYTE_TIMEOUT_US * (length + 1); - while (obj_s->pending_slave_tx_master_rx && (--timeout != 0)) { + while (obj_s->slave_tx_transfer_in_progress && (--timeout != 0)) { wait_us(1); } diff --git a/targets/TARGET_STM/stm_i2c_api.h b/targets/TARGET_STM/stm_i2c_api.h index 7ae17f4b83b..c2bce54e8e9 100644 --- a/targets/TARGET_STM/stm_i2c_api.h +++ b/targets/TARGET_STM/stm_i2c_api.h @@ -68,6 +68,8 @@ struct i2c_s { uint8_t slave; volatile uint8_t pending_slave_tx_master_rx; volatile uint8_t pending_slave_rx_maxter_tx; + volatile uint8_t slave_tx_transfer_in_progress; + volatile uint8_t slave_rx_transfer_in_progress; uint8_t *slave_rx_buffer; volatile uint16_t slave_rx_buffer_size; volatile uint16_t slave_rx_count;