目录

先说串口

SPI通讯协议

 SPI特性:

 时钟频率

 时钟配置总结

多从机模式

 第一种方法:多NSS

 第二种方法:菊花链

SPI的优缺点

 优点:

 缺点

先说串口

因为UART没有时钟信号,无法控制何时发送数据,也无法保证双方按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。

如果要解决这个问题,UART为每一个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步;

双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600)

传输速率如果有微小差异不是问题,因为接收器会在每个字节的开头重新同步。相应的协议如下图所示:

 如果你注意到上图中的11001010不等于0x53,这是一个细节,串口协议通常会先发送最低有效位,因此最小位在最左边LSB。低四位字节实际上是0011 = 0x3,高四位字节是0101 = 0X5.

异步串行工作得很好,但是在每个字节发送得时候需要额外的起始位和停止位以及在发送和接收数据所需的复杂硬件方面都有很多开销。

不难发现,如果接收端和发送端设置的速度不一样,那么接收到的数据将是垃圾(乱码)。

下面开始讲SPI协议

SPI通讯协议

针对于上面提出的问题,我么想有没有更好的串行通讯方式;相比较于UART,SPI的工作方式略有不同。

SPI是一个同步的数据总线,也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和接收端的完美同步。

时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样。

产生时钟的一侧称为主机, 另一侧称为从机。总是只有一个主机(一般来说可以是微控制器MCU),但是可以有多个从机

数据的采集时机可能是时钟信号的上升沿(从低到高)或者下降沿(从高到低)。具体要看SPI的配置

整体的传输大概可以分为以下几个过程:

  • 主机先将NSS信号拉低,这样保证开始接收和发送数据
  • 当接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(bit)
  • 主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位的将从MOSI信号线上进行发送到从机
  • 主机接收从机发送的数据:如果从机需要将数据发送会主机,则主机将继续生成预定数量的时钟信号,并且从机将会通过MISO信号线发送

具体如下图示;

 注意:SPI是全双工(具有单独的发送和接收线路,I2C是半双工),因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。这比异步通信所需的完整的UART要简单得多,并且更加便宜

 SPI特性:

SPI总线包括4条逻辑线,定义如下:

  • MISO:Master input slave output主机输入,从机输出(数据来自从机)
  • MOSI:Master output slave input主机输出,从机输入(数据来自主机)
  • SCLK:Serial Clock串行时钟线,由主机产生发送给从机
  • SS:Slave Select片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号

不同的制造商,可能会遵循不同的命名规则,但是最终的含义都是一样的,以下是一些常用用语

  • MISO也可以是SOMI,DOUT,DO,SDO或SO(在主机端)
  • MOSI也可以是SIMO,DIN,DI或SDI、SI(在主机端)
  • NSS也可以是CE,CS或SSEL
  • SCLK也可以是SCK

下图显示了单个主机和单个从机之间的典型SPI连接

 时钟频率

SPI总线上的主机必须在通信开始时候配置并生成相应的时钟信号,在每个SPI时钟周期内,都会发生全双工数据传输

主机在MOSI线上发送一位数据,从机读取它,而从机在MISO线上发送一位数据,主机读取它

就算只进行单向的数据传输,也要保持这样的顺序。这就意味着无论接收任何数据,必须实际发送一些东西,这种情况下,我们称之为虚拟数据。(PS:没有纯粹的接收数据,比如主机接收数据,但是时钟是主机来产生的,必须发送数据才会产生时钟,所以就算只是接收数据也必须要主机发送一些数据,产生时钟)

从理论上讲,只有实际可行,时钟速率就可以是你想要的任何速率,当然这个速率受限于每个系统能提供的系统时钟频率,以及最大的SPI传输速率

时钟极性CKP/Clock Polarity

除了配置串行时钟速率之外,SPI主设备还需要配置时钟极性。

根据硬件制造商的不同,时钟极性通常写为CKP或CPOL。时钟极性和相位共同决定读取数据的方式,比如上升沿读取数据还是信号下降沿读取数据;

CKP可以配置为1或者0.这意味着你可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。你必须参考设备的数据手册才能正确配置CKP和CKE。

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

时钟配置总结

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

其中黑色线为采样数据的时刻

蓝色线为SCK时钟信号

具体如下图所示;

模式编号

SPI的时钟极性和相位的配置通常称为SPI模式,所有可能的模式都遵循以下约定;具体如下表所示;

SPI Mode                CPOL         CPHA
0 0 0
1 0 1
2 1 0
3 1 1

除此之外,我们还应该仔细检查微控制器的数据手册中包含的模式表,以确保一切正常。

多从机模式

前面说到的SPI总线必须有一个主机,可以有多个从机,那么具体连接到SPI总线的方法有以下两种

第一种方法:多NSS

1、通常,每个从机都需要一条单独的SS线

2、如果要和特定的从机进行通讯,可以将相应的NSS信号线拉低,并保持其他NSS信号线的状态为高电平;如果同时将两个NSS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码。

具体连接方式如下图所示:

 第二种方法:菊花链

 在数字通信世界中,在设备信号(总线信号或中断信号)以串行的方式从一个设备依次传到下一个设备,不断循环直到数据到达目标设备的方式被称为菊花链。

1、菊花链最大的缺点是因为信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了。

2、另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;

具体的连接如下图所示:

其中红线加粗的为数据的流向;

所以最终的数据流向图可以表示为:

SCK为时钟

信号,8clks表示8个边沿信号;

其中D为数据,X为无效数据

所以不难发现,菊花链模式充分使用了SPI其移位寄存器的功能,整个链充当通信移位寄存器,每个从机在下一个时钟周期将输入数据复制到输出。

SPI的优缺点

 优点:

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

缺点

  • 没有硬件从机应答信号(主机可能在不知情的情况下无处发送)
  • 通常仅支持一个主设备
  • 需要更多的引脚(与I2C不同)
  • 没有定义硬件级别的错误检查协议
  • 与RS-232和CAN总线相比,只能支持非常短的距离