#21ic问答#
目前使用DDL3.2的驱动库,在硬件IIC+DMA接收 遇到问题。经测试,如果只使用硬件IIC接收数据,是没有问题的,但是如果在读EEPROM时,先发两个字节,再发一个收模式字节,然后将I2C_MasterReceiveDataAndStop(CM_I2C1, Buffer, Length,u32Timeout);替换掉,换成启动指定DMA通道,就会导致在IIC_START函数执行时就超时,想请教一个函数中为什么后面的代码会影响到最开始的代码运行,在我理解来看,程序是线性顺序执行的。
int32_t EEPROM_I2C_Read(uint16_t Address, uint8_t *Buffer, uint32_t Length,uint32_t u32Timeout)
{
int32_t i32Ret;
I2C_Cmd(CM_I2C1, ENABLE); //使能I2C
I2C_SWResetCmd(CM_I2C1, ENABLE); //软件复位
I2C_SWResetCmd(CM_I2C1, DISABLE);
DMA_ChCmd(CM_DMA2, DMA_CH0, DISABLE);
DMA_SetDestAddr(CM_DMA2,DMA_CH0,(uint32_t)Buffer);
DMA_SetTransCount(CM_DMA2,DMA_CH0,5);
DMA_ClearTransCompleteStatus(CM_DMA2,DMA_INT_TC_CH0);
if(I2C_Start(CM_I2C1, u32Timeout) == LL_OK)
{
if(I2C_TransAddr(CM_I2C1,EEPROM_I2C_ADDRESS,I2C_DIR_TX,u32Timeout) == LL_OK)//发设备地址
{
if(I2C_TransData(CM_I2C1, (const uint8_t *)&Address, 1u,u32Timeout) == LL_OK)//发写目标地址
{
if(I2C_Restart(CM_I2C1, u32Timeout) == LL_OK)//重新启动
{
if(1ul == Length)//如果只读1个字节
{
I2C_AckConfig(CM_I2C1, I2C_NACK);//设置NACK,
}
if(I2C_TransAddr(CM_I2C1, EEPROM_I2C_ADDRESS, I2C_DIR_RX, u32Timeout) == LL_OK)
{
//i32Ret = I2C_MasterReceiveDataAndStop(CM_I2C1, Buffer, Length,u32Timeout);
DMA_ChCmd(CM_DMA2, DMA_CH0, ENABLE);
}
else i32Ret=5;
I2C_AckConfig(CM_I2C1, I2C_ACK);
}
else i32Ret=4;
}
else i32Ret=3;
}
else i32Ret=2;
}
else i32Ret=1;
if(LL_OK != i32Ret)
{
I2C_Stop(CM_I2C1,u32Timeout);
}
I2C_Cmd(CM_I2C1, DISABLE);
return i32Ret;
}
另外,请教如何使用DMA接收IIC的读数据,在网上没有搜到相关的华大单片机的方案。 |