第1章 SPI协议基础:从物理层到模式选择

各位同学,咱们今天正式开讲SPI。说实话,SPI这协议看着简单,但坑不少。我这些年做嵌入式驱动,光是在SPI时序上栽过的跟头,两只手都数不过来。不过别怕,咱们从最底层开始,把每个细节都掰开揉碎了讲清楚。

1.1 SPI总线简介

SPI,全称Serial Peripheral Interface,串行外设接口。它是Motorola公司在上世纪80年代推出的,初衷很简单——给微控制器和外围设备之间搭一条高速通道。

你想想看,I2C虽然省引脚,但速度上不去;UART虽然简单,但只能点对点。SPI正好卡在中间:速度快、结构简单、支持多设备。我最早接触SPI是在一个数据采集项目上,ADC芯片要求10MHz时钟,当时I2C最高才400kHz,根本跑不动。换了SPI,问题迎刃而解。

SPI的核心特点:

  • 全双工通信——发送和接收可以同时进行
  • 主从架构——一个Master控制多个Slave
  • 同步传输——所有操作由时钟驱动
  • 速度上限高——轻松跑到几十MHz

SPI的物理连接只有四条线,但就是这四条线,撑起了无数嵌入式系统的数据交换。咱们接下来一条一条拆解。

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 片选信号,低电平有效

这里有个细节我特别想强调:SCLK永远由Master产生。这意味着什么?意味着从设备不能主动发起通信,它只能被动响应。我在一个项目中遇到过从设备想主动上报数据的情况,结果发现SPI根本做不到——最后只能加了一条中断线来通知Master轮询。

再说CS片选。它通常是低电平有效,也就是说CS拉低时,对应的从设备被选中。多个从设备共享SCLK、MOSI、MISO,但每个从设备有自己的CS线。我曾经犯过一个低级错误:两个从设备的CS连到了同一个GPIO上,结果两个设备同时响应,总线冲突,数据全乱了。

个人经验:画PCB时,MOSI和MISO的走线尽量等长。高频下,这两条线的延迟差异会导致采样错误。我在一个20MHz的项目上吃过这个亏,后来加长了短的那条线才解决。

1.3 SPI四种工作模式详解

SPI的模式,说白了就是时钟极性和时钟相位的组合。这两个参数决定了数据在时钟的哪个边沿被采样、哪个边沿被改变。

  • CPOL(Clock Polarity):时钟极性,决定空闲时SCLK的电平
    • CPOL=0:空闲时SCLK为低电平
    • CPOL=1:空闲时SCLK为高电平
  • CPHA(Clock Phase):时钟相位,决定数据在哪个边沿采样
    • CPHA=0:第一个边沿采样(上升沿或下降沿取决于CPOL)
    • CPHA=1:第二个边沿采样

组合起来就是四种模式。我刚开始学的时候,总觉得这玩意儿很抽象。后来我画了一张图,一下子就明白了。咱们直接看SVG:

SPI四种工作模式时序对比 模式0 (CPOL=0, CPHA=0) SCLK 采样点 模式1 (CPOL=0, CPHA=1) SCLK 采样点 模式2 (CPOL=1, CPHA=0) SCLK 采样点 模式3 (CPOL=1, CPHA=1) SCLK 采样点 时序解读: • 红色圆点表示数据采样时刻 • 模式0和模式3最常用,大多数SPI Flash和ADC都支持 • 模式0:空闲低电平,上升沿采样,下降沿输出 • 模式3:空闲高电平,下降沿采样,上升沿输出 • 模式1和模式2较少见,但某些传感器会用到 • 我建议:先查从设备数据手册,确认它支持哪种模式 • 如果手册没写,用逻辑分析仪抓一下原厂驱动波形,一看便知

看到这张图,你应该能理解为什么模式0和模式3最常用了吧?它们的数据采样点都在时钟的上升沿或下降沿,时序窗口比较宽松。模式1和模式2的采样点在第二个边沿,对建立时间和保持时间的要求更苛刻。

避坑指南:我曾经在一个项目里,主控用模式0,从设备默认模式3。结果通信时好时坏,数据偶尔错位。用示波器一看,采样点刚好落在数据跳变的边沿上。后来我把主控改成模式3,问题立刻消失。记住:主从设备的模式必须一致,否则数据采样会出错。

1.4 模式选择实战建议

说了这么多理论,咱们来点实际的。怎么确定你的设备该用哪种模式?

  1. 查数据手册——这是最靠谱的方法。手册里通常会写明支持的SPI模式,或者直接给出时序图。
  2. 看默认配置——很多从设备出厂时默认是模式0或模式3。如果你不确定,先试试模式0。
  3. 用逻辑分析仪抓波形——如果你有原厂的参考代码或开发板,直接抓一下波形,看采样点在哪。
  4. 试错法——实在不行,四种模式挨个试。能正常通信的那个就是对的。

我个人习惯是:优先用模式0。因为大多数SPI Flash、ADC、DAC、传感器都支持模式0。如果模式0不行,再试模式3。模式1和模式2我几乎没用过,除非遇到特别老的芯片。

小技巧:在驱动代码里,把SPI模式做成可配置的参数。这样换从设备时,改一个宏定义就行,不用重新编译整个驱动。我在全志T113上就是这么做的,后面讲实战时会展示具体代码。

1.5 本章小结

咱们这一章把SPI协议的基础打牢了。从四线制的功能,到四种工作模式的细节,再到实际选型的建议。这些东西看着简单,但每一个细节都可能成为你调试时的拦路虎。