SPI通信详细介绍
SPI简要概述
SPI通信英文全称(Serial Peripheral Interface)串行外设接口,从其名称中可以看出,其通信方式为串行通信,其主要应用于MCU与外设之间的通信。此外,由于其通信速率较快(由SPI的SCK管脚定义),稳定可靠渐渐发展为主流的通信方式。
SPI信号定义
SPI通信一般为四根信号,分为SCK(Serial Clock)串行时钟、CS(Chip Select)片选、MOSI(Master Output Slave Input)主发从收及MISO(Master Input Slave Output)从发主收。从信号定义可以看出其拥有系统时钟,通讯方式为同步通讯。还可以看出其收发模式可以分为主发和从发两种,由于其收发信号线为两根,因此主机在进行发送的同时,从机也可以将数据发送给主机。因此,其为全双工通信。综上所述,我们可以了解到SPI通信是一种同步、全双工、串行的一种通讯方式。
SPI分为主设备和从设备之分,但在同一个时刻,只能有一个主设备,但可以有多个从设备。主设备通过控制不同的片选引脚进而与某一个从设备建立通信。因此按照主设备与从设备的数量可以分为一对一和一对多之分。
- 一对一
- 一对多
SPI通信时序
- 拉低(拉高)片选脚,选中从设备,告诉从设备预建立通信(高有效/低有效由芯片决定)
- 主设备发送CLK信号,主从设备按照规定的CLK频率进行通信(在idle状态下的CLK初始极性(H/L)可以划分为不同的模式)
- 主设备通过MOSI引脚发送数据到从机,其中高位先发,低位后发。SPI规定,每8/16位为一组,即(即每次最多可以传输两个字节),可以传输多次(即连续发送)
- 从设备通过MISO引脚发送数据到主机,同MOSI引脚功能类似
SPI模式
其中,将片选之前CLK的初始相位和开始采样的时间可以划分为四种模式:
CPOL:Clock Polarity 信号极性,即在片选之前(CLK空闲状态),CLK的初始相位为高(bit = 1)或低(bit = 0)
CPHA:Clock Phase 信号相位,定义了信号的采集时间。CPHA=0,表示在SCK的第一个跳变沿(上升沿/下降沿)进行数据采样,在第一个跳变沿进行数据传输。CPHA=1,表示在SCK的第二个跳变沿(上升沿/下降沿)进行数据采样,在第一个跳变沿进行数据传输。
即信号采样时处于一个信号周期的Leading
时刻(bit = 0)还是Trailing
时刻(bit = 1)
- Tip:芯片具体支持/使用的哪种SPI通讯模式由芯片本身决定(具体看芯片手册的SPI时序图)
具体可以表示为:
SPI_Mode | CPOL | CPHA | 空闲时SCK状态 | 采样时刻 |
---|---|---|---|---|
0 | 0 | 0 | 低电平 | CLK的第一个跳变沿 |
1 | 0 | 1 | 低电平 | CLK的第二个跳变沿 |
2 | 1 | 0 | 高电平 | CLK的第一个跳变沿 |
3 | 1 | 1 | 高电平 | CLK的第二个跳变沿 |
- 下面分别给出四种通讯模式下的SPI时序图(以CS低有效,一次发送8Bit的数据为例子)
Mode0:CPOL=0,CPHA=0
Mode1:CPOL=0,CPHA=1
Mode2:CPOL=1,CPHA=0
Mode3:CPOL=1,CPHA=1
伪代码实现
在数据发送过程中,主设备通过MOSI线发送数据,从设备通过MISO线接收数据。数据的发送速率由CLK信号的频率决定。SPI协议支持全双工通信,即在主设备发送数据的同时,也可以接收从设备的数据。
在代码实现过程中,首先需要配置SPI的工作模式,然后在主设备上设置CS信号为低电平(假设低有效),使从设备被选中。然后,主设备通过MOSI线发送数据,从设备通过MISO线接收数据。数据发送完毕后,主设备将CS信号设置为高电平,结束数据传输。
以下是SPI通信的伪代码:
// 配置SPI为Mode0
SPI_Config(Mode0);
// 设置CS信号为低电平
CS = 0;
// 通过MOSI线发送数据
SPI_Send(data);
// 通过MISO线接收数据
data = SPI_Receive();
// 设置CS信号为高电平
CS = 1;