SPI协议与I2C协议寄存器配置驱动开发实战 - 第1节

1.1 SPI总线概述——为什么它还在广泛使用

SPI,全称是 Serial Peripheral Interface,串行外设接口。这玩意儿是 Motorola 在八十年代搞出来的,到现在三十多年了,依然活跃在各种嵌入式板卡上。你想想看,一个协议能活这么久,肯定有它的道理。

我个人习惯把 SPI 比作「同步全双工的管道」。同步,意味着有专门的时钟线来指挥节奏;全双工,就是发数据和收数据可以同时进行。这一点跟 I2C 不一样,I2C 是半双工的,发的时候不能收,收的时候不能发。

SPI 最吸引人的地方,是它的速度。我做过一个项目,用 SPI 驱动一块 320×240 的 LCD 屏幕,时钟跑到 40MHz,刷新率完全够用。换成 I2C 的话,同样分辨率下画面会明显卡顿。所以,如果你需要高速传输,SPI 往往是首选。

核心特点速览:
  • 同步串行通信(有独立时钟线)
  • 全双工(同时收发)
  • 主从架构(一个 Master,多个 Slave)
  • 速度通常可达几十 MHz
  • 硬件实现简单,没有复杂的地址仲裁

1.2 四线制信号与时序——每条线都有自己的使命

标准的 SPI 接口有四根线,少一根都不行。我见过不少新手把 MOSI 和 MISO 接反,结果调了一整天都读不到数据。嗯,这里要注意,接线之前一定先看数据手册。

信号名 全称 方向 作用
SCLK Serial Clock Master → Slave 时钟信号,由 Master 产生,决定传输速率
MOSI Master Out Slave In Master → Slave 主设备发送数据给从设备
MISO Master In Slave Out Slave → Master 从设备发送数据给主设备
CS Chip Select Master → Slave 片选信号,低电平有效,选中某个从设备

时序上,SPI 的传输过程其实很直观:

  1. Master 把 CS 拉低,告诉对应的 Slave:「我要跟你说话」。
  2. Master 在 SCLK 的每个时钟沿上,通过 MOSI 发送一位数据。
  3. 同时,Slave 在同一个时钟沿上,通过 MISO 返回一位数据。
  4. 传输完成后,Master 把 CS 拉高,结束本次通信。

我曾经调试过一个传感器模块,发现数据总是错位。查了半天,原来是 CS 拉低之后没有等足够的时间就开始了时钟。有些从设备需要一点「准备时间」,这个在数据手册里叫 CS Setup Time,千万别忽略。

避坑指南: 多从设备共用一个 SPI 总线时,CS 必须互斥。我曾经见过有人把两个从设备的 CS 接在同一个 GPIO 上,结果两个设备同时响应,数据全乱了。每个从设备必须有自己的 CS 引脚。

1.3 SPI 的四种工作模式——CPOL 和 CPHA 决定了你的时钟长什么样

SPI 的四种模式,说白了就是时钟极性(CPOL)和时钟相位(CPHA)的排列组合。这两个参数决定了数据在时钟的哪个边沿被采样。

  • CPOL:时钟空闲时的电平。CPOL=0 表示空闲时低电平,CPOL=1 表示空闲时高电平。
  • CPHA:数据采样的边沿。CPHA=0 表示在第一个边沿采样,CPHA=1 表示在第二个边沿采样。

组合起来就是四种模式:

模式 CPOL CPHA 空闲时钟电平 数据采样边沿 数据输出边沿
模式 0 0 0 低电平 上升沿 下降沿
模式 1 0 1 低电平 下降沿 上升沿
模式 2 1 0 高电平 下降沿 上升沿
模式 3 1 1 高电平 上升沿 下降沿

你可能会问:「这么多模式,我该用哪个?」答案是:看从设备的数据手册。大多数 SPI Flash 和传感器默认用模式 0 或模式 3。我个人习惯先用模式 0 试,不行再换模式 3。因为这两种模式在逻辑上是对称的,只是时钟极性相反。

重要提醒: Master 和 Slave 的模式必须一致。如果 Master 配置成模式 0,Slave 配置成模式 3,数据采样会完全错位,读出来的数据全是乱的。我曾经在调试一块 ADC 芯片时犯过这个错,浪费了整整一个下午。

1.4 知识体系总览——一张图看懂 SPI 基础

下面这张图把 SPI 的核心知识点串在了一起。从物理层到协议层,再到驱动开发,每个环节都有对应的关键问题。

SPI 协议知识体系总览 物理层 四线制:SCLK/MOSI/MISO/CS 时序层 CPOL / CPHA 四种模式 协议层 主从架构 / 片选机制 关键参数 时钟频率 | 数据位宽(8/16/32位)| CS 建立/保持时间 | 传输顺序(MSB/LSB) 驱动开发关注点 寄存器配置 | 中断/DMA | 时钟极性设置 | 多从设备调度 调试与验证 逻辑分析仪抓波形 | 回环测试 | 数据手册对照 本章重点覆盖区域 物理层 + 时序层

从这张图可以看出来,SPI 的物理层和时序层是基础中的基础。你只有把四根线的时序关系搞清楚了,后面配置寄存器的时候才不会一头雾水。驱动开发说白了就是把这些硬件行为用代码描述出来,所以硬件理解得越深,代码写起来越顺手。

学习建议: 如果你手头有逻辑分析仪,建议抓一下 SPI 的波形,亲眼看看 CPOL 和 CPHA 对时钟和数据的影响。我当年就是这么学会的,比看一百页数据手册都管用。