SPI

 SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(用于单向传输时,也就是半双工方式)。也是所有基于SPI的设备共有的,它们是:


    • MOSI – SPI 总线主机输出/从机输入(SPI Bus Master Output/Slave Input)
    • MISO – SPI 总线主机输入/从机输出(SPI Bus Master Input/Slave Output)
    • SCLK – 时钟信号,由主设备产生
    • CS – 从设备使能信号,由主设备控制(Chip select),有的芯片这个引脚叫做SS。


        其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个SPI设备成为可能。

        接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,MOSI,MISO则基于此脉冲完成数据传输。数据输出通过MOSI线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

要注意的是,SCLK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCLK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCLK时钟线的控制可以完成对通讯的控制。

SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。

在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号。

1. SPI BUS构架

SPI核心层是SPI BUS。针对每个平台,SPI BUS Core的功能需要底层的SPI BUS Driver来支撑,即SPI BUS Driver是与底层硬件最接近的一层,它会完全根据芯片手册规范操作SPI的寄存器,时钟输出,片选信号等。

如果SPI BUS是作为Master模式来使用,那么在每个SPI BUS上有一层虚拟的接口层:SPI Device(每个CS会有一个SPI Device与它相对应)。SPI上具体挂接的设备由相应的驱动程序进行驱动,它们与SPI BUS相接口的是SPI Device,所以SPI Device也可以看成是SPI BUS的接口层。

如果SPI BUS是作为Slave模式来使用,则此时SPI BUS上只有一个设备(这个设备也同样称之为SPI device,在这个设备上是否形成多通道逻辑设备由上层驱动考虑)。


其中,SPI BUS Core、SPI BUS Drv与SPI Master模式中的代码完全通用,不需要底层再提供相应的代码。