cancel
Showing results for 
Search instead for 
Did you mean: 

HAL_I2C_Mem_Read_DMA problem

Arman Ilmak
Senior

Hey guys.

Im using cubemx for i2c initiallization and i have a problem while using this HAL_I2C_Mem_Read_DMA function.

When i call it in while(1) it works one time and after that it returns error or busy.

  while (1)
  {
		HAL_Delay(1000);
		HAL_I2C_Mem_Read_DMA(&hi2c1,0x68<<1,0x00,I2C_MEMADD_SIZE_8BIT,buf,3);
		HAL_Delay(1000);
 
  }

2 REPLIES 2
Imen.D
ST Employee

Hello @Arman Ilmak​ ,

I would suggest you adding more details to your post: Which Cube MCU package and version are you using ? Which CubeMX version ?

Could you please share your .ioc to check with you this case ?

Imen

When your question is answered, please close this topic by clicking "Accept as Solution".
Thanks
Imen
Lecordier.Guy
Associate II

Hello,

I have a similar problem with STM32F4Cube V1.26.0

I use HAL_I2C_Mem_Read_DMA() & HAL_I2C_Mem_Write_DMA()

The 1st time HAL_I2C_Mem_Write_DMA is used, it sends 2 extra bytes

The next time, it sends the correct count.

I think it is due to the EventCount and MemaddSize which are not initialized and adjusted when DMA is used.

The 1st time, EventCount & MemaddSize are 0, so the I2C_MemoryTransmit_TXE_BTF() sends the 2 extra bytes.

The next time it is called, EventCount stays at 2, so the I2C_MemoryTransmit_TXE_BTF() generates only the Stop.  

I modified HAL_I2C_Mem_Read_DMA() & HAL_I2C_Mem_Write_DMA() in stm32f4xx_hal_i2c.c

   /* Prepare transfer parameters */

   hi2c->pBuffPtr   = pData;

   hi2c->XferCount  = Size;

   hi2c->XferSize   = hi2c->XferCount;

   hi2c->XferOptions = I2C_NO_OPTION_FRAME;

   hi2c->Devaddress = DevAddress; << new

   hi2c->Memaddress = MemAddress; << new  

   hi2c->MemaddSize = MemAddSize; << new

   hi2c->EventCount = 0U;         << new

  

       /* Send Slave Address and Memory Address */

       if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)

       {

         /* Abort the ongoing DMA */

...........

}

       hi2c->EventCount = 2U; << New

Regards,