1. SPI总线概述

大家好,我是你们的讲师。今天咱们聊聊SPI总线。说实话,在嵌入式系统里,SPI和I2C就像咱们的左膀右臂,几乎每个项目都离不开它们。我个人做AURIX开发这么多年,SPI用得尤其多——因为它简单、快、可靠。

嗯,咱们先搞清楚SPI到底是什么。

1.1 SPI协议简介

SPI,全称是Serial Peripheral Interface,串行外设接口。这玩意儿是摩托罗拉在80年代搞出来的,到现在快40年了,依然活跃在各类芯片之间。

为什么这么长寿?说白了就三个字:简单、快、省

我刚开始做嵌入式那会儿,用的还是8051单片机,那时候SPI就已经是标配了。后来转到AURIX平台,发现英飞凌对SPI模块的支持做得相当成熟——硬件FIFO、DMA传输、多从机自动选择,这些功能在AURIX TC2xx/TC3xx系列里都给你安排得明明白白。

SPI的核心特点:

  • 全双工通信:发送和接收可以同时进行,不像I2C那样半双工
  • 主从模式:一个主机控制多个从机
  • 同步通信:由主机提供时钟信号
  • 无地址机制:通过片选信号选择从机

1.2 四线制工作原理

SPI总线通常用四根线,我习惯叫它们「四剑客」:

信号线 全称 方向 作用
SCK Serial Clock 主机→从机 时钟信号,由主机产生
MOSI Master Out Slave In 主机→从机 主机发送数据给从机
MISO Master In Slave Out 从机→主机 从机发送数据给主机
CS Chip Select 主机→从机 片选信号,低电平有效

你想想看,这四根线配合起来,数据是怎么流动的?

主机先把CS拉低,告诉从机:「嘿,我要跟你说话了」。然后主机在SCK上产生时钟脉冲,每个时钟周期,主机从MOSI发一位数据,同时从机从MISO回一位数据。这就是全双工——两边同时说,同时听。

我记得有一次调试一个SPI Flash芯片,死活读不到数据。查了半天,发现是MISO和MOSI接反了。嗯,这种低级错误,谁还没犯过呢?

小技巧: 在AURIX上调试SPI时,我建议先用逻辑分析仪抓一下波形。看看SCK有没有时钟、CS有没有拉低、数据线上的电平对不对。很多时候,肉眼一看就知道问题在哪。

1.3 主从模式与多从机配置

SPI的通信模式很简单——一个主机,一个或多个从机。主机负责产生时钟、控制片选、发起通信。从机只能被动响应。

多从机配置有两种常见方式:

方式一:独立片选

每个从机单独占用一根CS线。主机想跟谁说话,就把谁的CS拉低。这种方式最常用,也最可靠。

我在AURIX TC275的项目里,挂了一个SPI Flash、一个ADC、一个LCD屏。三个从机,三根CS线,各管各的,互不干扰。

方式二:菊花链

所有从机共用一根CS线,数据从一个从机传到下一个。这种方式省IO口,但延迟大,用得少。

注意: 多从机配置时,一定要确保同一时刻只有一个从机的CS被拉低。如果两个从机同时被选中,它们的MISO会打架——一个输出高,一个输出低,直接短路。我曾经在实验室里见过一次,芯片冒烟了...嗯,从那以后我再也不敢同时拉低两个CS了。

1.4 SPI的四种模式

SPI有四种工作模式,由时钟极性(CPOL)和时钟相位(CPHA)决定:

模式 CPOL CPHA 数据采样边沿
模式0 0 0 上升沿采样
模式1 0 1 下降沿采样
模式2 1 0 下降沿采样
模式3 1 1 上升沿采样

为什么会有四种模式?因为不同的从机芯片对时钟的要求不一样。比如SPI Flash通常用模式0或模式3,而一些传感器可能用模式1。

我个人习惯的做法是:拿到一个新芯片,先看数据手册里的时序图。图上会明确标出数据是在时钟的哪个边沿采样的。然后对照上表,设置AURIX的SPI模块参数。

避坑指南: 我曾经在一个项目里,主控和从机的SPI模式没对上。主机用模式0发送数据,从机用模式3接收。结果数据全乱了,校验和永远不对。查了两天才发现是模式不匹配。所以,通信前一定要确认主从机的SPI模式一致

1.5 AURIX上的SPI实现要点

在AURIX TC2xx/TC3xx上,SPI模块叫QSPI(Queued SPI)。它比普通SPI多了个队列功能,可以自动处理多个数据帧的收发。

配置QSPI时,我一般关注这几个参数:

  • 波特率:根据从机支持的速率来设,别贪快
  • 数据位宽:通常是8位,但也有16位或32位的
  • CS控制方式:自动还是手动?我建议用自动,省心
  • 中断或DMA:大数据量传输时,DMA是首选

嗯,关于SPI的概述就先讲这么多。下一节咱们会深入AURIX的QSPI模块,手把手教你配置寄存器、写驱动代码。到时候我会拿一个实际项目中的例子——驱动SPI Flash——来演示整个流程。

你想想看,掌握了SPI,你就能跟市面上大部分传感器、存储器、显示器打交道了。这玩意儿,值得花时间搞透。