学习内容:
学习SPI协议记录
学习清单:
提示:这里可以添加要学的内容
例如:
- SPI协议的介绍
- 三根线还是四根线
- 两个概念四种模式
- SPI时序图
- SPI优缺点
- SPI和IIC的对比
学习详细内容:
1.SPI协议的介绍
SPI是串口外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议。
2.三根线还是四根线
SPI一般都是默认4线制Motorola SPI协议,即有四根线,分别是:SCLK、MOSI、MISO和CS共4根数据线,标准4线制的好处是可以实现数据的全双工传输,当只有一个主机和一个从设备时,只需要一个CS、多个从机需要多个CS。(CS片选信号有的也叫做SS线),多从机模式,通常每个从机需要一条单独的SS线,如下图所示:
CS是chip select,即从设备使能信号,由主设备控制。当总线上有多个从设备时,主设备如果需要和某个从设备通信,就将该设备的片选引脚拉低使能。
即通过指定使能NSS,就能与对应的从机进行通信。
以上图中的4根线分别是:
- SCLK:Synchronous CLock,同步时钟信号,时钟频率即SPI速率,和SPI模式有关
- MOSI:Master output slave input,主设备数据输出,从设备数据输入
- MISO:Master input slave output,主设备数据输入,从设备数据输出
- CS:chip select,从机设备选择,低电平有效
3线制SPI,根据不同的应用场景,主要有以下2中类型:
- 只有3根线:SCLK,MOSI和CS,没有MISO数据线,适用于单工通讯,主机只发送或只接收从机的数据
- 只有3根线:SCLK,SDIO和CS,这里的SDIO作为双向端口,适用于半双工通讯,比如ADI的多款ADC芯片都支持双向传输。
3.两个概念四种模式
既然是要进行数据的传输,双方就要明确从机在什么时刻去采样主机发出的数据,主机在什么时刻去读取从机发来的数据。
CPOL(Clock Polarity)时钟的极性,规约了SPI总线在空闲时,时钟信号是高电平还是低电平;
- CPOL=0 表示时钟空闲时为低电平
- CPOL=1 表示时钟空闲时为高电平
CPHA(Clock Phase)时钟的相位,规约SPI设备是在时钟上升沿还是下降沿触发数据采样。
- CPHA=0 表示数据在SCLK时钟上升沿被采样,在SCLK时钟下降沿切换(有的说法叫“在时钟信号SCLK的第一个跳变沿采样”)
- CPHA=1表示数据在SCLK时钟下降沿被采样,在SCLK时钟上升沿切换(有的说法叫“在时钟信号SCLK的第二个跳变沿采样”)
时钟极性和时钟相位的不同组合,所以有了SPI总线传输的4种模式
模式1:CPOL=0,CPHA=0
模式1的示例图:即时钟空闲时为低电平,在时钟的上升沿被采样,下降沿切换
模式2:CPOL=0,CPHA=1
模式3:CPOL=1,CPHA=0
模式4:CPOL=1,CPHA=1
其余三个模式也是同理
4.SPI时序图
当以模式1为工作模式时:
先是将CS片选信号拉低,选中要通信的从设备,然后通过MOSI和MISO这两根数据线进行通信,MOSI数据线发出了0xD2这个数据给从设备,同时从设备也通过MISO线给主设备返回了0x66这个数据。由于SPI是全双工的,所以读写时序可以一起完成。
5.SPI的优缺点
SPI的优势
- 全双工串行通信
- 高速数据传输速率
- 简单的软件配置
- 及其灵活的数据传输,不限于8位,它可以是任意大小的字
- 非常简单的硬件结构,从站不需要唯一地址(与IIC不同),从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同),不需要收发器(与CAN不同)
SPI的缺点
- 没有硬件从机应答信号(主机可能在不知情的情况下无处发送)
- 通常仅支持一个主设备
- 需要更多的引脚(与IIC不同)
- 没有定义硬件级别的错误检查协议
- 与RS-232与CAN总线相比,只能支持非常短的距离
6.SPI和IIC的对比
- SPI是全双工,而IIC是半双工
- IIC支持多主机多从机,SPI只能有一个主机
- 从GPIO占用上来看,IIC占用更少的GPIO,更节省资源
- SPI的数据位宽更灵活,可以根据需要选择多位数数据宽度
- SPI协议没有响应机制,主机无法得知从机是否接收到所发的数据,如果不采用一些方法的话可能会导致数据丢帧
- 正是因为没有复杂的响应机制,SPI协议可以做到非常高的速率,每一个SCLK都可以进行数据的传输,通过引入CRC校验等校验方法,可以即高速传输数据,又能保持数据的准确度。
- IIC通过期间地址来选择从机,从机数量的增加不会导致GPIO的增加,而SPI通过CS片选信号选择从机,每增加一个从机就要多占用一个GPIO,当然也可以通过加入译码器来实现多从机控制
- 两者大多数都应用与板内器件短距离通讯