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)是半双工的

results matching ""

    No results matching ""