嵌入式软件开发_SPI总线及通信协议详解
1.什么是SPI?
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。SPI应用广泛,主要应用在EEPROM、 FLASH、 实时时钟 、AD转换器及数字信号处理器和数字信号解码器之间。
图1 SPI 硬件接口示意图
图2 SPI全双工传输示意图
SPI通信有4线:SCK(同步时钟信号)、MISO(主接收从发送)、MOSI(主发送从接收)、CS片选信号。
SCK:作为同步通信的时钟,指示什么时候开始/结束通信,以及中间数据传输(主设备什么时候发送,从设备什么时候接收),时钟由主设备发出,控制(即主从设备之间的SCLK要匹配,否则就没法正常通讯了,即:保证时序上的一致才可正常通讯)。
MISO:SPI通信分为主设备(Master)和从设备(Slave),主设备intput,从设备output
MOSI:主设备发送(output输出),从设备接收(intput输入)
CS:SPI通信分为一主多从,主设备要想从多个从设备中选中和哪个从设备通信,直接将和从设备连接的CS引脚拉低即可。
2.SPI专业术语解释
① 空闲态
指的是SPI总线上没有数据发送时候的状态;
② 时钟极性(CPOL Clock Polarity)
SPI的CPOL,表示当SCLK空闲idle的时候,其电平的值是低电平0还是高电平1:
CPOL=0,时钟空闲idle时候的电平是低电平,所以当SCLK有效的时候,就是高电平,就是所谓的active-high;
CPOL=1,时钟空闲idle时候的电平是高电平,所以当SCLK有效的时候,就是低电平,就是所谓的active-low;
③ 时钟相位(CPHA Clock Phase)
时钟相位,实际指的就是发送和接受双方如何协调收发:
CPHA = 0,无论收发方,在第一个边沿(上升沿还是下降沿看CPOL=0还是1)处采样,在第二个边沿处发送数据;
CPHA=0,表示第一个边沿:
对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;
对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;
CPHA = 1,在第二个边沿处(上升沿还是下降沿看CPOL=0还是1)处采样,在第一个边沿处发送数据。
CPHA=1,表示第二个边沿:
对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿;
对于CPOL=1,idle时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;
3.CPOL CPHA的四种组合
CPOL和CPHA,分别都可以是0或1,对应的四种组合如下表所示
MODE0 | CPOL=0,CPHA=0 | MODE3 | CPOL=1,CPHA=0 |
MODE1 | CPOL=0,CPH=1 | MODE4 | CPOL=1,CPH=1 |
结合前面讲的理论知识,下面的图就很好理解啦!
4.SPI通信协议
SPI通信协议总结起来就是一句话,解决SPI通信问题:
(1)数据发送高位在前还是低位在前:比如0x55(0101 0101),先发送第0位的1还是第7位的0?
高位在前,先发送0(MSB),最后发送1(LSB)
(2)怎么区分正在发送数据还是处在空闲,例如0xff(1111 1111):区分空闲和数据发送?
① 在开始发送之前,SCK处在空闲态(根据CPOL时钟极性设置规定,持续输出高电平(CPOL=1)或者低电平(CPOL=0));② 开始发送时候,主设备会控制SCK发生变化(低电平转高电平,高电平转换低电平),直到数据发送完;③ SCK会继续回到空闲状态(持续输出高电平或者低电平)。
(3)发送方什么时候发送?
根据CPHA时钟相位设置,向数据线上放数据:CPHA=1,在第一个边沿处,向数据线上放数据(发送);CPHA=0,在第二个边沿处,向数据线上放数据(发送)
(4)接收方什么时候接收?
根据CPHA设置采样(读取数据):CPHA=1,在第二个边沿处,从数据线上采样(读取数据),CPHA=0,在第一个边沿处,从数据线上采样(读取数据)。
5.SPI内部工作机制
SSPSR是 SPI 设备内部的移位寄存器(Shift Register)。 它的主要作用是根据SPI 的时钟信号状态, 往SSPBUF 里移入或者移出数据, 每次移动的数据大小由Bus-Width 以及Channel-Width 所决定。
6.SPI通信特点
没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据可靠性上有一定的缺陷。
SPI的传输都是以8bit一个字节为单位的(一帧)。
.