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总线 → 控制寄存器配置 → 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_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深度误判导致的数据溢出问题。