SPI 揭秘:了解基础知识和其他

SPI 揭秘:了解基础知识和其他

简介

       串行外设接口是微控制器与外设(比如SRAM,SD卡,移位寄存器,传感器等)通信的最主要的协议之一。它是一种同步的,全双工,基于主从的协议。比如,如果SPI的时钟是36MHz,传输速度将是36Mbps。因此,SPI协议的传输速度没有限制。这完全取决于设备支持的速率。SPI的接口是4线:

l  主出从入(MOSI)

l  主入从出(MISO)

l  时钟(SCLK)

l  从选择~SS

SPI 接口

 

image

 

图1 SPI接口

 

       MOSI和MISO是传输数据的主要线路。SCLK是主控产生的对总线上数据采样的时钟信号。~SS是低有效的信号线,用来选择从设备。

       使用SPI连接设备简单直接。连接主从设备相同名称的引脚即可,不会弄错。

SPI数据传输

       如前所述,SPI是一种全双工协议,这就意味着主从设备可以利用各自的MOSI和MISO线同时收发数据。SPI的优点之一就是不需要启动位和停止位,因为总线上的SCLK同步数据。SCLK同步数据线上的位的移位和采样,本文后续将详细阐述.

       关于可传输的数据位数,SPI协议支持的字长范围是3~16位,标准是8位。如何主从设备想一次传输2个字节,可以选择16位的字长(微控制器支持)或用2个8位的数据包打包传送。

       SPI支持多个从设备连接。每个从设备,有一条独立的~SS线。数据交换只在主机和被选中的从机之间发生;没被选中的从机处于休眠状态,不使用MOSI和MISO线。图2显示的是多个从设备的连接方式。

 

image

 

图2 通过SPI总线,多个从设备连接到主设备

 

       SPI也并不是完美的,因为用到的~SS线就是数字IO引脚,因此,可以连接的从机数量受到微控制器的IO口的限制。

为何要使用带有SPI的时钟

       你可能会问:如果串行协议可以异步工作,为何会引入时钟?如何你看过前面的UART指南,就会发现通过UART通信的设备没有一个公共的时钟来同步数据传输。通信设备依靠其内部的时钟采样数据。因此,时钟必须精准,否则将收到垃圾数据。另外,需要额外的位来标记数据帧的开始和结束,这也会造成额外的开销。但在SPI里,不需要标记数据帧的开始和结束,它在时钟的上升沿或下降沿同步数据。接下来,我们看看SPI是如何实现这一点的。

       在继续探索前,需要了解两个重要的名词“

SPI的时钟模式CPOL和CPHA

 

image

 

图3.1 数据采样和移位的四种模式

 

 

image

 

表1 采样和移位的时钟模式

 

1.     SPI模式0-CPOL:0,CPHA:0

 

image

 

图3.2 SPI模式0

 

在时钟上升沿数据采样,在时钟下降沿移位输出。这里,理想状态下,时钟的状态是低电平,没有数据传输时,时钟线是低电平。

2.     SPI模式1-CPOL:0,CPHA:1

 

image

 

图3.3 SPI模式1

 

       在时钟下降沿采样数据,在时钟上升沿移位输出。无数据传输时,时钟拉低。

3.     SPI模式2-CPOL:1,CPHA:0

 

image

 

图3.4 SPI模式2

 

       在时钟上升沿采样,在时钟下降沿移位输出,空闲时,时钟拉高。

4.     SPI模式3-CPOL:1,CPHA:1

 

image

 

图3.5 SPI模式3

 

       在时钟下降沿采样,上升沿移位输出。时钟空闲时拉高。

 

       嵌入式工程师必须要知道SPI时钟模式,从设备往往预设了其中一种模式。可在从设备的数据手册中找到它的预设模式。一旦我们确认了从机的操作模式,就可以配置主机为相应的模式,通过SPI总线通信。

 

SPI寄存器中数据接收和发送

       支持SPI的为控制器有一套专用的控制和数据寄存器。这些专用寄存器配置时钟模式,并在设备之间发送和接收数据。

       SPI遵循串进串出的方式,每发送一位就会收到新的一位。因此,在每个时钟脉冲,通过MOSI线主机发送1位数据给从机,同时,通过MISO线,从机发送数据给主机。

       数据的收发如下图所示。时钟模式控制设置为CPHA=0,CPOL=0:

  1. 数据存储在主从设备各自的SPI数据寄存器里。

 

image

 

  1. 要开始通信,主机发送时钟信号,并通过~SS选择要通信的从机。从机被SS线上的0信号中断,准备传送。主从设备的最低位在MOSI和MISO线上从寄存器移位输出。注意,~SS线一直保持低,直到所有数据传送完成。

 

image

 

 

  1. 主从设备都在SCLK上升沿(CPHA=1)对最低位采样,并存储在数据寄存器的最高位。

 

image

 

 

  1. 数据寄存器剩下的位依次在时钟下降沿移出,腾空最高位,新的最低位在数据线上传送。然后,在时钟上升沿采样,存储。

 

image

 

 

  1. 这个过程一直重复,直到数据寄存器的8位数据从主机传送到从机完成。因此,数据从主机一个字节一个字节的发送到从机,反之亦然。当数据传送完成,主机将~SS拉高,结束通信。

 

image

 

 

SPI中的菊花链方法

       在上面讨论的SPI配置中,从机需要单独的线与主机通信,当出现可用的引脚数量小于需要的数量时,菊花链方法可以解决这个问题。

 

SPI 接口

       在菊花链方式里,所有从机的~SS引脚连接到主机的同一个引脚。一个主机,2个从机的菊花链模式如下图所示。所有的从机与主机共用一条SCLK线,但其他引脚连接不同。

       主机的MOSI连接到从机的MOSI,从机1的MISO连接到从机2的MOSI,从机2的MISO又返回到主机的MISO。

 

image

 

图5 SPI菊花链连接

 

       类似的,如果有N个从机,都可以用菊花链串起来。

 

SPI数据传输

       要了解菊花链连接的数据传输,如图5所示,主机想把数据1和数据2分别发送给从机1和从机2.菊花链配置中的数据发送按以下方式进行:

  1. 初始化通信,主机将把~SS拉低,激活两个从机。

 

 

image

 

  1. 主机发送数据2给从机1,保存在数据1的缓存里。

 

image

 

 

  1. 根据标准SPI协议,在8个时钟周期后,从机1将把数据2通过MISO-MOSI发送给从机2,并从主机接收数据1.

 

image

 

 

  1. 一旦两个数据包都到达它们的目的地,从机2通过MISO-MISO通知主机。当收到响应字节,主机通过不使能SS线来结束通信。

 

image

 

 

       使用菊花链减少需要的引脚数量。但从机越多,传输越慢。在使用菊花链方法时,注意所有设备使用相同的时钟,并且空闲的时钟状态也很重要。

 

总结

       SPI通信协议非常适合SD卡,各种传感器,以及功能强大的工业调试工具。它具有高速,简单和低成本等优点,缺点就是比其他协议需要更多的引脚。

 

 

参考:https://www.circuitbread.com/tutorials/spi-demystified-understanding-the-basics-and-beyond

 

posted on 2025-11-26 15:37  yf.x  阅读(0)  评论(0)    收藏  举报

导航