我的应用正在与 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个字节的倍数。
无论我重复该命令多少次、在系统复位后、读取 SPI 闪存都能完美地工作。 由于这些命令涉及到在命令和地址的直接 SSI 访问与数据的 UDMA 之间交替、因此我的代码似乎被正确写入。 但是、如果我写入 SPI 闪存(仅使用直接访问、无 UDMA)、则从 SPI 闪存读取的下一个 UDMA 会受到以下问题的影响:在开始时接收到一个额外的字、然后是预期的数据、一个字太晚。 通过逻辑分析仪查看实际的引脚、可以明显看出 SPI 闪存芯片在正确的时间发送正确的数据、但 UDMA 正在提供额外的字。 一旦系统进入此状态、在每次新传输开始时、重复 UDMA 读取总是会有该额外的字。
除了寻求一般性帮助、基于上述问题、我还想知道是否有某种方法可以清除或复位我缺失的 UDMA 外设。 由于有一个来自 UDMA 的额外字、我最初怀疑我的写代码在 SSI FIFO 中留下了未读数据、但由于我清空了 FIFO、这似乎是不可能的。
相关说明:在启动 UDMA 之前、在 SSI 外设不忙之前循环是否足够? 或者、我是否还需要检查 FIFO 是否为空?