STM32与SPI通信协议

SPI通信

  • SPI是由Motorola公司开发的一种通用数据总线
  • 四根通信线:SCK、MOSI(主机输出从机输入)、MISO(主机输入从机输出)、SS
  • 同步,全双工
  • 支持总线挂载多设备(一主多从)

与IIC相比

优点:

  • SPI传输速度更快,最大传输速度取决与芯片厂商的设计需求
  • 设计简单,不复杂

缺点:

  • SPI的硬件开销大,通信线的个数比较多

  • 通信过程中,经常会有资源浪费的现象

  • 仅支持一主多从,不支持多主机

硬件电路

image-20241112211532747

  • 所有的SPI设备的SCK、MOSI、MISO分别连在一起

  • 主机另外引出多条SS控制线,分别连接各从机的SS引脚

  • 输出的引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

  • 一次只能选择一个SS引脚

  • 从机未被选中时,该从机的引脚必须切换为高阻态

数据移位示意图

image-20241112212013567

上升沿:数据移位 下降沿:采样数据

SPI时序基本单元

  • 起始条件:SS从高电平切换到低电平
  • 终止条件:SS从低电平切换到高电平

image-20241112212847743

SS在低电平期间,表示选用该从机

SPI时序图

CPHA:时钟相位

模式1

  • 交换一个字节(模式1)
  • CPOL=0:空闲状态,SCK为低电平
  • CPHA=1:SCK第一个边沿~~(即上升沿)移出数据,第二个边沿(即下降沿)~~移入数据

image-20241112213412635

SPI没有硬性规定MOSI的默认电平,但是从机的MISO必须置回高阻态

模式0(用的最多)

  • 交换一个字节(模式0)
  • CPOL=0:空闲状态,SCK为低电平
  • CPHA=1:SCK第一个边沿移~~(即上升沿)移入数据,第二个边沿(即下降沿)~~移出数据

image-20241112214036407

为什么模式0最为广泛使用,明明模式1更符合常理?经过网上查证,大概分为以下几点

  • 模式0是最早定义的SPI时序模式,兼容性强
  • 模式0采用下降沿移出数据,稳定性好
  • 很多人刚开始学的就是模式0,于是就模式0就成了默认模式了

SPI1挂载在在APB2上 SPI2和SPI3挂载在APB1上 GPIO全部都挂载在APB2上

配置时钟时要相对应

编程技巧

1
2
3
4
5
6
7
8
#define DE_BUG	1

#if	DE_BUG
	#define LED P0
#else
	#define LED P1

//通过DE_BUG来使用不同的宏
22324
使用 Hugo 构建
主题 StackJimmy 设计