3. 全志T113 SPI控制器硬件特性:FIFO深度、时钟分频、DMA支持、中断源概述

全志T113 SoC内部集成了多路SPI控制器,其硬件设计在嵌入式Linux驱动开发中具有典型的代表性。理解这些硬件特性是进行中断处理优化和读写性能调优的基础。本章将深入剖析T113 SPI控制器的核心硬件参数,包括FIFO深度、时钟分频机制、DMA支持能力以及中断源类型。

3.1 SPI控制器整体架构

T113 SPI控制器采用AMBA总线架构,挂载在APB总线上。其内部主要由时钟管理单元、FIFO缓冲区、移位寄存器、DMA接口逻辑以及中断控制逻辑组成。下图展示了控制器的内部模块关系:

全志T113 SPI控制器内部架构图 APB 总线接口 时钟管理单元 时钟分频 / 使能 控制寄存器组 模式 / 极性 / 相位 中断控制逻辑 TX/RX/ERR 中断源 FIFO 缓冲区 (64字节) 发送 FIFO (32B) | 接收 FIFO (32B) 移位寄存器 & 波特率发生器 8/16/32-bit 数据宽度 DMA 接口 (支持双通道: TX + RX)
架构要点: T113 SPI控制器内部数据路径为:APB总线 → 控制寄存器配置 → FIFO缓冲 → 移位寄存器串行输出。中断和DMA是两条并行的数据搬运通道,驱动开发者需要根据传输大小选择合适的搬运方式。

3.2 FIFO深度与数据流控制

FIFO(First In First Out)是SPI控制器内部用于暂存收发数据的缓冲区,其深度直接影响中断触发频率和CPU负载。T113 SPI控制器的FIFO设计如下:

参数项 规格值 说明
总FIFO深度 64字节 物理上为单一64B RAM,逻辑上分为发送和接收两部分
发送FIFO (TX FIFO) 32字节 用于暂存待发送的数据,支持8/16/32位数据宽度
接收FIFO (RX FIFO) 32字节 用于暂存接收到的数据,支持8/16/32位数据宽度
FIFO触发阈值 可编程 (1/4, 1/2, 3/4, 满) 决定中断何时触发,影响中断响应频率
溢出保护 硬件自动丢弃溢出数据 RX FIFO满时新数据被丢弃,需软件及时读取
性能影响: 32字节的FIFO深度意味着在中断模式下,每次中断最多可以处理32字节的数据。对于小于32字节的传输,可以一次中断完成;对于大块数据(如1KB),则需要多次中断配合。FIFO阈值设置过低会导致中断频繁,增加CPU开销;设置过高则可能造成数据溢出或响应延迟。

3.3 时钟分频与波特率生成

SPI的通信速率由时钟分频决定。T113 SPI控制器从APB总线获取时钟源,通过内部可编程分频器生成SCLK。时钟分频结构如下:

SPI时钟分频链路 APB时钟 (200MHz) 预分频器 (2~256) 波特率发生器 SCLK 输出 (SPI_CLK) SCLK = APB_CLK / (2 × CDR) CDR: 时钟分频寄存器值

时钟分频寄存器(SPI_CLK_CDR)的配置方式如下:

/* 时钟分频寄存器位域定义 */
#define SPI_CLK_CDR2_MASK       (0xFF << 8)  /* 分频系数2 (bit15:8) */
#define SPI_CLK_CDR1_MASK       (0x0F << 0)  /* 分频系数1 (bit3:0) */

/* 常用分频配置宏 */
#define SPI_CLK_DIV_2           (0x1000)  /* 200MHz / 2 = 100MHz */
#define SPI_CLK_DIV_4           (0x2000)  /* 200MHz / 4 = 50MHz  */
#define SPI_CLK_DIV_8           (0x3000)  /* 200MHz / 8 = 25MHz  */
#define SPI_CLK_DIV_16          (0x4000)  /* 200MHz / 16 = 12.5MHz */
#define SPI_CLK_DIV_32          (0x5000)  /* 200MHz / 32 = 6.25MHz */
#define SPI_CLK_DIV_64          (0x6000)  /* 200MHz / 64 = 3.125MHz */
#define SPI_CLK_DIV_128         (0x7000)  /* 200MHz / 128 = 1.5625MHz */
时钟配置注意事项: T113 SPI最高支持100MHz的SCLK输出,但实际速率受限于从设备规格和PCB走线质量。在驱动中配置时钟分频时,需要确保计算出的SCLK不超过从设备支持的最大频率,同时也要考虑信号完整性。过高的时钟速率可能导致数据采样错误。

3.4 DMA支持与传输模式

T113 SPI控制器内置DMA接口,支持与DMA控制器直接连接,实现数据的高速后台搬运。DMA支持是提升大块数据传输性能的关键特性。

DMA特性 支持情况 详细说明
DMA通道数 2个独立通道 TX通道和RX通道可独立配置,支持全双工DMA传输
数据宽度 8/16/32位 与SPI数据宽度一致,DMA传输宽度自动匹配
突发传输 支持 (Burst Length可配) 支持4/8/16字节突发,减少总线占用
传输完成中断 支持 DMA传输完成后触发中断,通知CPU处理
FIFO阈值联动 硬件自动控制 DMA根据FIFO空/满状态自动启停

三种传输模式的对比:

传输模式 适用场景 CPU负载 吞吐量 延迟
轮询模式 小数据量 (< 32字节) 高 (CPU忙等) 低 低 (无中断延迟)
中断模式 中等数据量 (32~1024字节) 中 (每次中断处理) 中 中 (中断响应延迟)
DMA模式 大数据量 (> 1024字节) 低 (仅启动和完成) 高 高 (DMA配置开销)
性能调优建议: 在实际驱动开发中,建议根据传输长度动态选择传输模式。例如,小于32字节使用轮询,32~256字节使用中断,大于256字节使用DMA。这种混合策略可以在延迟和吞吐量之间取得最佳平衡。

3.5 中断源概述

T113 SPI控制器支持多种中断源,驱动开发者需要根据实际需求使能相应中断。下表列出了所有可用的中断源及其触发条件:

中断标志位 中断名称 触发条件 典型用途
TX_FIFO_EMPTY 发送FIFO空中断 TX FIFO中数据量低于阈值 通知CPU向FIFO写入新数据
RX_FIFO_FULL 接收FIFO满中断 RX FIFO中数据量达到阈值 通知CPU从FIFO读取数据
TX_FIFO_OVERFLOW 发送FIFO溢出中断 向已满的TX FIFO写入数据 错误处理,防止数据丢失
RX_FIFO_UNDERFLOW 接收FIFO下溢中断 从空的RX FIFO读取数据 错误处理,防止读取无效数据
TX_DMA_DONE DMA发送完成中断 DMA完成所有发送数据搬运 通知CPU发送结束
RX_DMA_DONE DMA接收完成中断 DMA完成所有接收数据搬运 通知CPU接收结束
SPI_ERROR SPI错误中断 模式错误、帧错误等 异常处理,恢复SPI状态

中断使能寄存器配置示例:

/* 中断使能寄存器位定义 */
#define SPI_INT_EN_TX_EMPTY     (1 << 0)  /* 发送FIFO空中断使能 */
#define SPI_INT_EN_RX_FULL      (1 << 1)  /* 接收FIFO满中断使能 */
#define SPI_INT_EN_TX_OVF       (1 << 2)  /* 发送溢出中断使能 */
#define SPI_INT_EN_RX_UNF       (1 << 3)  /* 接收下溢中断使能 */
#define SPI_INT_EN_TX_DMA_DONE  (1 << 4)  /* DMA发送完成中断使能 */
#define SPI_INT_EN_RX_DMA_DONE  (1 << 5)  /* DMA接收完成中断使能 */
#define SPI_INT_EN_ERR          (1 << 6)  /* 错误中断使能 */

/* 中断模式下的典型使能配置 */
#define SPI_INT_MODE_ENABLE     (SPI_INT_EN_TX_EMPTY | \
                                 SPI_INT_EN_RX_FULL  | \
                                 SPI_INT_EN_ERR)

/* DMA模式下的典型使能配置 */
#define SPI_DMA_MODE_ENABLE     (SPI_INT_EN_TX_DMA_DONE | \
                                 SPI_INT_EN_RX_DMA_DONE | \
                                 SPI_INT_EN_ERR)
中断优先级建议: 在中断服务程序中,建议优先处理RX_FIFO_FULL中断(读取数据),再处理TX_FIFO_EMPTY中断(写入数据)。这样可以避免RX FIFO溢出导致数据丢失。错误中断应设置为最高优先级,以便快速恢复SPI总线状态。

3.6 硬件特性总结

下表汇总了T113 SPI控制器的关键硬件参数,供驱动开发和性能调优时参考:

硬件特性 参数值 调优关注点
FIFO深度 64字节 (TX 32B + RX 32B) 阈值设置影响中断频率
最大SCLK 100 MHz 受从设备和PCB限制
分频范围 2 ~ 512 (偶数分频) 确保SCLK匹配从设备
DMA通道 2 (TX + RX 独立) 大数据量传输首选
中断源数量 7个 按需使能,避免中断风暴
数据宽度 8/16/32位 与从设备数据格式对齐
SPI模式 Mode 0/1/2/3 CPOL/CPHA配置
硬件勘误提醒: 部分早期版本的T113芯片存在SPI控制器FIFO深度实际为32字节(而非64字节)的勘误。在驱动初始化时,建议通过读取芯片版本寄存器或FIFO状态寄存器来确认实际深度,避免因FIFO深度误判导致的数据溢出问题。