第1章:SPI协议回顾 — 4种模式、主从通信与数据帧格式

各位同学好,我是你们的芯片验证工程师老K。今天咱们正式进入《SPI控制器中的FIFO应用实战》课程。

第一节课,我打算带大家快速回顾一下SPI协议的核心内容。你可能会说:“SPI谁不会啊?” 嗯,别急。我见过太多工程师,写代码时把CPOL和CPHA搞反,结果调了三天波形才发现问题。所以,咱们还是老老实实把基础打牢。

1.1 SPI的4种模式:CPOL与CPHA

SPI有4种工作模式,由两个参数决定:CPOL(时钟极性)和CPHA(时钟相位)。

  • CPOL = 0:空闲时时钟为低电平
  • CPOL = 1:空闲时时钟为高电平
  • CPHA = 0:数据在时钟的第一个边沿采样(上升沿或下降沿,取决于CPOL)
  • CPHA = 1:数据在时钟的第二个边沿采样

说白了,这4种模式就是主设备和从设备约定好“什么时候看数据线”。

模式 CPOL CPHA 采样边沿 空闲时钟电平
模式000上升沿低电平
模式101下降沿低电平
模式210下降沿高电平
模式311上升沿高电平
我个人习惯:调试时先看空闲时钟电平,确定CPOL;再看第一个边沿是采样还是切换数据,确定CPHA。这样不容易乱。

我在项目中遇到过一件事:某次对接一个老款传感器,手册上写的是“模式2”,结果我按模式0配的,波形死活对不上。后来发现,那个传感器实际用的是模式3。你想想看,这种坑多冤枉。

1.2 主从机通信流程

SPI通信是典型的主从架构。主机(Master)负责产生时钟和片选信号,从机(Slave)被动响应。

基本流程是这样的:

  1. 主机拉低片选信号(CS/SS),选中目标从机
  2. 主机开始产生SCK时钟
  3. 主机通过MOSI线发送数据,同时通过MISO线接收从机数据
  4. 数据传输完成后,主机拉高片选信号,结束本次通信

注意:SPI是全双工通信。主机发一个bit的同时,从机也发一个bit。所以每次传输,双方都在交换数据。

避坑指南:我曾经在验证一个多从机系统时,发现从机A的数据总是被从机B干扰。查了半天,原来是片选信号没处理好——从机A的CS拉高后,它的MISO没有变成高阻态。记住:多从机场景下,未选中的从机MISO必须高阻!

1.3 数据帧格式

SPI的数据帧格式其实很灵活。常见的配置有:

  • 数据位宽:通常是8位,但也支持4位、12位、16位、32位等
  • MSB还是LSB优先:大部分器件默认MSB first,但有些奇葩器件用LSB first
  • 连续传输 vs 非连续传输:连续传输时,CS一直拉低,SCK连续输出;非连续传输时,每传完一个字节CS会拉高再拉低

举个典型的8位数据帧例子(模式0):

// 伪代码示例:SPI发送一个字节(模式0)
spi_cs_low();                    // 拉低片选
for (i = 7; i >= 0; i--) {
    spi_sck_low();               // SCK置低
    spi_mosi_write(data >> i);   // 在SCK低电平时设置MOSI
    spi_sck_high();              // SCK置高,从机在上升沿采样
    // 此时可以读取MISO上的数据
}
spi_cs_high();                   // 拉高片选,结束传输
注意:上面的代码只是教学示例。实际项目中,我们通常用硬件SPI控制器来操作,而不是用GPIO模拟。但理解这个流程,对你后面理解FIFO的作用非常有帮助。

1.4 本章知识体系图

下面我用一张SVG图,把SPI协议的核心脉络串起来。你可以把它当作本章的“思维导图”。

SPI协议核心知识体系 4种模式 (CPOL/CPHA) 模式0/1/2/3 采样边沿 主从机通信流程 CS→SCK→MOSI/MISO→CS 数据帧格式 位宽/MSB-LSB/连续 三者关系:模式决定时序,流程决定行为,帧格式决定数据组织 理解这些,才能设计出正确的SPI控制器和FIFO接口

嗯,这张图把咱们今天讲的三块内容串起来了。你仔细看看,模式、流程、帧格式,其实是三位一体的。任何一个地方理解错了,后面写FIFO控制逻辑都会出问题。

1.5 小结

今天咱们回顾了SPI协议的三个核心点:

  • 4种模式由CPOL和CPHA组合决定,采样边沿和空闲电平要对应好
  • 主从通信流程中,片选和时钟的时序是关键,多从机场景注意高阻态
  • 数据帧格式灵活,但一定要和从机手册保持一致

下一节课,咱们会深入SPI控制器的内部结构,看看FIFO到底是怎么嵌入进去的。到时候你会发现,今天讲的这些基础,全是硬核干货。


可可精品资料库