简介
SPI(Serial Peripheral Interface)是由美国摩托罗拉公司推出的一种同步串行传输规范,也是单片机外设芯片串行扩展接口,它支持高速、全双工、同步通信,没有定义速度限制,一般能达到10M/bps以上。SPI有主、从两种模式,一般由一个主模块和一个或多个从模块组成,主模块选择一个从模块进行同步通信,完成数据的交换。SPI接口的读写操作,都是由主设备发起,多从设备时,通过各自的片选信号进行管理。SPI接口至少需要4根线,单向传输时3根,分别为MISO(主设备数据输入,从设备数据输出)、MOSI(主设备数据输出,从设备数据输入)、SCLK(时钟,由主设备产生)、CS/SS(片选,由主设备控制)。
通信原理
SPI主设备和从设备都有一个串行移位寄存器,主设备通过向它的SPI串行寄存器写入一个字节来发起一次传输。
SPI数据通信的流程可以分为以下几步:
1、主设备发起信号,将CS/SS拉低,从而启动SPI通信。
2、主设备会通过发送时钟信号,来指示从设备进行写数据或者读数据操作(采集时机可以是时钟信号的上升沿(从低到高)或下降沿(从高到低),因为SPI有四种模式,下面会有详细讲解),从而立即读取数据线上的信号,这样就得到了一位数据(1bit)。
3、主机(Master)将要发送的数据写到发送数据缓存区(Menory),经过移位寄存器(缓存长度不一定,取决于单片机的配置),串行移位寄存器会通过MOSI信号线将字节一位一位的移出去传送给从机,与此同时,MISO接口也会接收到的数据经过移位寄存器一位一位的移到接收缓存区。
4、从机(Slave)也会将自己的串行移位寄存器(缓存长度也不一定,取决于单片机的配置)中的内容通过MISO信号线返回给主机。同时,它也会通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换了。
着重说明:SPI具有主模式和从模式之分,而不是读和写的概念,外设的写入和读取操作是同步进行的。若只进行写操作,主机只需忽略接收到的字节(虚拟数据);反之,若主机要读取从机的一个字节,则必须发送一个空字节来引发从机的传输。通俗地讲,你发送一个数据就一定会收到一个数据;你想要接收一个数据,也必须先发送一个数据。
SPI特性
设备选择
SPI是一种单主设备(Single Master)通信协议,只有一支主设备能发起通信。当主设备想要读取/写入从设备时,它会首先将从设备对应的SS线(SS是低电平有效)拉低。接着,主设备就会开始发送工作脉冲到时钟线上,在相应的脉冲时间内,主设备会通过MOSI发送信号以实现“写”,同时也会通过MISO采样以实现“读”操作。通俗的说,主设备选择想要通信的从设备只需要拉低相应从设备的CS/SS线就可以了。
设备时钟
SPI时钟特点主要包括:时钟速率、时钟极性和时钟相位三方面。
时钟速率
SPI总线上的主设备必须在开始通信时进行配置并产生相应的时钟信号。从理论上讲,只要可行,时钟速率就可以达到你想要的任何程度,当然,这个速率受限于每个系统能够提供的最大系统时钟频率以及SPI传输的最大速率。
时钟极性
根据不同的硬件制造商的命名规则,时钟极性通常被称为CKP或CPOL。时钟极性和相位共同决定了读取数据的方式,比如在信号上升沿读取数据,还是在信号下降沿读取数据。CKP可以被设置为1或0,这意味着你可以根据需要将时钟的默认状态(IDLE)设置为高或低电平。极性反转可以通过一个简单的逻辑逆变器来实现。你必须参考设备的数据手册来正确设置CKP和CKE。
CKP = 0:时钟空闲IDLE为低电平0;
CKP = 1:时钟空闲IDLE为高电平1。
时钟相位
根据硬件制造商的不同,时钟相位通常写为CKE或CPHA。顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;
CKE = 0:在时钟信号SCK的第一个跳变沿采样;
CKE = 1:在时钟信号SCK的第二个跳变沿采样。
四种模式
根据SPI的时钟极性和时钟相位特性可以设置4种不同的SPI通信操作模式:
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由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。
如图mode1:CKP=0,时钟初始为低电平,CKE=1,第二个跳变沿采样
多从机模式
有两种方式可以将多台设备连接到主设备:多片选择和菊花链。多片选择是指将多台设备连接到一个主设备,通过多片选择的方式来实现。而菊花链则是将多台设备连接起来,形成一个菊花链,然后将主设备连接到菊花链的一端,从而实现了多台设备的连接。这两种方式都可以实现将多台设备连接到主设备的目的,但是它们之间又有着很大的不同,因此在选择连接方式时,需要根据实际需要来进行选择。
多片选择
通常,每个从机都需要一条单独的SS线。
如果要和特定的从机进行通讯,可以将相应的NSS信号线拉低,并保持其他NSS信号线的状态为高电平;如果同时将两个NSS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码。适合主机发数据。
连接方式如下:
菊花链
在数字通信领域,菊花链是一种以串行方式将设备信号(包括总线信号和中断信号)依次传递到下一个设备,并在传递过程中一直循环直到数据被传输到目标设备的方式。
菊花链的缺点是一旦数据链路中的某设备发生故障,优先级较低的设备就无法获得服务;距离主机越远的从机,优先级越低,需要安排好从机优先级,设置总线检测器,短路超时从机。
连接方式如下:
SPI优缺点
优点
无起始位和停止位,数据可以连续传输不会被打断;
从设备选择简单;
数据传输速率比I2C更高(已知的有的器件SPI已达到50Mbps);
分离的MISO和MOSI信号线,因此可以同时发送和接收数据;
极其灵活的数据传输,不限于8位,它可以是任意大小的字;
非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。
缺点
使用四根信号线(I2C和UART使用两根信号线);
无法确认是否已成功接收数据(I2C拥有此功能);
没有任何形式的错误检查,如UART中的奇偶校验位;
只允许一个主设备;
没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
没有定义硬件级别的错误检查协议;
与RS-232和CAN总线相比,只能支持非常短的距离;
说明:侵权联系删除文章。