Skip to content

Commit 1060154

Browse files
authored
Merge pull request #15499 from agausmann/i2c-slave-flags
STM: Add separate flags for I2C slave transfer in progress
2 parents 95fee2f + dc49c2b commit 1060154

File tree

6 files changed

+19
-2
lines changed

6 files changed

+19
-2
lines changed

targets/TARGET_STM/TARGET_STM32F1/objects.h

+2
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ struct i2c_s {
123123
uint8_t slave;
124124
volatile uint8_t pending_slave_tx_master_rx;
125125
volatile uint8_t pending_slave_rx_maxter_tx;
126+
volatile uint8_t slave_tx_transfer_in_progress;
127+
volatile uint8_t slave_rx_transfer_in_progress;
126128
uint8_t *slave_rx_buffer;
127129
volatile uint16_t slave_rx_buffer_size;
128130
volatile uint16_t slave_rx_count;

targets/TARGET_STM/TARGET_STM32F2/objects.h

+2
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ struct i2c_s {
128128
uint8_t slave;
129129
volatile uint8_t pending_slave_tx_master_rx;
130130
volatile uint8_t pending_slave_rx_maxter_tx;
131+
volatile uint8_t slave_tx_transfer_in_progress;
132+
volatile uint8_t slave_rx_transfer_in_progress;
131133
uint8_t *slave_rx_buffer;
132134
volatile uint16_t slave_rx_buffer_size;
133135
volatile uint16_t slave_rx_count;

targets/TARGET_STM/TARGET_STM32F4/objects.h

+2
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ struct i2c_s {
112112
uint8_t slave;
113113
volatile uint8_t pending_slave_tx_master_rx;
114114
volatile uint8_t pending_slave_rx_maxter_tx;
115+
volatile uint8_t slave_tx_transfer_in_progress;
116+
volatile uint8_t slave_rx_transfer_in_progress;
115117
uint8_t *slave_rx_buffer;
116118
volatile uint16_t slave_rx_buffer_size;
117119
volatile uint16_t slave_rx_count;

targets/TARGET_STM/TARGET_STM32L1/objects.h

+2
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ struct i2c_s {
110110
uint8_t slave;
111111
volatile uint8_t pending_slave_tx_master_rx;
112112
volatile uint8_t pending_slave_rx_maxter_tx;
113+
volatile uint8_t slave_tx_transfer_in_progress;
114+
volatile uint8_t slave_rx_transfer_in_progress;
113115
uint8_t *slave_rx_buffer;
114116
volatile uint16_t slave_rx_buffer_size;
115117
volatile uint16_t slave_rx_count;

targets/TARGET_STM/i2c_api.c

+9-2
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,8 @@ void i2c_init_internal(i2c_t *obj, const i2c_pinmap_t *pinmap)
535535
obj_s->slave = 0;
536536
obj_s->pending_slave_tx_master_rx = 0;
537537
obj_s->pending_slave_rx_maxter_tx = 0;
538+
obj_s->slave_tx_transfer_in_progress = 0;
539+
obj_s->slave_rx_transfer_in_progress = 0;
538540
#endif
539541

540542
obj_s->event = 0;
@@ -1573,6 +1575,7 @@ void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *I2cHandle)
15731575
i2c_t *obj = get_i2c_obj(I2cHandle);
15741576
struct i2c_s *obj_s = I2C_S(obj);
15751577
obj_s->pending_slave_tx_master_rx = 0;
1578+
obj_s->slave_tx_transfer_in_progress = 0;
15761579
}
15771580

15781581
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *I2cHandle)
@@ -1587,9 +1590,11 @@ void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *I2cHandle)
15871590
HAL_I2C_Slave_Seq_Receive_IT(I2cHandle, &(obj_s->slave_rx_buffer[obj_s->slave_rx_count]), 1, I2C_NEXT_FRAME);
15881591
} else {
15891592
obj_s->pending_slave_rx_maxter_tx = 0;
1593+
obj_s->slave_rx_transfer_in_progress = 0;
15901594
}
15911595
} else {
15921596
obj_s->pending_slave_rx_maxter_tx = 0;
1597+
obj_s->slave_rx_transfer_in_progress = 0;
15931598
}
15941599
}
15951600

@@ -1643,12 +1648,13 @@ int i2c_slave_read(i2c_t *obj, char *data, int length)
16431648
_length = length;
16441649
}
16451650

1651+
obj_s->slave_rx_transfer_in_progress = 1;
16461652
/* Always use I2C_NEXT_FRAME as slave will just adapt to master requests */
16471653
ret = HAL_I2C_Slave_Seq_Receive_IT(handle, (uint8_t *) data, _length, I2C_NEXT_FRAME);
16481654

16491655
if (ret == HAL_OK) {
16501656
timeout = BYTE_TIMEOUT_US * (_length + 1);
1651-
while (obj_s->pending_slave_rx_maxter_tx && (--timeout != 0)) {
1657+
while (obj_s->slave_rx_transfer_in_progress && (--timeout != 0)) {
16521658
wait_us(1);
16531659
}
16541660

@@ -1673,12 +1679,13 @@ int i2c_slave_write(i2c_t *obj, const char *data, int length)
16731679
int ret = 0;
16741680
uint32_t timeout = 0;
16751681

1682+
obj_s->slave_tx_transfer_in_progress = 1;
16761683
/* Always use I2C_NEXT_FRAME as slave will just adapt to master requests */
16771684
ret = HAL_I2C_Slave_Seq_Transmit_IT(handle, (uint8_t *) data, length, I2C_NEXT_FRAME);
16781685

16791686
if (ret == HAL_OK) {
16801687
timeout = BYTE_TIMEOUT_US * (length + 1);
1681-
while (obj_s->pending_slave_tx_master_rx && (--timeout != 0)) {
1688+
while (obj_s->slave_tx_transfer_in_progress && (--timeout != 0)) {
16821689
wait_us(1);
16831690
}
16841691

targets/TARGET_STM/stm_i2c_api.h

+2
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ struct i2c_s {
6868
uint8_t slave;
6969
volatile uint8_t pending_slave_tx_master_rx;
7070
volatile uint8_t pending_slave_rx_maxter_tx;
71+
volatile uint8_t slave_tx_transfer_in_progress;
72+
volatile uint8_t slave_rx_transfer_in_progress;
7173
uint8_t *slave_rx_buffer;
7274
volatile uint16_t slave_rx_buffer_size;
7375
volatile uint16_t slave_rx_count;

0 commit comments

Comments
 (0)