1.概述
1.1 QSPI 模块定位
QSPI(Queued Synchronous Peripheral Interface)是 TC3xx 平台的高速同步串行通信外设,物理层兼容标准 4 线 SPI,但在数据传输层之上叠加了队列化配置支持(Queue Support)。它位于应用层(CPU / DMA)与片外 SPI 设备之间,核心职能是:将软件以待发送数据流的形式写入 FIFO,由硬件自动识别其中的"配置段"与"数据段",按配置生成对应时序并完成对外收发。
从系统视角看,QSPI 在 TC3xx 外设体系中的位置:

为什么需要 Queue Support:
汽车 ECU 中,一个 MCU 常常通过同一 SPI 总线挂多个外设(ADC、PMIC、驱动器、EEPROM 等),每个外设的时钟频率、CPOL/CPHA、帧长、片选均不同。标准 SPI 控制器切换设备时必须停发、改写全局配置寄存器、再开启,这在中断窗口紧张或需要背靠背传输的场景中带来不可接受的空闲周期和 CPU 开销。QSPI 把"下一帧的配置"与"下一帧的数据"一起排队进 FIFO,由硬件自动按序切换——这就是 Queue Support 存在的根本原因。
1.2 内部结构总览
TC3xx 手册给出了 QSPI 的两个核心结构视图,分别从"宏观数据通路"和"队列配置"两个视角刻画同一模块。

模块由四个功能域构成:


这张图回答了一个关键问题——"QSPI 是如何做到帧与帧之间免配置切换的":
TXFIFO 内同时存放 BACON(32-bit 基础配置)和 DATA(数据) 两种条目,由模块内部标记区分。
每个 BACON 自身的 CS z 字段索引到对应的 ECONz 扩展寄存器(ECON0 对应 SLSO0 和 SLSO8、ECON1 对应 SLSO1 和 SLSO9,依此类推)。
当队列弹出一个 BACON 时,硬件自动从相应的 ECONz 中拉取 ABC/CON 等扩展时序参数,与 BACON 合成完整的 32+bit 配置;下一个 DATA 到达时按新配置发送。
一次 DMA 突发写入多组 BACON+DATA,硬件即可连续发出多帧、每帧可能不同的片选和时序,全程不需要 CPU 干预。
关键事实:
BACON 是 32-bit 的"基础配置",ECONz 提供"扩展配置",二者共同定义一个 SPI 帧。
ECONz 8 个寄存器覆盖 16 个 SLSO,即每个 ECON 同时服务于 SLSO z 和 SLSO z+8,通过 BACON 中 bit 3:0 的索引选择。
BACON 与 DATA 严格按 FIFO 顺序出队;如果 BACON 后没有数据,它会保持 pending,直到下一个数据到达。
1.3 主要特性列表
下表按逻辑分组,列出 QSPI 完整特性——这是判断 QSPI 能做什么、不能做什么的硬边界:
工作模式:
①主模式/从模式
②全双工/半双工
③自动片选控制(SLSO 自动生成)
④四线制/三线制连接
数据格式:
①可编程数据位宽:2-32 bit(加奇偶校验后 3–33 bit)
②可编程移位方向:LSB 优先/MSB 优先
③可编程时钟极性 CPOL:空闲低电平/空闲高电平
④可编程时钟相位 CPHA:前导边沿移位/后沿移位
波特率:由高精度 PLL 时钟 产生,与系统 PLL 异步——意味着 QSPI 可以在系统时钟被整个 ECU 缩放时,保持通信速率不变
中断来源:
①Transmitter FIFO 事件(空、水位、underflow)
②Receiver FIFO 事件(满、水位、overflow)
③错误事件(接收错误、波特率错误、发送错误、奇偶错误)
④相位跳转事件(帧开始、帧结束等)
配置/控制手段:
①DMA 协同:BACON 和 DATA 都可经 DMA 通道装载到 TXFIFO
②灵活引脚:差分 Pad 支持,适合高波特率、EMC 严苛环境
③硬件奇偶:无/奇/偶三种
④从模式 7 个 SLSI 输入(SLSIB–SLSIH)支持多个主设备
⑤主模式 16 个可编程 SLSO 输出(SLSO0–SLSO15):每路可独立配置 active level、enable、时序、支持外部 demultiplexing 扩展到更多从设备
复位能力:
①软件复位仅状态机
②软件复位整个模块(双 FIFO + 寄存器 + 状态机)
③从模式下波特率错误时自动停止状态机
其他:
①回环模式(Loop-Back):MTSR 内部回送到 MRST,用于不依赖外部设备的自诊断
②与 Infineon 的 SSC、USIC 模块及主流商用 SPI 器件完全互操作
1.4 与标准 SPI 的差异

2.AUTOSAR SPI MCAL层
2.1 架构定位
在 AUTOSAR CP 架构中,SPI 驱动的正式名称是 SPI Handler/Driver,属于 MCAL(Microcontroller Abstraction Layer) 的标准化模块。它向上为复杂驱动(CDD)、系统服务、通信栈提供 SPI 总线访问服务,向下通过寄存器操作或 DMA 直接控制 QSPI 硬件。

核心设计目标:
①多通道、多设备、多时序的统一抽象
②同步/异步传输的语义统一
③支持 DMA 批量传输以释放 CPU
④提供序列级的回调与错误处理
2.2 三级功能级别
AUTOSAR SPI 按实时性需求分三级,工程上按硬件资源和 CPU 负载选择:

2.3 三层抽象

Channel 是最小数据单元,定义了:
①数据宽度(8/16/32 bit)
②默认数据(当未提供源指针时使用)
③缓冲区类型:EB(External Buffer)或 IB(Internal Buffer)
④关联的 Job
Job 定义了一次完整的 SPI 通信参数组,包含:
①目标设备(CS 片选)
②传输优先级(0-3,3 最高)
③波特率、时钟极性/相位、数据位宽
④包含的 Channel 列表
Sequence 将多个 Job 按优先级排序后批量执行,相当于命令链。
2.4 缓冲区类型

3.关键 API
3.1 Spi_Init() / Spi_DeInit()
void Spi_Init(const Spi_ConfigType* ConfigPtr);
void Spi_DeInit(void);
Spi_Init() 必须在任何传输 API 前调用
Spi_DeInit() 停止所有传输并释放硬件资源
3.2 数据传输(IB 通道)
Std_ReturnType Spi_WriteIB(Spi_ChannelType Channel, const Spi_DataBufferType* DataBufferPtr);
Std_ReturnType Spi_ReadIB(Spi_ChannelType Channel, Spi_DataBufferType* DataBufferPtr);
Spi_WriteIB():将数据写入 QSPI 内部 TX FIFO
Spi_ReadIB():从 QSPI 内部 RX FIFO 读取接收数据
3.3 数据传输(EB 通道)
Std_ReturnType Spi_SetupEB(Spi_ChannelType Channel,
const Spi_DataBufferType* SrcDataBufferPtr,
Spi_DataBufferType* DesDataBufferPtr,
Spi_NumberOfDataType Length);

Spi_SetupEB() 只设置缓冲区指针,不触发传输。真正启动由 Spi_AsyncTransmit() 触发。
3.4 异步传输启动
Std_ReturnType Spi_AsyncTransmit(Spi_SequenceType Sequence);
①启动指定的 Sequence,包含其中所有 Job
②调用者不被阻塞(异步非阻塞)
③需要通过查询或回调获取结果
3.5 结果查询
Spi_StatusType Spi_GetStatus(void);
Spi_StatusType Spi_GetHWUnitStatus(Spi_HWUnitType HWUnit);
Spi_JobResultType Spi_GetJobResult(Spi_JobType Job);
Spi_SeqResultType Spi_GetSequenceResult(Spi_SequenceType Sequence);

3.6 取消传输
void Spi_Cancel(Spi_SequenceType Sequence);
①终止当前正在执行的 Sequence
②硬件 FIFO 清空,驱动回到 IDLE 状态
4.TC3xx EB配置详解
①General

执行特权级*:TC3xx 的 CLC(Clock Control)、OCS(OCDS Control)、ACCEN 等寄存器受 ENDINIT/protection 保护,写必须 supervisor。

②SpiDemEventParameter
DEM(Diagnostic Event Manager)事件映射容器,用于将 SPI 驱动检测到的运行时硬件错误上报到 AUTOSAR 诊断栈,最终生成 DTC(Diagnostic Trouble Code)存储在故障存储器中,一般不做配置。
③SpiMaxChannel/Job/Sequence
Channel/Job/Sequence数量上限配置容器,定义该 ECU 中 SPI 驱动的实例总数。
④SpiExternalDevice
外设特性定义容器,描述每个 SPI 从设备的电气特性和通信参数。它是 Job 的底层绑定对象,一个 ExternalDevice 对应一个物理外设(如 Flash、传感器、驱动器)。



后续的容器和波特率和时序有关,一般而言项目中会用硬件自动配置,精度和稳定性都更好,此处不展开。
⑤SpiJob

⑥SpiChannel


⑦SpiSequence
和Channel/Job配置类似,不再展开。
⑧SpiHwConfiguration
QSPI 硬件实例配置容器,定义每个 QSPI 模块的底层硬件参数和引脚映射。这是 AUTOSAR 抽象层与 TC3xx 物理硬件的直接对接点。

若需要配置DMA模式,再去SpiHwDmaConfigurationQspi中绑定即可。





