第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 | 采样边沿 | 空闲时钟电平 |
|---|---|---|---|---|
| 模式0 | 0 | 0 | 上升沿 | 低电平 |
| 模式1 | 0 | 1 | 下降沿 | 低电平 |
| 模式2 | 1 | 0 | 下降沿 | 高电平 |
| 模式3 | 1 | 1 | 上升沿 | 高电平 |
我个人习惯:调试时先看空闲时钟电平,确定CPOL;再看第一个边沿是采样还是切换数据,确定CPHA。这样不容易乱。
我在项目中遇到过一件事:某次对接一个老款传感器,手册上写的是“模式2”,结果我按模式0配的,波形死活对不上。后来发现,那个传感器实际用的是模式3。你想想看,这种坑多冤枉。
1.2 主从机通信流程
SPI通信是典型的主从架构。主机(Master)负责产生时钟和片选信号,从机(Slave)被动响应。
基本流程是这样的:
- 主机拉低片选信号(CS/SS),选中目标从机
- 主机开始产生SCK时钟
- 主机通过MOSI线发送数据,同时通过MISO线接收从机数据
- 数据传输完成后,主机拉高片选信号,结束本次通信
注意: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协议的核心脉络串起来。你可以把它当作本章的“思维导图”。
嗯,这张图把咱们今天讲的三块内容串起来了。你仔细看看,模式、流程、帧格式,其实是三位一体的。任何一个地方理解错了,后面写FIFO控制逻辑都会出问题。
1.5 小结
今天咱们回顾了SPI协议的三个核心点:
- 4种模式由CPOL和CPHA组合决定,采样边沿和空闲电平要对应好
- 主从通信流程中,片选和时钟的时序是关键,多从机场景注意高阻态
- 数据帧格式灵活,但一定要和从机手册保持一致
下一节课,咱们会深入SPI控制器的内部结构,看看FIFO到底是怎么嵌入进去的。到时候你会发现,今天讲的这些基础,全是硬核干货。