[电路]SPI协议

SPI协议层,物理层,时钟配置,多主机模式,优缺点

SPI协议层

协议简介

  • SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。
  • SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
  • SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议
  • SPI是一个同步的数据总线,也就是说它是用 单独的数据线 和一个 单独的时钟信号 来保证 发送端和接收端的完美同步
  • 时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样
  • 产生时钟的一侧称为 主机 ,另一侧称为 从机 。总是 只有一个主机 (一般来说可以是微控制器/MCU),但是可以有 多个从机 (后面详细介绍);
  • 数据的采集时机可能是 时钟信号上升沿 (从低到高)或 下降沿 (从高到低)。

传输过程

  • 整体的传输大概可以分为以下几个过程:
  1. 主机先将NSS信号拉低,这样保证开始接收数据;
  2. 当接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1bit);
  3. 主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;
  4. 主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送;
  • 这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据,也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。

SPI物理层

SPI总线命名规则

  • SPI总线包括4条逻辑线,定义如下:
  1. MISO:Master input slave output 主机输入,从机输出(数据来自从机);
  2. MOSI:Master output slave input 主机输出,从机输入(数据来自主机);
  3. SCLK :Serial Clock 串行时钟信号,由主机产生发送给从机;
  4. SS:Slave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。
  • 他制造商可能会遵循其他命名规则,但是最终他们指的相同的含义。以下是一些常用术语
  1. MISO也可以是SIMODOUTDOSDOSO(在主机端);
  2. MOSI也可以是SOMIDINDISDISI(在主机端);
  3. SS也可以是CECSSSEL;
  4. SCLK也可以是SCK;

单主单从硬件拓扑

  • 下图显示了单个主机和单个从机之间的典型SPI连接。
  • 由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。
  • 要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。

SPI时钟参数

时钟频率

  • SPI总线上的主机必须在通信开始时候配置并生成相应的时钟信号。在每个SPI时钟周期内,都会发生全双工数据传输。
  • 主机在MOSI线上发送一位数据,从机读取它,而从机在MISO线上发送一位数据,主机读取它。
  • 就算只进行单向的数据传输,也要保持这样的顺序。这就意味着无论接收任何数据,必须实际发送一些东西!在这种情况下,我们称其为虚拟数据;
  • 从理论上讲,只要实际可行,时钟速率就可以是您想要的任何速率,当然这个速率受限于每个系统能提供多大的系统时钟频率,以及最大的SPI传输速率。

时钟极性(CKP/Clock Polarity)

  • 除了配置串行时钟速率(频率)外,SPI主设备还需要配置时钟极性。
  • 根据硬件制造商的命名规则不同,时钟极性通常写为CKP或CPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据;
  • CKP可以配置为1或0。这意味着您可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。您必须参考设备的数据手册才能正确设置CKP和CKE。

CKP = 0:时钟空闲IDLE为低电平 0
CKP = 1:时钟空闲IDLE为高电平 1

时钟相位 CKE /Clock Phase (Edge)

  • 除配置串行时钟速率和极性外,SPI主设备还应配置时钟相位(或边沿)。根据硬件制造商的不同,时钟相位通常写为CKE或CPHA;
  • 顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;

CKE = 0:在时钟信号SCK的第一个跳变沿采样;
CKE = 1:在时钟信号SCK的第二个跳变沿采样;

时钟配置总结

  • 综上几种情况,下图总结了所有时钟配置组合,并突出显示了实际采样数据的时刻;

时钟模式编号

  • SPI的时钟极性和相位的配置通常称为 SPI模式,所有可能的模式都遵循以下约定;具体如下表所示;
SPI Mode CPOL CPHA
0[00] 0 0
1[01] 0 1
2[10] 1 0
3[11] 1 1

多主机模式

  • SPI总线必须有一个主机,但可以有多个从机,具体的多主机连接方式有定义NSS和菊花链两种。

多NSS

  • 通常,每个从机都需要一条单独的SS线。
  • 如果要和特定的从机进行通讯,可以将相应的NSS信号线拉低,并保持其他NSS信号线的状态为高电平;如果同时将两个NSS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码。
  • 具体的连接方式如下图所示:

菊花链

  • 在数字通信世界中,在设备信号(总线信号或中断信号)以串行的方式从一 个设备依次传到下一个设备,不断循环直到数据到达目标设备的方式被称为菊花链。
  • 菊花链的最大缺点是因为是信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;
  • 另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;
  • 具体的连接方式如下图所示:
  • 最终的数据流向图可以表示为:

SCK为时钟信号,8clks表示8个边沿信号;其中D为数据,X为无效数据;

SPI通信优缺点

SPI通讯的优势

  1. 全双工串行通信;
  2. 高速数据传输速率。
  3. 简单的软件配置;
  4. 极其灵活的数据传输,不限于8位,它可以是任意大小的字;
  5. 非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

SPI通讯的不足

  1. 没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
  2. 通常仅支持一个主设备;
  3. 需要更多的引脚(与I2C不同);
  4. 没有定义硬件级别的错误检查协议;
  5. 与RS-232和CAN总线相比,只能支持__非常短__的距离;
  6. 使用标准 SPI 只能实现 0.5 米的通信距离,若必须需要进行远距离传输,可考虑使用接口转换芯片实现较长距离的传输(如TI的ADS8910BEVM,通过 LVDS 接口传输 SPI 信号,可将距离延长至3M)。