2021-03-15 09:52 AM
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);
}
2021-03-16 01:08 AM
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
2021-03-19 06:53 AM
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,