Skip to content

Commit 6026721

Browse files
EdouardMALOTHBOSTM
authored andcommitted
Bug Fix : Enable disable RX/TX interrupt flags during HAL_I2C_Mem_Read_IT()
1 parent ed7d3d4 commit 6026721

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c.c

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2156,7 +2156,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t D
21562156
/* possible to enable all of these */
21572157
/* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI |
21582158
I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
2159-
I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
2159+
I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
21602160
}
21612161

21622162
return HAL_OK;
@@ -2845,7 +2845,7 @@ HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddre
28452845
/* possible to enable all of these */
28462846
/* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI |
28472847
I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
2848-
I2C_Enable_IRQ(hi2c, (I2C_XFER_TX_IT | I2C_XFER_RX_IT));
2848+
I2C_Enable_IRQ(hi2c, (I2C_XFER_TX_IT));
28492849

28502850
return HAL_OK;
28512851
}
@@ -3790,7 +3790,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16
37903790
/* possible to enable all of these */
37913791
/* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI |
37923792
I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */
3793-
I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
3793+
I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
37943794
}
37953795

37963796
return HAL_OK;
@@ -5030,7 +5030,13 @@ static HAL_StatusTypeDef I2C_Mem_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32
50305030
else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TC) != RESET) && \
50315031
(I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))
50325032
{
5033-
if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
5033+
/* Disable Interrupt related to address step */
5034+
I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
5035+
5036+
/* Enable ERR, TC, STOP, NACK and RXI interrupts */
5037+
I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
5038+
5039+
if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
50345040
{
50355041
direction = I2C_GENERATE_START_READ;
50365042
}
@@ -5396,6 +5402,9 @@ static HAL_StatusTypeDef I2C_Mem_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint3
53965402
else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TCR) != RESET) && \
53975403
(I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))
53985404
{
5405+
/* Disable Interrupt related to address step */
5406+
I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
5407+
53995408
/* Enable only Error interrupt */
54005409
I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
54015410

@@ -5438,6 +5447,12 @@ static HAL_StatusTypeDef I2C_Mem_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint3
54385447
else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TC) != RESET) && \
54395448
(I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))
54405449
{
5450+
/* Disable Interrupt related to address step */
5451+
I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
5452+
5453+
/* Enable only Error and NACK interrupt for data transfer */
5454+
I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
5455+
54415456
if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
54425457
{
54435458
direction = I2C_GENERATE_START_READ;
@@ -6122,7 +6137,8 @@ static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)
61226137
__HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
61236138

61246139
/* Disable Interrupts and Store Previous state */
6125-
if ((tmpstate == HAL_I2C_STATE_BUSY_TX) || (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN))
6140+
if ((tmpstate == HAL_I2C_STATE_BUSY_TX) || (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN) ||
6141+
(tmpstate == HAL_I2C_STATE_LISTEN))
61266142
{
61276143
I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT);
61286144
hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;

0 commit comments

Comments
 (0)