SPI Notes
SPI的全称是Serial Peripheral Interface,是一种同步、串行、全双工、Master/Slave模式的通讯接口。在SPI上,只能有一个Master,可以有一个或多个Slave。Master负责发起读或者写的frame。如果在SPI上有多个Slave,那么需要通过每个Slave独立的SS(Slave Select)信号线来选中要通讯的Slave。
SPI被称作四线总线,也就是说,它有四条线,分别是:
- SCLK(SCK、CLK):串行时钟,由Master输出;
- MOSI(SIMO、SDI、DI、DIN、SI、MTST):Master->Slave的数据,由Master输出;
- MISO(SOMI、SDO、DO、DOUT、SO、MRSR):Slave->Master的数据,由Slave输出;
- SS(nCS、CS、CSB、CSN、EN、nSS、STE、SYNC):每个Slave都有独立的SS,用于选择当前需要通信的Slave,低电平有效,由Master输出。
数据通信
在开始通讯之前,Master需要先配置SCLK的时钟,这个时钟的值需要匹配Slave能够支持的时钟。随后,Master需要通过将SS置低来选中Slave。如果Slave需要在片选后一段时间才能访问,那么Master必须按照Slave数据手册的要求等待一段延时。
在每一个时钟周期内,都会发生一次全双工的数据交换,Master通过MOSI发送一个bit到Slave,同时Slave通过MISO发送一个比特到Master,即使只想做单向通讯,也不能省略其中的任何一步。
时钟的极性和相位
Master除了需要设置时钟频率外,还需要设置时钟的极性和相位,这两个选项通常被称为CPOL和CPHA。极性和相位被统一称为SPI的Mode,不同的Mode对应不同的极性、相位组合,具体数值如何需要看厂家的datasheet。
连接方式
如果有多个Slave,那么有两种不同的连接方式:
- 独立Slave连接:所有Slave的数据线都连接到Master的数据线上,Master上为每个Slave都准备一条独立的SS,通过SS来选择Slave;
- 菊花链连接:在这种连接方式下,所有Slave的数据线被串联起来,Slave 0的输出被连接到Slave 1的输入,依次连接,最后Slave N的输出被连接到Master的输入;Master只有一条SS,同时连接到所有的Slave。这种方式的应用之一是JTAG。
有些时候,SPI设备还会单独提供一条独立的中断线到CPU。SPI规范并没有定义中断,因此这种行为完全看设备的datasheet。
优点和缺点
优点
- 支持完整的全双工通信
- 使用Push-pull驱动能够提供良好的信号完整性的高传输速度
- 比I²C或者SMBus更高的吞吐量
- 传输协议可以完全自有定义,没有附加约束
- 不局限于传输8-bit word
- 消息的大小、内容和目的可以任意定义
- 硬件接口极为简单
- 通常,由于电路更简单(包括上拉电阻在内),它的能耗要比I²C或者SMBus更少、
- 没有仲裁过程以及相关的失败模式
- Slave使用Master的时钟信号,就不需要内置晶振
- Slave不需要唯一的地址,作为对比,I²C、GPIB或者SCSI都需要
- 不需要transceiver
- 只需要4个引脚,比并口要少得多
- 每个设备至多只有一个总线信号(也就是片选信号);其他的线路都是共享的
- 信号都是单向流动,便于做隔离
- 没有对最大时钟速度做任何限制,理论上可以达到很高的速度
缺点
- 需要的引脚比I²C多,即使是三线变种也不行
- 没有带内寻址(in-band addressing);只能使用带外(out-of-band)片选信号
- Slave端没有硬件流控(flow control),只有Master能够调节传输速率
- 没有硬件Slave确认(Ack)信号,Master可能在向一个无效器件传输数据却浑然不觉
- 只支持一个Master设备
- 没有定义错误检查协议
- 没有一个正式的标准,也就无从验证一致性
- 相较于RS-232、RS-485或者CAN-bus,只能进行短距离传输
- 有很多变种,使得难以找到通用的开发工具
- SPI不支持热插拔(动态添加节点)
- 没有中断机制,要么使用额外的独立信号实现中断,要么使用类似于USB 1.1和2.0那样的周期轮训机制来模拟中断
- 有些变种(例如Multi I/O SPI和三线SPI)是半双工的