我使用 ADS1220的时间很长、并且面临一种非常奇怪的行为。
- 将 ADC 设置为连续模式
- 在下降沿、DRDY 中断触发 DMA SPI 传输、以同时发送命令和接收数据。 在 DMA 传输完成时、我调用我的处理程序
这种方法在相当长一段时间内有效、没有发现问题。 将某些 DMA 完成处理移至基于计时器的处理程序后、情况变得不好。 我观察到数据保持稳定了一秒钟、然后就一去不复返了。 在某些情况下、它在中间稳定、而在其他测试中则不稳定。 测试后、我认为调试器被确定为问题的根源。 由于它可能会停止时钟、这可能会导致 SPI 通信超时。 因此、我断开了调试器、并通过 CAN 总线传输了样本并对其进行了记录。 在13小时内、我读取了大约500万个样本、这些样本都很好。
第二天、如果没有发生任何变化、通信就不会保持稳定、甚至长达10秒。 在多次尝试修复后、我发现切换到温度测量和返回生成的数据很可能开始干草。 当让 ADC 仅在 T 或输入模式下运行时、数据读数正常。
现在、我将 ADC 重新配置为单次模式并逐个读取样本、传输 DMA 已被移除、而 SPI 控制器中的4字节传输队列更是如此。 仍然使用 DMA 完成接收。 现在可以观察到、字节对齐会混淆。 初始化后、第一次读数正确。 连同读出(在 DRDY 处于低电平时、不使用 RDATA 命令时基于中断)一起发送到零字节和一个 START/SYNC 命令。
在下一个中断时、在 DMA 设置之前清除 SPI FIFO、我得到 MSB 之前添加的一个字节。 在下一个传输中、我先将 LSB 移出、然后是0xFF、而不是 MSB。 在这个机制之后、预期结果被旋转24位。
我无法确认 SCLK 线路上的瞬态、尤其是这会很奇怪、因为为什么要始终有8个加边沿来移位数据? 在 DMA 传输3个字节后、SPI 接收器报告为空。