☰
【嵌入式外设精学】Day14|SPI:CPOL、CPHA 与收发一字节
2026/10/3 8:48:57 网站建设 项目流程

【嵌入式外设精学】Day14|SPI 详解:CPOL、CPHA 与单字节收发

今天解决:接屏/Flash 总要试 mode0、mode3?一次记清。


目录

  1. 问题 2. 原理 3. 代码 4. 误区 5. 自测 6. 答案

1. 问题

  • 为什么手册要写 Mode 0/3?
  • SPI 为什么比 I2C 快?

2. 原理

2.1 四根线

线作用
SCK主机产生的时钟
MOSI主机出、从机入
MISO主机入、从机出
CS片选,一般低有效

全双工,无 ACK,靠 CS 选设备。

2.2 两个旋钮

名称含义
CPOL空闲时 SCK 是 0 还是 1
CPHA在“第几个边沿”采数据

2.3 四种模式(记采样沿)

模式空闲采样时机
0低上升沿采样
1低下降沿采样
2高下降沿采样
3高上升沿采样

从机手册写哪一种,主机就配哪一种;配错会“位错位/读出来像随机”。


3. 代码示例

#include"stm32f4xx.h"uint8_tspi_xfer_byte(SPI_TypeDef*spi,uint8_tv){while(SPI_I2S_GetFlagStatus(spi,SPI_I2S_FLAG_TXE)==RESET){}SPI_I2S_SendData(spi,v);while(SPI_I2S_GetFlagStatus(spi,SPI_I2S_FLAG_RXNE)==RESET){}return(uint8_t)SPI_I2S_ReceiveData(spi);}uint8_tspi_read_reg(uint8_treg){uint8_tx;GPIO_ResetBits(GPIOB,GPIO_Pin_0);/* CS 拉低 */(void)spi_xfer_byte(SPI1,reg);x=spi_xfer_byte(SPI1,0xFF);GPIO_SetBits(GPIOB,GPIO_Pin_0);/* CS 拉高 */returnx;}

初始化时对应设 CPOL/CPHA(标准库示意):

SPI_InitTypeDef s;s.SPI_Direction=SPI_Direction_2Lines_FullDuplex;s.SPI_Mode=SPI_Mode_Master;s.SPI_DataSize=SPI_DataSize_8b;s.SPI_CPOL=SPI_CPOL_High;/* Mode 3 */s.SPI_CPHA=SPI_CPHA_2Edge;s.SPI_NSS=SPI_NSS_Soft;s.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;s.SPI_FirstBit=SPI_FirstBit_MSB;

4. 常见误区

误区正解
模式随便配必须与从机一致
MOSI/MISO 随便接主出对从入,主入对从出
多从机都让 MISO 输出只能选中的设备驱动
SPI 必然比 I2C 稳线更长/更快时也要看驱动与负载

5. 自测

  1. Mode 0 在哪个沿采样?
  2. SPI 四根线分别是什么?

6. 答案

  1. 上升沿(空闲低)。
  2. SCK、MOSI、MISO、CS。

作者:shuifanyu
标签:SPICPOLCPHA

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询