@@ -2999,21 +2999,6 @@ HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAdd
2999
2999
3000
3000
if (hi2c -> XferSize > 0U )
3001
3001
{
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
-
3017
3002
/* Send Slave Address and Memory Address */
3018
3003
if (I2C_RequestMemoryWrite (hi2c , DevAddress , MemAddress , MemAddSize , I2C_TIMEOUT_FLAG , tickstart ) != HAL_OK )
3019
3004
{
@@ -3031,6 +3016,23 @@ HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAdd
3031
3016
}
3032
3017
}
3033
3018
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
+
3034
3036
/* Clear ADDR flag */
3035
3037
__HAL_I2C_CLEAR_ADDRFLAG (hi2c );
3036
3038
@@ -3120,21 +3122,6 @@ HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddr
3120
3122
3121
3123
if (hi2c -> XferSize > 0U )
3122
3124
{
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
-
3138
3125
/* Send Slave Address and Memory Address */
3139
3126
if (I2C_RequestMemoryRead (hi2c , DevAddress , MemAddress , MemAddSize , I2C_TIMEOUT_FLAG , tickstart ) != HAL_OK )
3140
3127
{
@@ -3152,6 +3139,21 @@ HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddr
3152
3139
}
3153
3140
}
3154
3141
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
+
3155
3157
if (Size == 1U )
3156
3158
{
3157
3159
/* Disable Acknowledge */
0 commit comments