打印
[技术问答]

华大HC32F460硬件IIC+DMA通讯问题请教

[复制链接]
1041|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ryanwangcn|  楼主 | 2024-9-26 13:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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的读数据,在网上没有搜到相关的华大单片机的方案。

使用特权

评论回复
沙发
shenxiaolin| | 2024-9-29 10:09 | 只看该作者
一般情况下会有等待CK超时的处理

使用特权

评论回复
板凳
miltk| | 2024-10-28 20:32 | 只看该作者
在嵌入式系统中,特别是在使用硬件I2C和DMA的情况下,代码的执行顺序和硬件资源的配置可能会影响到整个系统的运行。你提到的问题可能是由于硬件资源冲突

使用特权

评论回复
地板
suiziq| | 2024-10-28 21:39 | 只看该作者
硬件I2C和DMA通常会共享一些硬件资源,例如总线控制器、中断控制器等。如果在配置DMA通道时没有正确处理这些资源,可能会导致I2C操作失败。

使用特权

评论回复
5
teaccch| | 2024-10-28 23:50 | 只看该作者
DMA操作和I2C操作的时序可能会有冲突。例如,DMA操作可能会占用总线资源,导致I2C操作无法正常进行

使用特权

评论回复
6
一切D都好| | 2024-10-29 08:24 | 只看该作者
在配置DMA通道时,可能会有一些配置错误,例如DMA通道的优先级、数据传输方向、数据长度等配置不当,导致DMA操作无法正常进行,从而影响到I2C操作

使用特权

评论回复
7
canfeil| | 2024-10-29 09:13 | 只看该作者
确保I2C和DMA的硬件资源配置没有冲突。例如,检查总线控制器、中断控制器等资源是否被正确配置

使用特权

评论回复
8
eleg34ance| | 2024-10-29 10:07 | 只看该作者
调整中断优先级,确保DMA中断和I2C中断的优先级配置正确。通常情况下,I2C操作的优先级应该高于DMA操作,以确保I2C操作不会被中断。

使用特权

评论回复
9
gra22ce| | 2024-10-29 11:25 | 只看该作者
检查DMA配置,确保DMA通道的配置正确,包括数据传输方向、数据长度、优先级等

使用特权

评论回复
10
twinkhahale| | 2024-10-29 12:15 | 只看该作者
在关键代码段添加调试信息或日志,以便更好地理解代码的执行流程和问题发生的原因

使用特权

评论回复
11
清芯芯清| | 2024-10-29 14:22 | 只看该作者
注意DMA配置,确保DMA配置正确,特别是数据传输方向、数据长度、优先级等。

使用特权

评论回复
12
yuliangren| | 2024-10-29 22:41 | 只看该作者
DMA操作通常会触发中断,而I2C操作也可能触发中断。如果中断优先级配置不当,可能会导致I2C操作在中断处理过程中被中断,从而导致超时

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝