我的应用正在与 SPI 闪存芯片通信。 当我在紧凑的优化环路中直接访问 SSI 外设时、代码工作完美。 我已尝试通过将数据传输从直接 SSI 访问更改为 UDMA 来提高性能。 我在直接 SSI 访问中保留了 Flash 存储器命令字节和地址字节(通常为4字节地址)、因此只有较长的 Flash 数据传输由 UDMA 处理。
为了提高效率、我将 UDMA 通道控制设置为 UDMA_SIZE_8 | UDMA_ARB_4。 通道传输为 UDMA_MODE_PING_PONG。 通道属性设置了 UDMA_ATTR_USEBURST、我认为我要小心等待 SSI 忙线取消置位、然后只将 UDMA 大小编程为4个字节的倍数。
症状是我的数据几乎完全正确地传输、但传输过程中的随机点开始出现一个位错误。 在或第5个32位字中、大约22个字节、就像0x00004000正在或写入我的数据流中一样。 该位错误是字对齐的、不是字节对齐的、因此我首先怀疑 uDMA 设置是否正确、因为 SSI 以8位字大小运行。 我尝试短暂地关闭了 USEBURST、但这似乎使事情变得更糟。
请注意、在大多数情况下、我可以让 Flash 存储器读取工作、但有时会被一个32位字移位-所有正确的数据都会出现、但传输过程中有一个字太晚了。 如上所述、这个特定的错误报告发生在闪存存储器写入操作期间。 我已经使用逻辑分析仪确认、当数据写入外部闪存芯片时、线缆上的数据损坏。 因此、当我读回损坏的数据时、它确实与线路上实际发送的数据相匹配。
除了寻求一般性帮助、基于上述问题、我还想知道是否有某种方法可以清除或复位我缺失的 UDMA 外设。 这似乎特别重要、因为访问外部 SPI 闪存涉及单字节命令、地址字节和有望更大的 UDMA 缓冲器传输的混合。





