SPI是一个简单的串行通信接口,最初由摩托罗拉在1980年代开发,可在几英尺的短距离内使用。 [一世] SPI可以提高到几Mbps,具有足够的灵活性以很少的开销在全双工中流传输原始数据,并且使用起来也非常灵活。 SPI支持标准同步协议,但未指定特定协议。 SPI用于同步数据。 (“异步”数据不使用时钟来同步发送和接收的消息;它以不同的方法进行同步。)SPI可以与许多设备接口,包括未指定为支持SPI的外设。一个缺点是,由于SPI不使用寻址,因此SPI往往比其他通信接口需要更多的引脚(和电线)。
SPI使用主从设置。 SPI主设备通常作为功能集成在微控制器(MCU)中。 SPI主设备控制时钟(CLK),该时钟用于与从SPI设备同步通信。所有数据移动均由时钟协调。
与单个从设备通信的基本SPI主设备只能使用3条线工作:一条时钟,一条通信线和一条从选择线。如果有3线,则一条通信线正在发送或接收。也就是说,它是半双工的。可以在那条(双向)通信线上进行通信的任何方向,但不能同时进行(您要在这条汽车宽度桥上来回行驶)。但是,最少具有4条线的SPI接口可以支持全双工(两条车道的高速公路),这将需要一条时钟线,两条单向通信线和一条从选择线。
从站选择线如何工作? SPI主机具有一个或多个从机的引脚。如果有多个,则所有从站都在监听相同的时钟信号和相同的通信线路。需要一个额外的引脚,称为从选择(SS_n)引脚 每 奴隶;这样主机可以选择要与之通信的从机。 SPI从设备不会轮询总线。主机启动数据传输。 (市场上的某些SPI是“多主设备”,其中每个主SPI在启动数据传输之前必须侦听SS线以查看其是否空闲,但这会变得很复杂。)尤其是在多个从设备中,SS线路应具有上拉电阻。主机在进行通信时会将SS线拉低,否则,浮动引脚可能会导致未选择的设备“听到”不适合它们的通信。

基本的4线SPI主机中的另外两条线用于发送和接收数据:MOSI(主机输出从机输入)线用于主机与从机进行通信,另一条线是MISO(主机输入从机输出),从从机向主机传送消息。两条线路同时工作,从而允许双向同时通信(全双工)。
SPI没有寻址方案(例如使用I2C)。 SPI有多种变体,有些SPI芯片具有多条MISO和MOSI(I / O)线,所有这些线都由一个时钟控制,但允许更大的吞吐量。操作相当简单。当主机要讲话或收听Slave_1时,SPI主机将SS_1引脚拉为低电平(称为“低电平有效”),并且Slave_1开始与共享时钟线同步向主机发送或接收。所有其他奴隶被忽略。
如果有一个主机和一个从机,则SPI高效且易于设置。 SPI具有3个寄存器:控制寄存器(SPCR),状态寄存器(SPSR)和数据寄存器(SPDR)。 SPDR是读/写寄存器;要将数据发送到MOSI,请写入SPDR。要接收在最后一个时钟周期中作为MISO放入SPDR中的数据,请读取SPDR。在仅执行单向通信的设置中,可能需要读取某些垃圾数据或将其写入SPDR以启动时钟。
其他提示:未选择SS时,测试SPI以确保MISO引脚正确断开连接。如图2所示,通过连接两个10K欧姆电阻来检查MISO。要测试一个良好的三态MISO,请禁用所有SPI芯片选择,如图2所示,在面包板上安装两个10Kohm电阻,然后用电压表测量MISO。如果选择确实关闭,则MISO信号应读取Vcc的一半。如果您看到逻辑高电平(通常取决于板子,通常为3.3V或5V),或者看到接近零伏的电压,则需要三态缓冲器(例如, 74AHC1G125),就像打开/关闭电流的阀门一样。三态缓冲器是具有三态输出的总线缓冲器门。

到目前为止,讨论主要是关于SPI的硬件陷阱。回想一下SPI没有设置协议。 SPI不会自动进行自我设置并开始与从设备通信。 SPI应用程序代码相当明确,许多开发板都以库的形式提供了SPI代码(例如Arduino。)图3展示了一段注释非常清楚的代码,用于使用Maxim Integrated公司David的SPI进行简单的单字节传输。炒。

[一世] Wikipedia//en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus