- 概述
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串行扩展接口,是一种高速、全双工、同步通信总线,所以可以在同一时间发送和接收数据,SPI没有定义速度限制,通常能达到甚至超过10M/bps。
- 物理层接口
SPI有主、从两种模式,通常由一个主模块和一个或多个从模块组成(SPI不支持多主机),主模块选择一个从模块进行同步通信,从而完成数据的交换。提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave),SPI接口的读写操作,都是由主设备发起,当存在多个从设备时,通过各自的片选信号进行管理。
SPI属于同步全双工串行通信。同步意味着有一条公共时钟线;全双工意味着SPI至少有两根数据线实现数据的双向同时传输。同步+全双工意味着SPI主设备对从设备的读操作和写操作是同时同步完成的;串行表明SPI收发数据只能一位一位进行,最少有两根数据线,一根发送,一根接收。分析可知,SPI在物理层体现为4根使用的信号线,分别是MISO/DI/MRST、MOSI/DO/MTSR、SCLK 和 CS/SS。
SCLK(Serial Clock): 时钟信号,由主设备产生;
MISO(Master Input Slave Output): 主设备数据输入,从设备数据输出;
MOSI(Master Output Slave Input): 主设备数据输出,从设备数据输入;
CS/SS(Chip Select/Slave Select): 从设备使能信号,由主设备控制,一主多从时,CS/SS是从设备是否被主设备选中的控制信号,只有片选信号为预先规定的使能信号时(高电位或低电位),主设备对此从设备的操作才有效。一主一从时从设备的CS/SS既可以默认连至高电位或低电位,也可以连至主设备由主设备控制。
3. 通信原理
SPI主设备和从设备都有一个串行移位寄存器,主设备通过向它的SPI串行寄存器写入一个字节来发起一次传输。
SPI数据通信的流程可以分为以下几步:
1、主设备发起信号,将CS/SS拉低,启动通信。
2、主设备通过发送时钟信号,来告诉从设备进行写数据或者读数据操作(采集时机可能是时钟信号的上升沿(从低到高)或下降沿(从高到低),因为SPI有四种模式,后面会讲到),它将立即读取数据线上的信号,这样就得到了一位数据(1bit)。
3、主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(缓存长度不一定,看单片机配置),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。
4、从机(Slave)也将自己的串行移位寄存器(缓存长度不一定,看单片机配置)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
例如,下图示例中简单模拟SPI通信流程,主机拉低NSS片选信号,启动通信,并且产生时钟信号,上升沿触发边沿信号,主机在MOSI线路一位一位发送数据0x53,在MISO线路一位一位接收数据0x46,如下图所示:
这里有一点需要着重说明一下:SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。若只进行写操作,主机只需忽略接收到的字节(虚拟数据);反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。
4. 通信特性
- 设备选择:SPI是单主设备(Single Master)通信协议,只有一支主设备
能发起通信,当SPI主设备想读/写从设备时,它首先拉低从设备对应的SS线(SS是低电平有效)。接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,主设备把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”。如下图所示:
-
设备时钟:SPI时钟特点包括:时钟速率、时钟极性和时钟相位三方面。
- 时钟速率:
SPI总线上的主设备必须在通信开始时候配置并生成相应的时钟信号。从理论上讲,只要实际可行,时钟速率就可以是你想要的任何速率,当然这个速率受限于每个系统能提供多大的系统时钟频率,以及从设备能接受的最大传输速率。
b. 时钟极性:
根据硬件制造商的命名规则不同,时钟极性通常写为CKP或CPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据。CKP可以配置为1或0。这意味着你可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。你必须参考主从设备的数据手册才能正确设置CKP和CKE。
CKP = 0:时钟空闲IDLE为低电平 0;
CKP = 1:时钟空闲IDLE为高电平1。
c. 时钟相位:
根据硬件制造商的不同,时钟相位通常写为CKE或CPH。顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿。
CKE = 0:在时钟信号SCK的第一个跳变沿采样;
CKE = 1:在时钟信号SCK的第二个跳变沿采样。
- 设备模式:根据SPI的时钟极性和时钟相位特性可以设置4种不同的SPI通
信操作模式,它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低),详情如下所示:
Mode0:CKP=0,CKE =0:当空闲态时,SCK处于低电平,数据采样是在第1个边沿,也就是SCK由低电平到高电平的跳变,所以数据采样是在上升沿(准备数据),(发送数据)数据发送是在下降沿。
Mode1:CKP=0,CKE=1:当空闲态时,SCK处于低电平,数据发送是在第2个边沿,也就是SCK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
Mode2:CKP=1,CKE=0:当空闲态时,SCK处于高电平,数据采集是在第1个边沿,也就是SCK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
Mode3:CKP=1,CKE=1:当空闲态时,SCK处于高电平,数据发送是在第2个边沿,也就是SCK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。
举个例子,下图是SPI Mode0 的读/写时序,可以看出SCK空闲状态为低电平,主机数据在第一个跳变沿被从机采样,数据输出同理。
下图是SPI Mode3 的读/写时序,SCK空闲状态为高电平,主机数据在第二个跳变沿被从机采样,数据输出同理。
5. 多从机拓扑
有两种方法可以将多个从设备连接到主设备:多片选和菊花链。
多片选拓扑下每个从机都需要一条单独的SS线。如果要和特定的从机进行通讯,可以将相应的SS信号线拉低,并保持其他SS信号线的状态为高电平;如果同时将两个SS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码。
菊花链拓扑的最大缺点是信号串行传输,一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了。另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况。
6. SPI优缺点
优点:
- 无起始位和停止位,因此数据位可以连续传输而不会被中断
- 没有像I2C这样复杂的从设备寻址系统
- 数据传输速率比I2C更高
- 分离的MISO和MOSI信号线,因此可以同时发送和接收数据;
- 极其灵活的数据传输,不限于8位,它可以是任意大小的字(取决于芯片性能)
- 非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN,ETH不同)
缺点:
- 使用四根信号线(比I2C和UART多)
- 无法确认是否已成功接收数据(I2C拥有此功能)
- 没有任何形式的错误检查(最新的一些控制器增加了此功能),如UART中的奇偶校验位
- 只允许一个主设备
- 没有硬件从机应答信号(主机可能在不知情的情况下无处发送)
- 没有定义硬件级别的错误检查协议
与RS-232和CAN总线相比,只能支持非常短的距离
7,驱动流程
mcu为从机时,通信由主机soc先发起,但待发送的原始数据在mcu侧,因此有以下2种情况;
情况1:主机主动向从机通信,分为主机向从机读和主机向从机写 2 种情况;
情况2:从机主动向主机通信。