F28335的SCI串行通信接口是DSP与外部设备交换数据的标准方式,掌握其配置方法能大幅提升开发效率。 该模块本质上是增强型UART,支持全双工异步通信,广泛应用于工业控制、数据采集与电机驱动等场景,下面从硬件特性、配置步骤、常见误区到实际应用,梳理出一条清晰的学习路径。
什么是F28335的SCI模块
TMS320F28335内部集成了三个独立的SCI模块(SCI-A、SCI-B、SCI-C),每个模块都支持标准NRZ格式,具备独立的波特率发生器、接收器与发送器,行业共识认为,这类串行接口在稳定性与抗干扰能力上优于软件模拟的串口,尤其适合噪声环境下的数据交换。
硬件特性与引脚
- 每个SCI模块占用两个GPIO引脚:SCITXD(发送)和SCIRXD(接收)。
- 引脚功能通过GPIO复用寄存器配置,通常选择GPIO29/28(SCI-A)、GPIO9/11(SCI-B)、GPIO5/7(SCI-C)等组合。
- 内置16级深度的FIFO缓冲区,可减轻CPU中断负担,大幅提升批量数据传输效率。
与普通UART的核心差异
多数开发者会问“f28335 sci与uart区别在哪里”,其实F28335的SCI在电气特性上完全兼容标准UART,区别主要体现在寄存器配置和时钟源上:
- SCI的波特率基准时钟是LSPCLK(低速外设时钟),而非CPU主频。
- 支持地址位多处理器通信模式,这是普通UART不具备的特性,在分布式系统中可减少总线冲突。
- 寄存器命名与C2000系列一脉相承,如SCICCR、SCICTL1等,与通用UART的寄存器映射不同。
f28335 sci通信配置步骤详解
这部分是实操核心,很多开发者初次接触时容易在GPIO复用和波特率计算上出错,下面按顺序拆解。
第一步:配置GPIO引脚复用
-
将SCI对应的引脚设置为SCI功能模式,而非普通GPIO。
- 操作路径:通过GpioCtrlRegs寄存器设置GPAMUX或GPBMUX,例如使能SCI-A的引脚。
GpioCtrlRegs.GPAMUX1.bit.GPIO28 = 1; // 设置为SCITXDAGpioCtrlRegs.GPAMUX1.bit.GPIO29 = 1; // 设置为SCIRXDA - 同时需配置内部上拉(可选),避免浮空导致误码。
第二步:SCI模块时钟与初始化
- 使能SCI时钟:在SysCtrlRegs中设置PCLKCR0寄存器的相应位。
- 复位SCI模块:通过SCICTL1的SWRESET位产生软件复位,确保所有寄存器回到默认状态。
- 设置数据格式:SCICCR寄存器配置数据位(1-8位)、停止位、奇偶校验。
- 典型配置:8位数据、1位停止、无校验。
第三步:f28335 sci波特率设置
波特率计算公式为:
BRR = (LSPCLK / (波特率 8)) - 1
- 若LSPCLK为37.5MHz,目标波特率115200,则BRR ≈ 40,写入SCIHBAUD(高字节)和SCILBAUD(低字节)。
- 注意:结果必须小于65535,否则需降低LSPCLK或使用更低的波特率。
- 实际使用中,可事先计算好常用值,例如9600、19200、115200对应的BRR值,并写入表中以便调试。
第四步:启用收发与中断
- 配置SCICTL1:使能接收(RXENA)、发送(TXENA),并设置休眠模式(通常关闭)。
- 若使用中断,在SCICTL2中使能RXRDY或TXRDY中断,并配置PIE控制器对应中断向量。
- 中断服务程序内需及时读取接收数据或写入发送数据,避免FIFO溢出。
第五步:发送与接收验证
- 发送:向SCITXBUF写入数据,硬件自动按配置格式发送。
- 接收:查询SCIRXST寄存器的RXRDY标志,或等待中断触发后读取SCIRXBUF。
- 建议先使用回环模式(SCICCR的LOOPBKEN位)
进行自检,确认硬件链路正常后再连接外部设备。
常见调试陷阱与优化技巧
即使配置步骤正确,实际通信中仍可能出现乱码或丢帧,以下是根据多年现场经验总结的典型问题。
波特率误差累积
- 当LSPCLK不是波特率的整数倍时,BRR取整会产生误差,例如LSPCLK=37.5MHz,115200波特率理论BRR=39.79,取整为40,实际波特率≈114837,误差约0.3%,在可接受范围内。
- 若误差超过2%,建议更换LSPCLK分频或选择更匹配的波特率,业内专家指出,多数通信失败案例源于时钟源选择不当。
FIFO深度与中断优先级
- 启用FIFO后,可设置中断触发深度(如4、8、12字节),避免频繁进入中断。
- 在中断服务程序中,尽量批量读取或写入,而非逐字节处理,可显著降低CPU占用率。
- 注意:FIFO复位后需重新配置,否则可能丢失数据。
多机通信时的地址冲突
- 使用SCI的地址位模式时,需在发送数据前附加地址位,接收端通过SCICTL2的ADDRIDLE_MODE或ADDRBIT_MODE识别。
- 若多个从机地址重复,会导致总线混乱,建议在系统设计阶段就规划好唯一地址,并预留配置接口。
典型应用场景:电机控制与数据采集
F28335的SCI串行通信在工业现场非常常见,下面列举两个典型用法。
与上位机实时交互
- 在电机控制系统中,通过SCI将转速、电流、温度等参数打包成自定义协议,以固定频率发送至上位机。
- 采用CRC校验确保数据完整性,帧头使用0xAA、0x55等特殊字节,便于接收端同步。
- 波特率通常选择115200或更高,以满足实时性要求,同时保证线缆长度不超过1.5米(RS232电平)或通过RS485转换器延长距离。
多DSP之间的级联通信
- 在大型分布式控制系统中,多块F28335通过SCI级联,主控轮流轮询从机。
- 每个从机配置相同的波特率,但使用不同的地址帧来区分,主控发送地址帧后,对应从机响应,其他从机静默。
- 这种架构下,通信速率受限于最慢的节点,建议统一使用相同LSPCLK频率,避免波特率偏差。
f28335串行通信sci常见问题解答
问题1:F28335 SCI波特率如何计算?
波特率设置依赖于低速外设时钟LSPCLK,公式为BRR = (LSPCLK / (波特率 8)) – 1,将计算结果写入SCIHBAUD和SCILBAUD寄存器,如果LSPCLK无法整除目标波特率,取整后误差在2%以内通常不影响通信,若误差过大,可调整LSPCLK分频系数或选择其他波特率。
问题2:F28335 SCI与普通UART能否直接通信?
可以,但需注意电平匹配,F28335的SCI引脚输出3V CMOS电平,而普通UART(如PC的串口)是RS232电平(±12V),两者不能直接相连,必须使用电平转换芯片如MAX3232,若对接的是其他3.3V微控制器,则可直接连接,但需确保双方配置完全一致(波特率、数据位、停止位、校验位),如果使用FIFO,建议禁用或调整双方深度,避免因缓冲区差异导致数据错位。
问题3:F28335 SCI中断配置后不触发是什么原因?
中断不触发通常由以下原因造成:1)PIE控制器中对应中断未使能,需在PieCtrlRegs中设置相应位;2)SCI模块内中断标志未清除,导致无法产生新中断;3)GPIO引脚功能未正确配置,导致信号无法到达SCI模块;4)波特率严重偏差,接收端无法同步起始位,按顺序检查时钟、GPIO复用、寄存器使能位,并使用示波器测量引脚波形,是定位问题的最直接方法。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/509322.html



