目录
概述
本文主要介绍SPI的通信结构及其时钟极性相关内容。SPI通信协议采用主从架构,包含4条信号线:SCK时钟线、MOSI主发从收线、MISO主收从发线以及CS_N片选线。协议支持4种工作模式(模式0-3),由时钟极性CPOL和相位CPHA组合决定。模式0和3空闲时SCK为低电平,模式1和2为高电平;数据采样边沿取决于CPHA设置。在ZephyrOS中,可通过spi_config结构体的operation字段配置模式,使用SPI_MODE_CPOL和SPI_MODE_CPHA宏定义组合实现不同模式选择。通信以CS_N下降沿开始,上升沿结束,数据传输时MSB或LSB先行需主从设备保持一致。
1 SPI通信介绍
SPI通讯协议包含: 1条时钟信号线、2条数据总线和1条片选信号线, 时钟信号线为SCK,2条数据总线分别为MOSI(主输出从输入)、MISO(主输入从输出),片选信号线为,它们的作用介绍如下:
SCK (Serial Clock):时钟信号线,用于同步通讯数据。由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不同,两个设备之间通讯时,通讯速率受限于低速设备。
MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,数据方向由主机到从机。
MISO (Master Input,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,数据方向由从机到主机。
(Chip Select):片选信号线,也称为CS_N,以下用CS_N表示。
当有多个SPI从设备与SPI主机相连时,设备的其它信号线SCK、MOSI及MISO同时并联到相同的SPI总线上,即无论有多少个从设备,都共同使用这3条总线;而每个从设备都有独立的这一条CS_N信号线,本信号线独占主机 的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而SPI协议中没有设备地址,它使用CS_N信号线来寻址,当主机要选择从设备时,把该从设备的CS_N信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI通讯。
所以,SPI通讯以CS_N线置低电平为开始信号,以CS_N线被拉高作为结束信号。
2 极性模式
2.1 极性模式概念
SPI_MODE_CPOL (Clock Polarity) 是SPI通信中控制时钟极性(Clock Polarity)的重要参数,它决定了SPI时钟信号在空闲状态时的电平。
SPI通讯协议一共有四种通讯模式,模式0、模式1、模式2以及模式3,这4种模式分别由时钟极性(CPOL,Clock Polarity)和时钟相位(CPHA,Clock Phase)来定义,其中:
1) CPOL参数规定:空闲状态(CS_N为高电平,设备未被选中)时SCK时钟信号的电平状态,
2)CPHA规定: 数据采样是在SCK时钟的奇数边沿还是偶数边沿。
2.2 四种工作模式
SPI有四种工作模式,由CPOL和CPHA组合决定:
模式 | CPOL | CPHA | 描述 |
---|---|---|---|
0 | 0 | 0 | 空闲状态时SCK串行时钟为低电平;数据采样在SCK时钟的奇数边沿,本模式中,奇数边沿为上升沿;数据更新在SCK时钟的偶数边沿,本模式中,偶数边沿为下降沿。 |
1 | 0 | 1 | 空闲状态时SCK串行时钟为低电平;数据采样在SCK时钟的偶数边沿,本模式中,偶数边沿为下降沿;数据更新在SCK时钟的奇数边沿,本模式中,偶数边沿为上升沿。 |
2 | 1 | 0 | CPOL= 1,CPHA=0。空闲状态时SCK串行时钟为高电平;数据采样在SCK时钟的奇数边沿,本模式中,奇数边沿为下降沿;数据更新在SCK时钟的偶数边沿,本模式中,偶数边沿为上升沿。 |
3 | 1 | 1 | CPOL= 1,CPHA=1。空闲状态时SCK串行时钟为高电平;数据采样在SCK时钟的偶数边沿,本模式中,偶数边沿为上升沿;数据更新在SCK时钟的奇数边沿,本模式中,偶数边沿为下降沿。 |
2.3 SPI通信时序流程
以模式0为例,介绍SPI基本的通讯过程。SPI模式0通讯时序图如下:
2.4 SPI通信数据有效性
SPI通信的数据传输特性如下:
1)SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。
2)MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。
3)数据传输时,MSB先行或LSB先行并没有作硬性规定,但要保证两个SPI通讯设备之间使用同样的协定,一般都会采MSB先行模式。
2.5 SPI通信起始和停止信号
起始信号: CS_N信号线由高变低,是SPI通讯的起始信号。CS_N是每个从机各自独占的信号线,当从机在的CS_N线检测到起始信号后,就知道slave被主机选中了,开始准备与主机通讯。
停止信号: CS_N信号由低变高,是SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。
3 Zephyr OS中SPI极性配置方法
3.1 配置方法
在Zephyr RTOS中,CPOL通常与CPHA(时钟相位)一起配置:
#include <drivers/spi.h>
/* 配置SPI模式 */
struct spi_config cfg = {
.frequency = 1000000, // 1MHz
.operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(8) |
SPI_MODE_CPOL | SPI_MODE_CPHA,
.slave = 0,
};
3.2 使用示例
1).配置SPI模式0 (CPOL=0, CPHA=0)
.operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(8) |
SPI_TRANSFER_MSB // 默认就是模式0
2)配置SPI模式1 (CPOL=0, CPHA=1)
.operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(8) |
SPI_MODE_CPHA
3)配置SPI模式2 (CPOL=1, CPHA=0)
.operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(8) |
SPI_MODE_CPOL
4)配置SPI模式3 (CPOL=1, CPHA=1)
.operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(8) |
SPI_MODE_CPOL | SPI_MODE_CPHA