【硬件】SPI串口传输协议
SPI(Serial Peripheral Interface)串口传输协议被广泛应用于各种单片机或者集成电路上。它十分简单易懂并且具备较高速度的传输能力,并且具备全双工同时收发数据的能力。和UART相比,它增加了时钟线和片选线,去掉了UART的开始位、结束位和奇偶位的特性。SPI是面向字节的传输协议,每8个bit是一个数据。SPI既可以高位优先顺序发送一个字节,也可以低位优先发送字节。通常是高位优先。SPI有四根信号线:MOSI,MISO,SCLK,SS。其中,MOSI是Master发送数据、Slave接收数据的信号线,MISO是Master接收数据、Slave发送数据的信号线(注意不是日语的「みそ」、「味噌」的罗马音),SCLK是时钟线并由Master驱动,SS是从选(也叫片选,CS),低电平激活(所以要加上划线)。
这些信号线的名字可以不是上文所说的。
数据线的别名有DI,SDI,DIn,SI,DO,SDO,DOut,SO,SIMO,SOMI,MTSR,MRST,SRMT,STMR等。这些名字里面的M表示Master(主),S表示Slave(从),D表示Data(数据),I表示Input(输入),O表示Output(输出),T表示Transmit(发送),R表示Receive(接收)。
时钟线的别名有SCK、CLK。注意SCLK、SCK的S是Serial。
从选SS信号也有不少别名:SSEL,CS,CS,CE,nSS,/SS,SS#等。
图片来自维基百科
SPI有不同的工作模式,通常用CPOL和CPHA的值表示。CPOL指的是SPI的SCLK信号线的极性,CPHA指的是输入信号线采样的时序和输出信号线设置新值的时机,也就是相位(phase)。
请看下面四张图描述的4种不同的配置情形。
图1:
图片来源:DLNWARE
时钟信号SCLK闲置时为低电平,传输开始的时候(SS被拉低)主设备和从设备设置好各自要发送的数据,然后在SCLK的上升沿采样,再在下一个SCLK的下降沿设置数据,再在下一个SCLK的上升沿采样。
图2:
图片来源:DLNWARE
CPHA也就是相位为1的时候,主设备和从设备在SCLK的上升沿准备数据,并在SCLK的下降沿采样数据。与图1的区别在于准备数据和采样数据的时机不同。
图3:
图片来源:DLNWARE
时序和图1一样,但SCLK的电平相反。在闲置的时候是高电平。传输初始的时候主从都要准备好数据,然后SCLK在下降沿的时候采样、上升沿的时候准备下一个bit的数据。
图4:
图片来源:DLNWARE
时序和图2一样,但SCLK的电平相反。主从设备在SCLK的下降沿准备数据,然后在SCLK的上升沿采样数据。
SPI总线可以有多种方式布局,最典型的方式就是一个主设备控制多个从设备的方式。主设备的MOSI口连接所有的从设备的MOSI口,主设备的MISO口连接所有从设备的MISO口,主设备的SCLK口连接所有从设备的SCLK口,然后主设备对每个从设备都有一条单独的SS信号线,用来指定自己收发数据的目标。如下图所示的连接方式就是典型的多Slave设备的SPI总线布局。
图片来自维基百科
这种方式的总线布局钦定了从设备的个数,难以进行动态扩张。因为每个从设备都有一条独享的SS线,这需要占用额外的主设备针脚。因此SPI总线还有另外一种连接方式,叫“菊花链”(Daisy chain)。这种布局把所有的从设备的SS信号线都连接到主机上,这样主机可以不需要通过占用GPIO口来控制多个设备了。主机的MOSI口仅连接第一个从设备,在通讯的时候从设备识别接收到的数据,判断是不是自己的数据,然后处理,并把不是自己的数据通过MISO口输出给下一个菊花链上的从设备的MOSI口上。这样一圈下来,主机就可以收到自己想要的数据了,但主机需要不断地驱动SCLK来保证所有的从设备都在参与通讯。典型的做法是定义一种传输的数据帧的格式,让它里面包含一个设备地址的数据来实现片选功能。下图就是一种典型的菊花链布局。
图片来自维基百科
典型SPI布局(非Daisy chain方式)的优势是主设备可以控制多个模式不同的从设备,只要对应的SS信号被拉低激活,就可以以对应的模式进行传输。而且主设备可以和波特率不同的从设备通讯。不同的从设备对波特率的要求不同,有的允许很快的传输速度,有的则不行。主设备可以动态改变自身的时钟频率,来适应不同的从设备。
而Daisy chain方式则由于所有的从设备使用同一根SS线,必须在相同的SPI模式下才能正常通讯。并且主设备必须以最慢的那个设备的波特率来驱动SCLK时钟线。因此各有取舍。
参考资料:
https://en.wikipedia.org/wiki/Serial_Peripheral_Interface
http://dlnware.com/theory/SPI-Transfer-Modes
页:
[1]