SPI协议趣谈(一)

SPI协议是谁提出的?做什么用的?咳咳,竟然是摩托罗拉公司提出的,想想也有道理,摩托罗拉公司做ADC、LCD等设备与MCU通讯,怎么能缺少高速全双工的通信总线呢?一经提出版本不断更新,SPI协议全称值得我们铭记(Serial Peripheral Interface),“串行+外围设备+接口”,对于攻城狮来说,理解SPI协议的精髓竟然可以这样坦率。

想要对SPI协议了如指掌,就有必要谈谈SPI信号线和SPI模式了。

先谈谈SPI信号线。我们知道MCU肯定与多个SPI设备相连,此时此刻我们必然要分清楚哪个SPI设备有效,于是SPI总线必然有一根片选信号线(Slave Select)。以下图为例,可以看到MCU连接了三个SPI设备,独立的片选信号SS1,SS2,SS3谁是低电平决定了哪个设备可以开始SPI通讯!而SCK,MOSI,MISO这三个信号线则是被三个SPI设备共用了。这三个信号线何方神圣?有何本领?SCK是时钟信号线(Serial Clock),时钟频率有多快谁来决定?由主通讯设备决定,比如此图中就是由MCU决定的。MOSI是主机输出从机输入信号线( Master Output, Slave Input),很显然看名字就知道来龙去脉,数据从主机输出,由从机接收。MISO是主机输入从机输出信号线(Master Input, Slave Output),数据从从机输出,由主机接收。

现在谈一下SPI模式吧。为了让读者清晰,讲之前提醒一下,模式也是最终落实到刚才说的四个信号线上的,谈模式可不要忘记刚才的信号线哈!SPI模式由时钟极性(CPOL)和时钟相位(CPHA)配置的,2*2=4,意味着有四种模式。CPOL影响的就是刚才谈到的四根信号线之中的SCK信号线,CPOL=0时SCK=0;CPOL=1时SCK=1.这样够简单清楚把?简而言之就是CPOL的值决定了SPI通讯设备处于空闲状态时候SCK信号线是高电平还是低电平。CPHA更简单了,就是指是奇数边沿采样还是偶数边沿采样。谁采样?还是不要忘记刚才讲的那四个信号线,是其中的MOSI和MISO这两个信号线采样。CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的奇数边沿被采样。当CPHA=1时,数据线在SCK时钟线的偶数边沿采样。需要特别注意的是,使用SPI协议通信时,主机和从机的时序要保持一致,意味着主机和从机有一样的SPI模式。下面笔者以CPHA=0时讲一下SPI时序图。这很重要吗?编程可就是根据这个来敲代码啊!

主机把片选信号线SS拉低,即图中的SS(O),SS(I)时序,SS(O) 时序表示从机接收到SS片选被拉低的信号;SS(I)时序表示从机接收到SS片选被拉低的信号。可以从图上看到两个波形是一致的,说白了就是同一个信号线的两端的状态反应一样,时差小到看不出来。

无论CPOL=0还是=1,因为我们配置的时钟相位CPHA=0,因此采样时刻都是在SCK的奇数边沿。因此,MOSI和MISO数据线的有效信号在SCK的奇数边沿保持不变,这个信号将在SCK奇数边沿时被采集,在非采样时刻,MOSI和MISO的有效信号才发生切换。读者理解上面的图后可以理解CPHA=1时SPI时序图,如下图所示。

由于笔者做过STM32方面的用SPI来支持W5200网络芯片的读写操作,这样是为了使用DMA功能来提高网络通信的实时性能,所以笔者想简单探讨一下STM32的SPI特性。其中蓝色标注的特性是笔者在项目开发中最受益。

  1. 单次传输可选择为8或16位。
  2. 波特率预分频系数(最大为fPCLK/2) 。
  3. 时钟极性(CPOL)和相位(CPHA)可编程设置 。
  4. 数据顺序的传输顺序可进行编程选择,MSB在前或LSB 在前 。
  5. 可触发中断的专用发送和接收标志。
  6. 可以使用DMA进行数据传输操作。

下面我们看一下STM32的SPI架构图吧

当我们需要从外设接收数据时,MISO数据线接收到的信号经移位寄存器处理后,把数据转移到接收缓冲区,然后我们编程序从接收缓冲区变量中读出。 当我们要发送数据给外设时,我们先把数据写入到发送缓冲区变量中,硬件会把它用移位寄存器处理后输出到MOSI数据线。对于SCK时钟信号,我们通过图中的波特率控制位(BR)来控制它输出的波特率。控制寄存器CR1掌管主控制电路,STM32的SPI模块的协议设置(也就是我们上面讲到的SPI模式:时钟极性、相位)就由它来设定。控制寄存器CR2则用于设置各种中断使能。NSS引脚其实就是我们前面讲的SPI协议中的SS片选信号线,如果我们把NSS引脚配置为硬件自动控制,SPI模块就能够自动判别它能否成为SPI主机,或自动进入SPI从机模式。但实际在开发中,我们用软件控制某些GPIO引脚单独作为SS信号,这个GPIO引脚由我们自己任意选定,毕竟STM32那么多的引脚,哈哈。

由于笔者水平有限,只能先谈到这里,谢谢读者耐心看完!

笔者:Armstrong

2017/2/6