SPI安全被打断吗?


17

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

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

现在我正在使用SPI怎么工作?这种情况是否与写入无关紧要,而对于读取却取决于SPI FIFO大小?

Answers:


22

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

需要注意三个主要警告:

  1. 通常,一旦事务在SPI总线上开始,在该事务完成之前,总线上的任何导线都不能用于任何其他目的。通常,这意味着除非唯一使用中断的中断,否则中断可能不使用SPI总线(中断有时可能专用于总线,而对于主中断程序在其他时间专用)。有些设备包含特殊的引脚,以使它们在事务处理过程中可以“忽略”总线,但是即使具有这些功能,我也不建议尝试通过中断来中断与某设备的SPI事务,与其他设备进行事务,然后让基础代码恢复与第一个代码的事务。最好让中断使用单独的SPI总线。
  2. 如果事务处理时间过长,某些设备的行为可能会很奇怪。例如,某些实时时钟芯片不对时间/日期寄存器进行双缓冲,而是锁存在事务处理期间发生的任何“时间提前”事件,并在事务处理完成后应用它们。如果事务处理时间太长,以至于第二个时间超前事件到达,则后一个事件将被忽略,从而使时钟延迟该时间量。我真的没有理由以这种方式设计芯片(即使不希望花双倍缓冲数据的费用,指定由软件来确保其一致性要比添加“更新延迟”逻辑便宜),并将时钟干扰的可能性降到最低),但是这种芯片存在。
  3. 有一些设备使用时钟和数据信号,但使用“暂停”来表示成帧。我遇到的最新示例是每个灯泡的LED灯串。我并不特别喜欢这种设计(一种设计也可以使用数据线上的三个连续上升沿来指示帧,而无需任何中间时钟),但是,确实存在这样的设备。

尽管某些类型的通信需要使用特定的时序,但几乎没有任何理由要求SPI设备要求它们。但是,必须注意这种设备的存在。


3
+1好!完全同意您的所有意见/挫败感。也看到了太多次了。
DrFriedParts

11

检查该规范的副本(出于版权/ NDA原因,我无法引用该规范)的SPI速率指定为0Hz开始,这意味着可以进行静态操作。在SPI下,您仅在设备处于时钟状态时才取回数据,因此,如果使用硬件SPI,则仅在发送数据(即使0 /无关)后才接收到数据。因此,就此而言,它与UART不同,在UART中,您可以随时接收未经请求的数据。


因此,我唯一担心的应该是MicroSD卡具有某种超时内置功能,而不是SPI本身?
Muis

5
从所有我可以看到的规格来看,SD卡也不应该有任何形式的超时,因此不要真的看到您应该有任何问题。多年前,我编写了一些自定义代码,而调试只是一步一步地执行代码,因此在SPI操作之间间隔了10秒或更长时间,一切都很好。
PeterJ

1
+1,能够以低至0 Hz的频率运行SPI对于调试非常有用。谢谢。
Anindo Ghosh

1
值得一提的是,在某些SPI器件上,数据输出只能在特定的时钟沿改变,而在另一些SPI器件上,数据输出有时可能会异步改变。对于“繁忙”位尤其如此。在某些芯片上,如果某个时钟输出了“忙”位的状态,并且当该部件变得不忙时它仍在输出上,则输出将异步更改。在其他一些芯片上,所报告的“繁忙”状态只有在重新计时后才会改变。两种设计都有优点和缺点,因此了解两种类型的设计都将很有用。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.