SPI可以安全中断吗?

电器工程 嵌入式 spi 中断 微信
2022-01-12 22:59:35

我正在从我的固件中写入microSD卡,但这是优先级最低的任务,因此在读/写过程中它可能会被其他任务中断。

现在假设我使用 UART 与这张 microSD 卡进行通信。读取过程中的问题是硬件 RX FIFO会溢出,所以我可以努力的最大延迟是(FIFO 大小 × 字节/秒),而在写入过程中不会有问题,因为另一端只会等到我发送下一个字符。

现在我正在使用 SPI,这是如何工作的?情况是否相同,对于写入无关紧要,对于读取它取决于 SPI FIFO 大小?

2个回答

绝大多数 SPI 设备在低于指定最大值的任何数据速率下都非常满意。一个人可以执行交易的一部分,在任何时候休息一下,几年后回来,然后完成它。如果时钟、选择或电源线上没有故障,则事务将正常完成。

需要注意三个主要警告:

  1. 通常,一旦 SPI 总线上的事务开始,在事务完成之前,总线上的任何线都不能用于任何其他目的。一般来说,这意味着一个中断可能不使用 SPI 总线,除非它是唯一使用总线的东西(有时中断可能会独占使用总线,而主程序在其他时间专用)。一些设备包含特殊引脚,让它们在事务处理过程中“忽略”总线,但即使有这样的功能,我也不建议尝试让中断挂起与一个设备的 SPI 事务,与其他一些设备执行事务,然后让底层代码恢复与第一个的事务。最好让中断使用单独的 SPI 总线。
  2. 如果交易持续时间过长,某些设备可能会出现异常行为。例如,一些实时时钟芯片不会对时间/日期寄存器进行双重缓冲,而是锁存事务期间可能发生的任何“时间提前”事件,并在事务完成后应用它们。如果事务花费的时间太长以至于第二个时间提前事件到达,则后一个事件将被忽略,导致时钟滑动该时间量。我真的看不出以这种方式设计芯片的任何借口(即使一个人不想要双缓冲数据的成本,指定软件负责确保其一致性比添加“更新延迟”逻辑更便宜,并且会最大限度地减少时钟干扰的可能性),但存在这样的芯片。
  3. 有一些设备使用时钟和数据信号,但使用“暂停”来表示帧。我遇到的最新示例是每个灯泡的控制器 LED 灯串。我不是特别喜欢这样的设计(也可以使用数据线上的三个连续上升沿来指示帧,而没有任何干预时钟),但同样,这样的设备确实存在。

虽然某些类型的通信需要使用特定的时序,但 SPI 设备很少有任何理由需要它们。尽管如此,人们必须注意此类设备的存在。

检查规范的副本(由于版权/ NDA 的原因我不能引用)SPI 速率从 0Hz 开始指定,这意味着静态操作很好。在 SPI 下,您只能在设备计时时取回数据,因此如果使用硬件 SPI,您只会在发送数据(即使 0 / 不关心)后收到一些东西。因此,在这方面,它与 UART 不同,您可以随时接收未经请求的数据。