主题中讨论的其他器件:HALCOGEN
在 DMA 控制包完成后立即复位(通过写入)时、我观察到一些非常奇怪的行为。 我已经在多个外设中观察到了这一点、因此我认为它与哪个外设无关。 具体而言、它似乎将传输的最后一个元素放置在第一个元素应移动的位置、并且不会在最后一个元素的存储器位置写入任何内容。
观察 DMA 外设指示传输完成和写入控制数据包之间的短暂延迟会使症状消失。 但是、我在 TRM 中看不到任何有关此要求的说明、因此我不知道延迟会在多长时间内保证正确的行为(以及延迟如何取决于时钟速度等)。 您能否澄清此用例的时序要求?
此帖子的其余部分汇总了我尝试过的各种内容、如果您想知道、这些内容不会产生任何影响。 我已经尝试了我能想到的所有东西、但可以随意建议其他东西。
我在 DCAN 和 MIBSPI 外设上都观察到了这一点。
以下等待 DMA 通道全部完成的形式提供了相同的结果:
- 等待 FTCFLAG 中的位被置位
- 等待 BTFLAG 中的位置位(我已将测试用例最小化为每个块一个帧)
- 等待 FIFOASTAT 中的位清零(我的测试足够小、它始终会结束 FIFO A)
- 等待挂起中的位清零
当在看到 DMA 通道完成和写入控制数据包之间插入时、以下形式的"短等待"似乎都会使问题消失:
- 4个外设读取(但不是3个)
- 3个外设读取+ DSB (但不是2个)
- 4个外设读取+一个分支(但不是3个)
- 12次从正常存储器读取(但不是11次)
以下形式的通道描述符写入都具有相同的结果:
- 将相同的值写回 IDADDR
- 向 IDADDR 写入不同的值
- 向 ITCOUNT 写入相同的值
- 向 ITCOUNT 写入不同的值
设置或清除 AIM 不会产生影响。
我可以通过写回映射存储器中的 DMA 缓冲器或完全禁用缓存来可靠地重现此问题。 请注意、要在禁用缓存的情况下重现此代码、我必须将所有相关代码放入 RAM 中。 我认为这是因为在没有缓存的情况下从闪存执行太慢、无法解决问题。 在这种情况下、上述"短暂等待"时间足够长的时间安排可能也有所不同。 我禁用了 I 高速缓存和 D 高速缓存、因为这是最简单的;除了更改代码运行所需的时间之外、我看不到 I 高速缓存是没有关系的。
我热切期待着对 DMA 硬件的工作做出一些澄清。