总线基础--SPI总线

欢迎转载,转载请注明出处。

前言

SPI(Serial Peripheral Interface)串行外设接口的缩写。是由Motorola 公司推出的一种同步串行接口技术,SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的, 它允许 MCU 以全双工的同步串行方式, 与各种外围设备进行高速数据通信.

SPI

SPI总线由基本的四根线组成,一条时钟线SCK,一条主机输出从机输入线MOSI(master output slave input),一条主机输出从机输出线MISO和一条信号线,有的SPI芯片还会添加写保护(Write Protect)和信号保持(Hold)引脚,感兴趣的可以自己找一份SPI芯片的数据手册,去了解这两个引脚的作用,这里就不做介绍。

  • 全双工
    关于全双工的概念,上一篇文章已经做了介绍,SPI有两条数据线MOSI和MISO,可以同时接收和发送串行数据,所以SPI是一种全双工串行接口。

  • 同步
    关于同步和异步、串行和并行很多人分不清概念;串行和并行我在前面也做了介绍,简单的说就是串行数据是一位一位的传输,并行一次可以传输一个或多个字节。很多人会把同步理解成“一起/共同”,认为同步就是一起传输,异步就是分开传输。其实这种理解是有偏差的,同步指按照一定的步骤,有规律,有节奏的执行;执行过程之间有一定的逻辑关系,比如当前执行的过程依赖于上一过程的结果,只有当前一步操作结束后,当前过程才能执行,那这两个过程就可以称作是同步的;相反的,异步指两个过程之间没有什么依赖性,就算上一过程没有执行结束,只要有需要,当前过程也可以执行。举个例子:比如工作和聊天,如果工作和聊天存在依赖关系,即只有工作结束后才能聊天,否则就一直工作,那么这两个过程就可以称作是同步的;但是如果是工作累了,去聊会天休息一下,或者正聊着天,突然被领导发现了,赶紧回来工作,那么就可认为这两个过程是异步的。
    注意:这里千万不要把异步理解为多进程/多线程,同步和异步只是一种传输或工作方式,多进程/多线程也可以有同步和异步两种工作方式。
    SPI的两条数据线MOSI/MISO,都由同一条信号线控制,控制传输时序,所以SPI是同步通讯。

  • 多主从
    SPI支持多主从结构,但同一时刻只能有一个主机工作,因为数据的传输时钟信号只能由主机产生(从机的信号线SCK,是与主机的信号线连在一起的);前面I2C总线,主机是通过从设备的地址信息来找到需要通信的从设备,那么SPI总线是不是也通过这种方式来区别从设备呢?答案是否定的,前面说到SPI由基本的四条线组成,有一条叫片选线(CS),主机选择与某个SPI设备通信时,会先发出片选信号(把CS信号线置为高/低电平,具体看从设备要求),选择从设备,从设备被选中后就开始工作。

  • 数据交换
    这里说的是数据交换,而不是数据传输,因为SPI协议规定,SPI设备不能只做“接收者”或“发送者”,每个时钟周期都会发送并且接收1位数据,这些通过移位寄存器完成,如下图:主机和从机各有一个移位寄存器,且链接形成了一个环状(通过MOSI/MISO),伴随着时钟脉冲,数据从高位到地位,依次移出主机寄存器和从机寄存器,并且移入从机寄存器和主机寄存器,当寄存器中数据全部移出后,就完成了主机和从机间的数据交换。这里SPI有个缺点就是不像I2C一样有应答机制,无法判断是否接收到数据。

移位寄存器

四种工作模式

SPI总线有四种工作方式,由时钟极性(CPOL)和时钟相位(CPHA)决定。
CPOL:时钟极性,决定SPI总线空闲时的时钟状态;CPOL = 0,表示时钟空闲时为低电平;CPOL = 1,表示时钟空闲时为高电平。
CPHA:时钟相位,决定数据在时钟的第几个跳变沿被采样;CPHA = 0,表示在时钟的第一个跳变沿(上升沿或下降沿)数据被采样;CPHA = 1,表示在时钟的第二个跳变沿被采样。

注意:这里很多人对时钟相位(CPHA)有误解,认为“ *CPHA = 1时, SPI 设备在时钟信号下降沿时触发数据采样, 在上升沿时发送数据. 当 CPHA = 0 时也正好相反.”*,这个理解显然是错的,CPHA并不能决定数据在上升沿还是下降沿采样。

我们来看下面这幅图,当CPHA = 0时,数据采样发生在时钟的第一个跳变沿;当CPHA = 1时,数据采样发生在第二个时钟跳变沿。但我们可以注意到,在CPOL取值不同时,时钟的第一个跳变沿和第二个跳变沿是不一样的(CPOL = 0,第一个跳变沿为低电平到高电平,即上升沿;CPOL = 1,第一个跳变沿为下降沿),所以数据采样发生在上升沿还是下降沿应该是CPHA和CPOL共同决定的结果

SPI时序图

为了更清楚的理解SPI总线的四种工作方式,我从S3C2440数据手册截取了四幅图,来比较一下区别。
忽略MSB和LSB的区别,可以看到图1中,总线空闲时SPICLK为低电平,在时钟的第一个跳变沿(上升沿)数据被采样。
model1

与图1相比,图2中,总线空闲状态没变(因为CPOL相同),但采样时间变了,图2中,在时钟的第二个跳变沿(下降沿)数据被采样,采样边沿也由图1中的上升沿变为下降沿,但这并不能说明 CPHA可以完全控制边沿触发信号。
model2

图3与图1的区别在于总线空闲时,时钟信号为高电平,数据也是在第一个跳变沿(下降沿)被采样(CPHA = 0),虽然图1和图3的时钟相位(CPHA)相同,但采样边沿却相反,这进一步证明将CPHA理解为控制采样边沿方式是不对的。
model3

同样的道理,对比图3和图4,我们可以进一步的理解,采样边沿是由CPOL和CPHA共同作用的结果。
model4

这里值得一提的是,主机的工作模式得参考从设备来决定,因为主设备的MOSI和从设备的MISO口相连,从设备的MOSI口和主设备的MISO口相连,所以主设备的时钟配置和从设备的时钟配置应该是相反的。我们在配置时钟的极性时,一定要弄清楚从设备是在上升沿还是下降沿接收数据,是在上升沿还是下降沿发送数据。例如Sychip Wlan8100 Module Spec 上规定:主设备在时钟的下降沿发送数据,从设备在时钟的上升沿接收数据。因此主设备这边 SPI 时钟极性应该配置为下降沿有效。在 LCD Driver IC SSD1289中也规定:从设备 SSD1289 在时钟的上升沿接收数据,而且是按照从高位到低位的顺序接收数据的。因此主设备的 SPI 时钟极性同样应该配置为下降沿有效。
只有在时钟极性和时钟相位配置正确后,数据才能准确的在主从设备间传递,因此配置时钟时,要参照从设备的接口时序或相关数据手册来配置主设备的时钟(因为从设备的时钟信号由主设备提供)。

总结

到此SPI总线的相关介绍就结束了,尽管SPI总线需要占用主机较多的口线(每个从机都需要一根CS线),而且无应答信号;但因为其支持全双工,操作简单,传输效率高等优点,被很多厂商青睐。关于SPI总线的介绍就到这里,下一篇将介绍功能强大的UART。