文章目录
- 前言
- 一、简介
- 1、通信模式
- 2、总线定义
- 3、SPI通信结构
- 4、SPI通讯时序
- 5、SPI数据交互过程
- 二、多从机模式
- 1、多NSS
- 2、菊花链
- 3、SPI通信优缺点
- 4、UART、IIC、SPI 区别
- 三、总结
- 四、参考资料
前言
SPI协议是我们的重要通信协议之一,我们需要掌握牢靠。
一、简介
1、通信模式
SPI是“全双工”(具有单独的发送和接收线路),因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。这比异步串行通信所需的完整UART要简单得多,并且更加便宜;
2、总线定义
MISO
:Master input slave output 主机输入,从机输出(数据来自从机);
MOSI
:Master output slave input 主机输出,从机输入(数据来自主机);
SCLK
: Serial Clock 串行时钟信号,由主机产生发送给从机;
SS
:Slave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。
- 需要注意的是不同的厂家定义不同:
MISO也可以是SIMO,DOUT,DO,SDO或SO(在主机端);
MOSI也可以是SOMI,DIN,DI,SDI或SI(在主机端);
NSS也可以是CE,CS或SSEL;
SCLK也可以是SCK;
3、SPI通信结构
上图为了更好的区分,实际上无论是在主机传输到从机还是从机传输到主机两条线都在传输数据。传输过程:主机首先会将NSS信号拉低来表示选择那个从机进行通信当接收端检测到时钟的边沿信号立即读取数据线的信号,时钟信号只能由主机产生。
SSPBUF
:Synchronous Serial Port Buffer, 泛指 SPI 设备里面的内部缓冲区, 一般在物理上是以 FIFO 的形式, 保存传输过程中的临时数据;
SSPSR
:Synchronous Serial Port Register, 泛指 SPI 设备里面的移位寄存器(Shift Regitser), 它的作用是根据设置好的数据位宽(bit-width) 把数据移入或者移出 SSPBUF;
Controller
:泛指 SPI 设备里面的控制寄存器, 可以通过配置它们来设置 SPI 总线的传输模式。
需要注意的是:在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样。如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致 SPI 物理模块最终失效。
4、SPI通讯时序
时钟极性 CKP/Clock Polarity:
根据芯片的级型要求决定我们的空闲状态是高电平还是低电平
CKP = 0
:时钟空闲IDLE
为低电平0
;CKP = 1
:时钟空闲IDLE
为高电平1
;
时钟相位 CKE /Clock Phase (Edge):
除配置串行时钟速率和极性外,SPI主设备还应配置时钟相位(或边沿)。根据硬件制造商的不同,时钟相位通常写为CKE或CPHA;顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;
CKE = 0
:在时钟信号SCK
的第一个跳变沿采样;CKE = 1
:在时钟信号SCK
的第二个跳变沿采样;
我们根据上面这两个极性与相位来确定我们的传输模式,不同的模式传输的时序不同。- 01
- 10
- 00
- 11
- 汇总图:
5、SPI数据交互过程
下面解释的数据交互过程采用00的模式进行传输
上表中时钟信号 1 代表时钟
上升沿
,0 代表下降沿
。我们采用的时 SPI 通信模式 0,所以第一个时钟上升沿到来时完成数据采样,主机将自己要发送的数据最高位放到 MOSI
(主机输出从机输入数据线)上,而从机也将自己要发送的数据最高位放到 MISO
(从机输出主机输入数据线)上,当第一个时钟的下降沿到来时主机的 SSPSR 把 MISO 上的数据存入 SSPBUF,而从机的 SSPSR 则把 MOSI 上的数据存入自己的SSPBUF,这样主机从机就完成了 1bit 数据的交互。
二、多从机模式
1、多NSS
- 通常,每个从机都需要一条单独的SS线。
- 如果要和特定的从机进行通讯,可以将相应的
NSS
信号线拉低,并保持其他NSS
信号线的状态为高电平。
2、菊花链
定义
:在设备信号以串行的方式从一个设备依次传到下一个设备,不断循环直到数据到达目标设备的方式称为菊花链。
由于串行传输,我们需要一级一级的查找,如果在更高优先级的设备发送故障,那么下面优先级较低的就不会得到服务,一般的解决方法是使用超时处理,超过我们设定的时间直接跳过该从机(短路)。
3、SPI通信优缺点
优点:
1、全双工通信
2、高速数据传输速率
3、极其灵活的数据传输、不限于8位、可以是任意大小的字
4、非常简单的硬件结构:从站不需要唯一地址、从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。
缺点:
1、没有主从机的应答信号:主机可能在不知情的情况下无处发送
2、通常仅支持一个主设备
3、需要更多的引脚(与I2C不同)
4、没有定义硬件级别的错误检查协议
5、与RS-232和CAN总线相比,只支持非常短的距离
4、UART、IIC、SPI 区别
1、对于信号线数目:
UART为3根,RX、TX、GND ,SPI为4根,SDO、SDI、SCLK、SS,IIC为2根,SDA、SCLK
2、设备主从关系
UART无从属关系,SPI存在主从设备,通过片选信号选择从机 ,而IIC同样也存在主从设备,不过是通过地址选择从机。
3、通信方式
UART无从属关系,SPI存在主从设备,通过片选信号选择从机 ,而IIC同样也存在主从设备,不过是通过地址选择从机。
4、传输速度
UART传输速度较慢 ,SPI比I2C总线要快,速度可达到几Mbps。
5、应用场景
UART
常用于控制计算机与串行设备的芯片,也就是我们经常所说的串口,基本都用于调试。
SPI
主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间 。
I2C
一般是用在同一个板子上的2个IC之间的通信 ,它可以替代标准的并行总线,连接各种集成电路和功能模块
6、传输距离
IIC弱于UART和SPI,因为I2C需要有双向IO的支持,而且使用上拉电阻(为了实现线与),抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信
7、通信特征
UART:异步,一帧可以传5/6/7/8位,低位先发送。
SPI: 同步,SPI允许数据一位一位的传送,甚至允许暂停。从最高位开始传。
IIC:同步,电平信号,一次连续8bit。从最高位开始传。
8、协议复杂度
UART:结构比较复杂
SPI:实现要比UART简单,UART需要固定的波特率,也就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。
IIC:协议比SPI复杂,但是连线比标准的SPI要少
三、总结
稍微将SPI的资料进行了一个整理,这里非常感谢下面参考的博主,写的非常详细,一文读懂!
四、参考资料
SPI协议详解(图文并茂+超详细)