Skip to content

Commit ef994d7

Browse files
committed
F4_HAL/i2c: Move DMA set-up to after sending I2C address.
Previous to this patch the DMA was set-up and then the I2C address sent. If the I2C address sending failed (eg no I2C device on the bus) then the DMA was left in an inconsistent state. This patch moves the DMA setup to after a successful sending of the I2C address(es).
1 parent db142df commit ef994d7

File tree

1 file changed

+32
-30
lines changed

1 file changed

+32
-30
lines changed

STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2999,21 +2999,6 @@ HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAdd
29992999

30003000
if(hi2c->XferSize > 0U)
30013001
{
3002-
/* Set the I2C DMA transfer complete callback */
3003-
hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
3004-
3005-
/* Set the DMA error callback */
3006-
hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
3007-
3008-
/* Set the unused DMA callbacks to NULL */
3009-
hi2c->hdmatx->XferHalfCpltCallback = NULL;
3010-
hi2c->hdmatx->XferM1CpltCallback = NULL;
3011-
hi2c->hdmatx->XferM1HalfCpltCallback = NULL;
3012-
hi2c->hdmatx->XferAbortCallback = NULL;
3013-
3014-
/* Enable the DMA Stream */
3015-
HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
3016-
30173002
/* Send Slave Address and Memory Address */
30183003
if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
30193004
{
@@ -3031,6 +3016,23 @@ HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAdd
30313016
}
30323017
}
30333018

3019+
/* dpgeorge: DMA initialisation is moved to after sending the address */
3020+
3021+
/* Set the I2C DMA transfer complete callback */
3022+
hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
3023+
3024+
/* Set the DMA error callback */
3025+
hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
3026+
3027+
/* Set the unused DMA callbacks to NULL */
3028+
hi2c->hdmatx->XferHalfCpltCallback = NULL;
3029+
hi2c->hdmatx->XferM1CpltCallback = NULL;
3030+
hi2c->hdmatx->XferM1HalfCpltCallback = NULL;
3031+
hi2c->hdmatx->XferAbortCallback = NULL;
3032+
3033+
/* Enable the DMA Stream */
3034+
HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->DR, Size);
3035+
30343036
/* Clear ADDR flag */
30353037
__HAL_I2C_CLEAR_ADDRFLAG(hi2c);
30363038

@@ -3120,21 +3122,6 @@ HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddr
31203122

31213123
if(hi2c->XferSize > 0U)
31223124
{
3123-
/* Set the I2C DMA transfer complete callback */
3124-
hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
3125-
3126-
/* Set the DMA error callback */
3127-
hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
3128-
3129-
/* Set the unused DMA callbacks to NULL */
3130-
hi2c->hdmarx->XferHalfCpltCallback = NULL;
3131-
hi2c->hdmarx->XferM1CpltCallback = NULL;
3132-
hi2c->hdmarx->XferM1HalfCpltCallback = NULL;
3133-
hi2c->hdmarx->XferAbortCallback = NULL;
3134-
3135-
/* Enable the DMA Stream */
3136-
HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
3137-
31383125
/* Send Slave Address and Memory Address */
31393126
if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
31403127
{
@@ -3152,6 +3139,21 @@ HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddr
31523139
}
31533140
}
31543141

3142+
/* Set the I2C DMA transfer complete callback */
3143+
hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
3144+
3145+
/* Set the DMA error callback */
3146+
hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
3147+
3148+
/* Set the unused DMA callbacks to NULL */
3149+
hi2c->hdmarx->XferHalfCpltCallback = NULL;
3150+
hi2c->hdmarx->XferM1CpltCallback = NULL;
3151+
hi2c->hdmarx->XferM1HalfCpltCallback = NULL;
3152+
hi2c->hdmarx->XferAbortCallback = NULL;
3153+
3154+
/* Enable the DMA Stream */
3155+
HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)pData, Size);
3156+
31553157
if(Size == 1U)
31563158
{
31573159
/* Disable Acknowledge */

0 commit comments

Comments
 (0)