尊敬的各位,
我正在尝试将一些在 mpc57xx 和 S32K1xx 设备上运行了多年的代码移植到 S32K322。我正在设置 2 个连续的 DMA 通道,让它们互相打乒乓球。
问题是第一个通道的初始源读取导致 SBE 位被置位,我不知道为什么。
我在会导致第一个通道的 START 位请求服务的指令处设置了一个断点,并在下一个 sw 指令处设置了第二个断点。这两张图片分别显示了前后状态下两个通道的 DMA 配置。
第一个信道(TCD0)的目的是从 RAM(位于 0x2000a248)读取 4 字节的内存,并将该存储器的内容放入第二个信道的源地址(参见 TCD0 的 DADDR 是 0x40214020,这是 TCD1 的 SADDR 地址)。
因此,我希望 TCD1 SADDR 的内容成为 0x2000A248 处的内存内容。
如图所示,CITER 正在递减,但传输并未进行;TCD1 SADDR 没有改变,CH0_ES 位被置位。
数据缓存已关闭,因此 RAM 未被缓存。通道 0 和通道 1 的 DMA 复用器设置了 ENBL 位(地址 0x40280002 和 0x40280003 均为 0x80)。
有人知道我漏掉了什么吗?
这是一个裸机项目,没有 RTD 或其他任何功能。
感谢并致意
Andrew
好的 - 我成功地重现并解决了这个问题。
当从 RAM 中的地址读取初始源指针时,没有任何问题 - DMA 访问完全按照我的预期运行,我可以获得我选择的正确数据流。
但是,如果初始访问是 DTCM,就会出现问题。第一次读取信号源时,SBE 立即被设置。
这是因为在访问 DTCM 时,eDMA 必须使用后门地址,而不是相关变量的真实地址--因此,在 DTCM 中时,我需要将地址偏移 0x1000000,而在 RAM 中时则不需要。
仔细查看 AN13388 中的示例 5、6 和 7 以及参考手册所附的内存映射。
希望这能帮助遇到类似问题的人。
感谢丹尼尔的回复,让我有了更多的思考。
亲爱的丹尼尔
我创建了一个基本项目,其中包括我们确切的时钟设置和 DMA 配置。
有趣的是,它*没有*显示我最初的帖子中的症状(因为它不会在第一次尝试进行传输时抛出 SBE 位)——但是,在两个链接的频道之间进行的 “乒乓” 产量的数据在输出缓冲区中不正确(尽管结果是一致的)。
考虑到您对时钟频率的意见,在向您发送这个项目之前,我会仔细检查一下时钟频率(仅供参考,内核速度应为 160MHz,其他频率为 80MHz 或 40MHz)。
谢谢您的帮助;如果我把项目发给您,会再联系您的。
此致,
Andrew
你好,安德鲁、
如果您不想公开分享代码,请随时给我发私人信息。
不过,我一般建议创建支持票据,以便更好地跟踪和跟进。
你说得对,XRDC 就是为此目的而设计的,但默认情况下是禁用的。
XBIC 确实提供完整性检查功能,而且默认情况下已启用,但通常不会导致此问题。
无法预测的行为往往与系统时钟设置不正确有关。只有当时钟比率符合参考手册中指定的选项时,微控制器才能可靠地运行,例如,表 157 概述了高性能模式 (CORE_CLK @ 160 MHz) 的选项 A。
这一点非常重要,因为 eDMA、SRAM 和 XBIC 等模块必须在特定、确定的时钟频率下运行才能正常工作。
此致,
丹尼尔
你好,丹尼尔、
我不能把代码原封不动地提供给您....,我必须把它嫁接到一个 "普通 "恩智浦项目中,然后把它发布给您--您有直接的地址吗?
据我所知,K3 上没有 AIPS 寄存器,因此我认为可以立即访问 RAM。我也没有启用 XRDC(我敢肯定它会拦截总线请求并停止它)。但是,在 DMA 访问 RAM(XBIC?)
感谢您的回复
Andrew
你好,@andrew_smith、
能否共享代码,以便我进行测试?