简单记录一下spi的四种mode

文章介绍了SPI通信协议中的四种模式,由时钟极性CPOL和时钟相位CPHA组合而成。CPOL定义了时钟空闲时的电平,CPHA定义了数据在时钟边沿的哪个时刻被采样。通过对这两个参数的不同设置,形成了mode0至mode3的四种工作模式,文中通过图表详细解释了每种模式的特点和采样时机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0 前言

最近在学习SPI,刚开始接触四种mode的时候,还有点懵,也是搜了好几个博客,才算搞懂,特此记录下,防止下次又要翻好几篇博客才找到答案 >_<

1 四种mode的组成单元

这四种mode是由时钟极性时钟相位组成,2 bits数据刚好组成4种情况,

  • 时钟极性CPOL(Clock POLarity):即SPI空闲时,时钟信号SCLK的电平

    • 0:空闲时低电平
    • 1:空闲时高电平
  • 时钟相位CPHA(Clock PHAse):即SPI在SCLK第几个边沿采样数据

    • 0:第一个边沿
    • 1:第二个边沿

时钟极性就不多说了,描述的很清楚了

时钟相位中说的第一个边沿和第二边沿是这样理解的,简单画一个clk信号,如下图

从图中可以看到,这个clk有两个边沿,红色的上升沿,和绿色的下降沿

从左往右看去,第一个边沿是上升沿(红色),第二个边沿是下降沿(绿色),所以在这种情况下

  • CPHA = 0,表示在clk上升沿采样

  • CPHA = 1,表示在clk下降沿采样

2 四种mode

很多介绍spi四种mode时用的都是下面这种图,虽然简洁,但不利于新手理解(别问我是怎么知道的)

列个表给出四种mode

CPOLCPHA
00mode 0
01mode 1
10mode 2
11mode 3

2.1 mode 0

mode 0表示:空闲的时候是低电平,在上升沿采样,如下图所示,在红色虚线处采样

image-20230514121627754

2.2 mode 1

mode 1表示:空闲的时候是低电平,在下降沿采样,如下图所示,在红色虚线处采样

2.3 mode 2

mode 2表示:空闲时是高电平,在下降沿采样,如下图所示,在红色虚线处采样

2.4 mode 3

mode 3表示:空闲的时候是高电平,在上升沿采样,如下图所示,在红色虚线处采样

### SPI 模式的解释及其在嵌入式系统中的配置 SPI(Serial Peripheral Interface)是一种同步串行通信接口,广泛应用于微控制器与外围设备之间的数据传输。以下是关于 SPI 配置和工作模式的相关说明: #### 1. **SPI 工作模式** SPI 协议定义了四种不同的工作模式(Mode),由时钟极性和相位决定: - **CPOL(Clock Polarity, 时钟极性)**: 定义空闲状态下的时钟电平。 - CPOL=0 表示空闲状态下时钟为低电平。 - CPOL=1 表示空闲状态下时钟为高电平。 - **CPHA(Clock Phase, 时钟相位)**: 定义采样时刻相对于时钟边沿的位置。 - CPHA=0 表示第一个时钟边沿进行采样。 - CPHA=1 表示第二个时钟边沿进行采样。 这四个组合形成了四种子模式(Mode 0 到 Mode 3)。例如,在某些应用中可能需要设置为主机模式并选择特定的工作模式[^5]。 #### 2. **SPI 配置参数** 在嵌入式系统中,通常通过寄存器或驱动程序 API 来完成 SPI 的初始化和配置。主要涉及以下几个方面: - **波特率(Baud Rate)**: 控制数据传输速度。 - **字长度(Word Length)**: 数据帧的大小,常见的有 8 位、16 位等。 - **主/从模式(Master/Slave Mode)**: 主设备控制时钟信号,而从设备被动响应。 - **片选信号(Chip Select, CS 或 SS)**: 确定当前正在通信的外设。 以下是一个典型的 SPI 初始化代码示例(基于 STM32 微控制器): ```c void spi_init(void) { // 设置 GPIO 引脚为 SPI 功能 GPIO_InitTypeDef gpio_init; gpio_init.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; // SCK, MISO, MOSI gpio_init.Mode = GPIO_MODE_AF_PP; gpio_init.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &gpio_init); // 配置 SPI 参数 SPI_HandleTypeDef hspi1; hspi1.Instance = SPI1; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; // 波特率分频因子 hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 双向通信 hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL=0 hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA=0 hspi1.Init.NSS = SPI_NSS_SOFT; // 软件管理 NSS hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // MSB 先传 HAL_SPI_Init(&hspi1); } ``` 上述代码展示了如何配置 SPI 接口以适应不同应用场景的需求。 #### 3. **SPI 在嵌入式系统中的典型用途** SPI 常用于连接各种传感器、存储器和其他外设。例如: - 使用 JTAG 接口调试目标板时,可以通过 LPCScrypt 提供的支持工具链完成编程操作[^2]。 - 实现网络协议栈与硬件层交互时,可以借助 `ethernet_input()` 函数处理接收到的数据包,并将其传递给上层协议堆栈[^3]。 此外,对于实时操作系统环境下的开发项目来说,支持 RTOS-aware 插件能够显著提升调试效率[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值