通讯协议学习-SPI通信(2)

1.名词解释

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种串行,全双工的三线同步总线,SPI接口比UART相比,多了一根时钟线。

SPI接口总线使用四条线:
串行时钟线-------------------------SCK;
主机输入/从机输出数据线------------MISO;
主机输出/从机输入数据线------------MOSI;
低电平有效的从机选择线-------------SSN;

在SPI总线上,某一时刻可以出现多个从机,但只能存在一个主机,主机通过片选线来确定要通信的从机,这就要求从机的MISO口具有三态特性,使得该线在器件未被选通时表现为高阻态。

主机和从机模式区别在于:
主模式就是SPI主机,简单说就是提供SCK的那方。
从模式就是被动接受SCK的那方。

通讯协议学习-SPI通信(2)_第1张图片
2.SPI通信原理

SPI以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少四根线(事实上在单向传输时,3根也可以)。

其中SSN是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电平或低电平),从机芯片才有效,这就允许在同一总线上连接多个SPI设备成为可能。

接下来就是负责通讯的三根线,通讯是通过数据交换完成的,首先SPI是串行通讯协议,也就是说数据是一位一位的传输的。

这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO(SDI:数据输入,SDO:数据输出)则基于此脉冲完成数据传输。数据输出通过SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取,完成一位数据位传输,输入亦是如此,这样在至少8次时钟信号的改变。(上升沿和下降沿为一次,就可以完成8位数据传输)

要注意的是SCK信号线只由主设备控制,从设备不能控制信号线,同样在一个基于SPI的设备中,至少有一个主控设备。这种传输方式有一个优点,与普通的串行通讯不通,普通的串行通讯方式一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。

SPI也是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。
在点与点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,这也是它的缺点,没有指定的流控制,没有应答机制确认是否接收到数据。

SPI传输模式

SPI传输模式有四种,是由时钟极性(CPOL)和时钟相位(CPHA)来决定的。

首先对于一个时钟周期而言,有两个edge(边沿,即时钟电平变化的时刻,有上升沿(rising edge)或下降沿(falling edge)),

(1) leading edge = 前一个边沿 = 第一个边沿,对于开始电平是“1”,那么就是“1”变成“0”的时候。

(2) trailing edge = 后一个边沿 = 第二个边沿,对于开始电平是“0”,那么就是“0”变成“1”的时候。

因此SPI的CPOL表示的是SCLK空闲的时候,其电平的值是低电平“0”还是高电平“1”。CPHA表示数据采样,数据有效的时刻,相位对应着数据采样是在第几个边沿,“0”对应着第一个边沿,“1”对应着第二个边沿。

因此CPOL与CPHA对应着四种组合:

通讯协议学习-SPI通信(2)_第2张图片
CPHA = 0 ,表示第一个边沿采样,
对于CPOL = 0,idle 的时候是低电平,第一个边沿是从低到高,所以是上升沿。
对于CPOL = 1,idle 的时候是高电平,第一个边沿是从高到低,所以是下降沿。

CPHA = 1,表示第二个边沿采样,
对于 CPOL =0,idle 的时候是低电平,第二个边沿是从高到低,所以是下降沿。
对于CPOL = 1,idle的时候是高电平,第二个边沿是从低到高,所以是上升沿。

通讯协议学习-SPI通信(2)_第3张图片
3.SPI数据交换

SPI协议是一个环形总线结构, 设备间的数据传输之所以又被称为数据交换,是因为SPI协议规定一个SPI设备不能再数据通信过程中仅仅只充当一个“发送者”或“接收者”,在时钟脉冲SCK周期下,SPI设备都会发送并接受一个bit大小的数据,相当于该设备有一个bit大小的数据被交换了。

假设主机的8位寄存器SPIDATA1内数据为10101010,从机的8位寄存器SPIDATA2内数据为01010101,在上升沿的时候发送数据,在下降沿的时候接收数据,最高位的数据先发送。

主机和从机之间为全双工通信,也就是说两个SPI接口同时发送和接收数据。

通讯协议学习-SPI通信(2)_第4张图片
当第一个上升沿来时,SPIDATA1将最高位1移除,并将所有数据左移一位,这时MOSI线为高电平。SPIDATA2将最高位0移除,并将所有数据左移一位,这时MISO线为低电平。

当下降沿到来时,SPIDATA1将锁存在MISO线上的电平移入最低位,同样SPIDATA2将锁存在MOSI线上的电平移入最高位。

经过8个脉冲后,两个一位寄存器就实现了数据交换,也就完成了一个SPI时序。

你可能感兴趣的:(通信协议,通信协议)