ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

手把手教你配置TMS320F28335的SCI串口(从寄存器到FIFO,含完整代码)

2026/8/2 23:11:49 拓冰建站 浏览量
手把手教你配置TMS320F28335的SCI串口(从寄存器到FIFO,含完整代码)

深入解析TMS320F28335的SCI串口开发实战

第一次接触TMS320F28335的SCI模块时,面对密密麻麻的寄存器手册和复杂的配置流程,不少开发者都会感到无从下手。本文将带你从底层寄存器开始,逐步构建完整的SCI通信功能,特别针对FIFO优化和实际工程应用进行深度剖析。

1. SCI模块核心架构解析

TMS320F28335的SCI模块采用双缓冲设计,支持全双工异步通信。其核心特性包括:

  • 多通道支持:提供SCI-A、SCI-B、SCI-C三个独立通道
  • 灵活配置:可编程数据格式(8/9位数据)、停止位(1/2位)和校验方式
  • 增强功能:16级收发FIFO、自动波特率检测
  • 错误检测:内置奇偶校验、帧错误和超载检测机制

时钟配置是SCI工作的基础。以典型150MHz系统时钟为例:

// 时钟配置示例 SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // 使能SCI-A时钟 SysCtrlRegs.LOSPCP.all = 0x0002; // 低速外设时钟预分频=4

2. 寄存器配置深度剖析

2.1 关键寄存器功能详解

**SCICCR(通信控制寄存器)**控制通信基本参数:

位域功能典型值
STOP BITS停止位数量0(1位)/1(2位)
PARITY ENA奇偶校验使能0(禁用)/1(使能)
PARITY校验类型0(偶)/1(奇)
CHAR2-0数据位长度111(8位)

SCIHBAUD/SCILBAUD构成16位波特率寄存器,计算公式为:

BRR = LSPCLK/(波特率×8) - 1

2.2 FIFO配置实战

启用FIFO可显著提升通信效率:

// 发送FIFO配置 SciaRegs.SCIFFTX.all = 0xE040; // 使能FIFO,TXFIFO复位,中断级别8 // 接收FIFO配置 SciaRegs.SCIFFRX.all = 0x204F; // 使能FIFO,RXFIFO复位,中断级别15

注意:FIFO深度设置需考虑数据吞吐量和实时性要求,深度越大延迟越高

3. 完整通信工程实现

3.1 初始化流程分解

  1. GPIO引脚配置(需解锁保护)
  2. 时钟使能
  3. 通信参数设置
  4. FIFO配置
  5. 中断使能(可选)
void SCI_Init(Uint32 baud) { EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // 使能SCIRXDA上拉 GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // 使能SCITXDA上拉 EDIS; Uint16 brr = LSPCLK_FREQ/(8*baud) - 1; SciaRegs.SCIHBAUD = brr >> 8; SciaRegs.SCILBAUD = brr & 0xFF; }

3.2 数据收发最佳实践

查询方式发送字符串:

void SCI_SendString(const char *str) { while(*str != '\0') { while(SciaRegs.SCIFFTX.bit.TXFFST >= 16); // 等待FIFO空间 SciaRegs.SCITXBUF = *str++; } }

中断驱动接收方案:

interrupt void SCI_RX_ISR(void) { static char buffer[64]; static int index = 0; while(SciaRegs.SCIFFRX.bit.RXFFST) { buffer[index++] = SciaRegs.SCIRXBUF.all; if(buffer[index-1] == '\n' || index >= 63) { ProcessReceivedData(buffer); index = 0; } } PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; }

4. 性能优化与调试技巧

4.1 波特率精度优化

当目标波特率无法被LSPCLK整除时,可采用以下策略:

  1. 调整系统时钟分频比
  2. 选择最接近的可用波特率
  3. 使用自动波特率检测功能

自动波特率配置示例:

SciaRegs.SCIFFCT.bit.ABD = 1; // 清除自动波特率检测标志 SciaRegs.SCIFFCT.bit.CDC = 1; // 使能自动检测

4.2 常见问题排查指南

现象可能原因解决方案
无数据发送TX未使能检查SCICTL1.TXENA
接收数据错误波特率不匹配重新计算BRR值
FIFO不工作FIFO未使能检查SCIFFTX.SCIFFENA
中断不触发中断未使能检查PIE和SCICTL2配置

在调试过程中,建议先使用回环测试验证基本功能:

SciaRegs.SCICCR.bit.LOOPBKENA = 1; // 启用回环模式

5. 进阶应用:DMA与SCI协同工作

对于高速数据通信,可结合DMA减轻CPU负担:

  1. 配置DMA源/目标地址为SCIRXBUF/SCITXBUF
  2. 设置DMA触发源为SCI接收/发送事件
  3. 优化DMA传输块大小匹配FIFO深度
// DMA基本配置示例 DmaRegs.CH1.SRC_ADDR = (Uint32)&SciaRegs.SCIRXBUF; DmaRegs.CH1.DST_ADDR = (Uint32)RxBuffer; DmaRegs.CH1.TRANSFER_SIZE = 256;

实际项目中,SCI通信的稳定性往往取决于细节处理。例如在工业环境中,建议:

  • 添加硬件流控(RTS/CTS)防数据丢失
  • 实现软件超时机制
  • 采用CRC校验确保数据完整性