Merge pull request #15499 from agausmann/i2c-slave-flags

STM: Add separate flags for I2C slave transfer in progress
pull/15515/head
Martin Kojtal 2024-05-03 19:03:40 +02:00 committed by GitHub
commit 1060154c19
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 19 additions and 2 deletions

View File

@ -123,6 +123,8 @@ struct i2c_s {
uint8_t slave; uint8_t slave;
volatile uint8_t pending_slave_tx_master_rx; volatile uint8_t pending_slave_tx_master_rx;
volatile uint8_t pending_slave_rx_maxter_tx; 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; uint8_t *slave_rx_buffer;
volatile uint16_t slave_rx_buffer_size; volatile uint16_t slave_rx_buffer_size;
volatile uint16_t slave_rx_count; volatile uint16_t slave_rx_count;

View File

@ -128,6 +128,8 @@ struct i2c_s {
uint8_t slave; uint8_t slave;
volatile uint8_t pending_slave_tx_master_rx; volatile uint8_t pending_slave_tx_master_rx;
volatile uint8_t pending_slave_rx_maxter_tx; 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; uint8_t *slave_rx_buffer;
volatile uint16_t slave_rx_buffer_size; volatile uint16_t slave_rx_buffer_size;
volatile uint16_t slave_rx_count; volatile uint16_t slave_rx_count;

View File

@ -112,6 +112,8 @@ struct i2c_s {
uint8_t slave; uint8_t slave;
volatile uint8_t pending_slave_tx_master_rx; volatile uint8_t pending_slave_tx_master_rx;
volatile uint8_t pending_slave_rx_maxter_tx; 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; uint8_t *slave_rx_buffer;
volatile uint16_t slave_rx_buffer_size; volatile uint16_t slave_rx_buffer_size;
volatile uint16_t slave_rx_count; volatile uint16_t slave_rx_count;

View File

@ -110,6 +110,8 @@ struct i2c_s {
uint8_t slave; uint8_t slave;
volatile uint8_t pending_slave_tx_master_rx; volatile uint8_t pending_slave_tx_master_rx;
volatile uint8_t pending_slave_rx_maxter_tx; 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; uint8_t *slave_rx_buffer;
volatile uint16_t slave_rx_buffer_size; volatile uint16_t slave_rx_buffer_size;
volatile uint16_t slave_rx_count; volatile uint16_t slave_rx_count;

View File

@ -535,6 +535,8 @@ void i2c_init_internal(i2c_t *obj, const i2c_pinmap_t *pinmap)
obj_s->slave = 0; obj_s->slave = 0;
obj_s->pending_slave_tx_master_rx = 0; obj_s->pending_slave_tx_master_rx = 0;
obj_s->pending_slave_rx_maxter_tx = 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 #endif
obj_s->event = 0; obj_s->event = 0;
@ -1573,6 +1575,7 @@ void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *I2cHandle)
i2c_t *obj = get_i2c_obj(I2cHandle); i2c_t *obj = get_i2c_obj(I2cHandle);
struct i2c_s *obj_s = I2C_S(obj); struct i2c_s *obj_s = I2C_S(obj);
obj_s->pending_slave_tx_master_rx = 0; obj_s->pending_slave_tx_master_rx = 0;
obj_s->slave_tx_transfer_in_progress = 0;
} }
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *I2cHandle) 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); HAL_I2C_Slave_Seq_Receive_IT(I2cHandle, &(obj_s->slave_rx_buffer[obj_s->slave_rx_count]), 1, I2C_NEXT_FRAME);
} else { } else {
obj_s->pending_slave_rx_maxter_tx = 0; obj_s->pending_slave_rx_maxter_tx = 0;
obj_s->slave_rx_transfer_in_progress = 0;
} }
} else { } else {
obj_s->pending_slave_rx_maxter_tx = 0; 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; _length = length;
} }
obj_s->slave_rx_transfer_in_progress = 1;
/* Always use I2C_NEXT_FRAME as slave will just adapt to master requests */ /* 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); ret = HAL_I2C_Slave_Seq_Receive_IT(handle, (uint8_t *) data, _length, I2C_NEXT_FRAME);
if (ret == HAL_OK) { if (ret == HAL_OK) {
timeout = BYTE_TIMEOUT_US * (_length + 1); 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); wait_us(1);
} }
@ -1673,12 +1679,13 @@ int i2c_slave_write(i2c_t *obj, const char *data, int length)
int ret = 0; int ret = 0;
uint32_t timeout = 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 */ /* 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); ret = HAL_I2C_Slave_Seq_Transmit_IT(handle, (uint8_t *) data, length, I2C_NEXT_FRAME);
if (ret == HAL_OK) { if (ret == HAL_OK) {
timeout = BYTE_TIMEOUT_US * (length + 1); 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); wait_us(1);
} }

View File

@ -68,6 +68,8 @@ struct i2c_s {
uint8_t slave; uint8_t slave;
volatile uint8_t pending_slave_tx_master_rx; volatile uint8_t pending_slave_tx_master_rx;
volatile uint8_t pending_slave_rx_maxter_tx; 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; uint8_t *slave_rx_buffer;
volatile uint16_t slave_rx_buffer_size; volatile uint16_t slave_rx_buffer_size;
volatile uint16_t slave_rx_count; volatile uint16_t slave_rx_count;