我正在努力让 SPI CRCERR 标志和 IRQ 以我期望的方式工作。
我正在使用
STM32WB55。
全双工 SPI
通信正常。主机将 CRC 添加到 Tx 数据的末尾。在从机端,CRC 被读入。我可以看到 RXCRC 更新,我可以看到它在读取最后一个 CRC 字节时变为 0x00,这告诉我 CRC 计算正在工作。但是,当我故意使 CRC 不匹配时(在主从上使用不同的多项式来触发不匹配),我无法打开 CRCERR 标志。
我怀疑问题与 DMA 传输大小有关。我已经阅读了关于使用什么传输长度的建议(Tx 端 = 没有 CRC 的数据长度;Rx 端 = 有 CRC 的数据长度),并且我尝试了各种组合。我怀疑从 SPI 不知道传输已完成,所以它不做最后的比较并设置错误位。
所以,一些实际的问题:
- 我是否应该期望 CRCERR 标志在 L4 和 WB55 等处理器上与 SPI + DMA 一起工作?
- SPI 外设如何知道何时对 Rx 进行 CRC 比较?是基于DMA Rx传输请求的长度吗?还是我的心理模型不正确?
- 如果我想接收 20 个字节的数据 + 1 个字节的 CRC,我知道我将 Tx 设置为 20 个字节(这有效,因为我看到 20 个字节 + 1 个字节的 CRC 自动附加在末尾)。我应该在 Rx 端做什么?我要它 21 个字节。我还尝试通过 DMA 请求 20 个字节,然后“手动”清除 CRC 的 SPI->DR 寄存器。这些组合似乎都不会导致设置 CRCERR 标志。