我正在尝试使用 DMA 支持设置 I2C 从设备、并遇到了在传输中有时获取随机值的问题。
我将始终发送40个字节、并使用1个原子例程将这些40个字节复制到 DMA_TX_buffer、然后设置 DMA 以进行传输。
出于这个问题的调试目的、我只使用递增值和将缓冲区扩展8个字节、这些值包含"BUFEREND" 文本、缓冲区的第一个字节与其余字节不同。
下图显示了主器件的 IRQ 信号(低电平有效)。 显示发送了许多 I2C 消息、除了最后一条消息外、所有消息看起来都是正确的。

要放大最后一封邮件:

在这里、我们看到 IRQ 信号变低、开始传输、在随机字节数后发送一些垃圾。
字节数正确。 -> DMA 传输计数正确、但 SRC 地址损坏?!
在这种情况下、IRQ "DMA_TX_DONE"也不会发生、并且我的应用的 I2C 任务通过等待这个事件而被暂停。
当这个问题出现时、我还检查了 TX 缓冲区、在调试器中、缓冲区看起来是这样的(在我看来完全正确):

所有的字节都是正确的、40个字节的值是递增的。
我已经尝试过:
-交换到不同的 DMA 通道。 最初使用的是 CH25-CH26、但怀疑这可能与 SSPI 相冲突、然后换用至 CH31-CH30、GSPI 被分配至 CH7-6
-播放转接计数。 现在是40。 如果我将其设置为较低的值、则它会正确传输较少的字节(并在主器件等待40时挂起通信)。
直接将 SDR 寄存器用作 DMA dst ->不起作用。 只有 FIFO 工作
-刷新 FIFO /在重新配置 DMA 之前不刷新 FIFO
-将 TX 仲裁设置为更高的值
有什么关于如何进一步调试的想法吗?
什么可能导致 N 个传输正确、然后恰好在突然1个传输中的随机位置损坏?