3. AURIX SPI模块架构:QSPI模块介绍

好,咱们今天聊聊AURIX的SPI模块。说实话,我第一次接触英飞凌的QSPI时,心里还嘀咕——不就是个SPI吗,能有多复杂?结果一翻开手册,好家伙,这玩意儿比我想象的聪明多了。

QSPI,全称是Queued SPI,翻译过来就是「带队列的SPI」。你想想看,普通的SPI一次只能发一个字节,发完还得等CPU来取。但QSPI不一样,它自己就能管理一串数据传输任务。我个人习惯叫它「智能SPI」,因为确实省心。

3.1 QSPI模块的核心特性

AURIX的QSPI模块有几个让我印象深刻的点:

  • 多队列支持:每个QSPI模块可以管理多个传输队列,说白了就是能提前排好队
  • 自动片选控制:硬件自动拉高拉低CS信号,不用软件操心
  • 灵活的帧格式:支持8位、16位、32位数据宽度,甚至还能自定义
  • 全双工/半双工:根据外设需求灵活切换

我在项目中遇到过一个问题:用普通SPI驱动一个ADC芯片,每次采样都要CPU介入,结果CPU忙得团团转。后来换成QSPI的队列模式,把采样命令排好队,QSPI自己就搞定了,CPU终于能喘口气了。

重点提醒:QSPI不是简单的SPI升级版,它本质上是一个带状态机的硬件加速器。你配置好队列,它自己就跑起来了。

3.2 FIFO与缓冲区管理

说到FIFO,我得先吐槽一下。很多初学者觉得FIFO就是个先进先出的缓存,没啥好讲的。但AURIX的QSPI FIFO设计得挺讲究。

每个QSPI模块都有独立的发送FIFO和接收FIFO。深度一般是8个条目,每个条目可以存32位数据。嗯,这里要注意:FIFO深度虽然只有8,但配合队列使用,效果完全不一样。

FIFO类型深度数据宽度作用
发送FIFO (TX FIFO)832位缓存待发送数据
接收FIFO (RX FIFO)832位缓存接收到的数据

我个人的经验是:FIFO的填充策略很关键。如果你一次只发一个字节,FIFO的优势体现不出来。但如果你连续发多个字节,FIFO就能起到「蓄水池」的作用,防止数据断流。

实用技巧:配置FIFO中断阈值时,建议设成半满。比如发送FIFO深度8,阈值设成4。这样FIFO里还剩4个空位时就会触发中断,你赶紧往里填数据。我曾经设成1,结果中断太频繁,CPU反而更忙了。

3.3 中断与DMA支持

QSPI的中断系统,说白了就是给你几个「闹钟」:

  • 发送FIFO空中断:FIFO里没数据了,赶紧塞
  • 接收FIFO满中断:FIFO里数据满了,赶紧取
  • 传输完成中断:整个队列跑完了,通知你
  • 错误中断:比如溢出、帧错误等

但说实话,如果数据量不大,用中断就够了。一旦数据量大起来,比如你要刷一个OLED屏幕,每秒传几万个字节,中断就扛不住了——每次进中断都要保存恢复上下文,开销太大。

这时候就该DMA上场了。AURIX的DMA模块可以直接和QSPI的FIFO对接。你配置好DMA通道,告诉它「从内存地址A搬数据到QSPI的发送FIFO,搬完N个字节就停」,然后DMA自己就干活了,CPU完全不用管。

我曾经踩过的坑:DMA和QSPI的握手信号一定要配对。有一次我配错了DMA请求源,结果DMA一直不触发,QSPI干等着。查了两天才发现是DMA的触发源选成了别的外设。所以配置时一定要确认DMA请求线号对不对。

3.4 时钟分频与极性和相位配置

时钟这块,其实没那么玄乎。QSPI的时钟源来自系统时钟,经过分频后得到SPI时钟。分频系数可以配成2、4、6、8...一直到512。公式很简单:

SPI时钟频率 = 系统时钟频率 / (2 × 分频系数)

举个例子,如果系统时钟是100MHz,分频系数配成4,那SPI时钟就是100 / (2×4) = 12.5MHz。

至于极性和相位,也就是CPOL和CPHA,这两个参数决定了时钟信号在空闲时是高还是低,以及数据是在时钟上升沿还是下降沿采样。

CPOLCPHA模式说明
00模式0空闲低电平,上升沿采样
01模式1空闲低电平,下降沿采样
10模式2空闲高电平,下降沿采样
11模式3空闲高电平,上升沿采样

我个人习惯是先看外设的数据手册,上面会明确写「支持模式0和模式3」之类的。千万别自己猜,猜错了通信就是乱码。我曾经帮一个同事排查问题,他配成了模式2,但外设只支持模式0,结果读出来的数据全是0xFF。改过来就好了。

避坑指南:如果你不确定外设支持哪种模式,优先试模式0。因为大部分SPI外设默认都支持模式0,兼容性最好。

好了,关于QSPI模块的架构就聊到这儿。下一节咱们会深入代码层面,看看怎么实际配置这些寄存器。记住一句话:QSPI是个好工具,但前提是你得把它配对了。