手把手教你配置TMS320F28335的SCI串口(从寄存器到代码实战)
深入解析TMS320F28335的SCI串口开发从寄存器配置到代码实战在嵌入式系统开发中串口通信是最基础也最关键的通信方式之一。对于使用德州仪器(TI)TMS320F28335数字信号处理器的开发者来说掌握其串行通信接口(SCI)的底层配置是必备技能。本文将带你从寄存器级别深入理解SCI模块的工作原理并通过实际代码演示如何配置和使用SCI-A进行数据收发。1. SCI模块基础与硬件连接TMS320F28335提供了三个独立的SCI模块(SCI-A、SCI-B、SCI-C)每个模块都可以实现全双工异步通信。在实际项目中SCI常用于与上位机(如PC)通信连接各种串口设备(如GPS模块、蓝牙模块)系统调试信息输出硬件连接注意事项SCI模块使用GPIO28(SCITXDA)和GPIO29(SCIRXDA)作为默认引脚如果使用其他引脚需要通过GPIO多路复用器配置典型连接需要加入电平转换芯片(如MAX3232)实现TTL与RS232电平转换提示在开发初期可以使用USB转TTL模块直接连接开发板的SCI引脚简化硬件连接2. 关键寄存器详解与配置2.1 通信控制寄存器(SCICCR)SCICCR寄存器(地址0x7050)控制通信的基本参数位域名称功能描述典型值15-9保留保留位08STOP BITS停止位数量(01位,12位)07EVEN/ODD PARITY奇偶校验选择06PARITY ENABLE奇偶校验使能05LOOPBACK ENA回环模式使能04ADDR/IDLE MODE通信协议选择03-0SCI CHAR数据长度(1-8对应4-11位)7(8位)配置示例SciaRegs.SCICCR.all 0x0007; // 1停止位无校验8位数据2.2 波特率设置寄存器(SCIHBAUD/SCILBAUD)波特率计算公式BRR LSPCLK / (SCI异步波特率 × 8) - 1其中LSPCLK是低速外设时钟(通常为SYSCLKOUT/4)BRR是16位值高8位存入SCIHBAUD低8位存入SCILBAUD常见波特率配置表波特率LSPCLK37.5MHz时的BRR值SCIHBAUDSCILBAUD96004870x010xE7192002430x000xF3384001210x000x79115200400x000x28配置代码示例Uint16 scibaud 37500000/(8*baud) - 1; SciaRegs.SCIHBAUD scibaud 8; SciaRegs.SCILBAUD scibaud 0xFF;3. 完整SCI初始化流程3.1 时钟与GPIO配置EALLOW; // 允许写入受保护的寄存器 // 使能SCI-A时钟 SysCtrlRegs.PCLKCR0.bit.SCIAENCLK 1; // 配置GPIO28和GPIO29为SCI功能 GpioCtrlRegs.GPAMUX2.bit.GPIO28 1; GpioCtrlRegs.GPAMUX2.bit.GPIO29 1; EDIS; // 禁止写入受保护的寄存器3.2 FIFO配置F28335的SCI模块包含16级FIFO可以显著提高通信效率// 发送FIFO配置使能FIFOTX FIFO深度为16清除中断标志 SciaRegs.SCIFFTX.all 0xE040; // 接收FIFO配置使能FIFORX FIFO深度为16清除中断标志 SciaRegs.SCIFFRX.all 0x204F; // FIFO控制寄存器禁用自动波特率检测 SciaRegs.SCIFFCT.all 0x00;3.3 完整初始化函数void SCI_Init(Uint32 baud) { // 1. 计算波特率 Uint16 scibaud 37500000/(8*baud) - 1; // 2. 配置GPIO和时钟 EALLOW; SysCtrlRegs.PCLKCR0.bit.SCIAENCLK 1; GpioCtrlRegs.GPAMUX2.bit.GPIO28 1; GpioCtrlRegs.GPAMUX2.bit.GPIO29 1; EDIS; // 3. 复位SCI模块 SciaRegs.SCICTL1.all 0x0000; // 4. 配置通信参数 SciaRegs.SCICCR.all 0x0007; // 8位数据无校验1停止位 SciaRegs.SCIHBAUD scibaud 8; SciaRegs.SCILBAUD scibaud 0xFF; // 5. 配置FIFO SciaRegs.SCIFFTX.all 0xE040; SciaRegs.SCIFFRX.all 0x204F; SciaRegs.SCIFFCT.all 0x00; // 6. 使能SCI模块 SciaRegs.SCICTL1.all 0x0023; // 使能TX和RX SciaRegs.SCICTL2.bit.TXINTENA 1; // 使能发送中断 SciaRegs.SCICTL2.bit.RXBKINTENA 1; // 使能接收中断 }4. 数据收发实现4.1 查询方式发送数据void SCI_SendChar(char c) { // 等待发送缓冲区空闲 while(SciaRegs.SCIFFTX.bit.TXFFST 16); // 写入发送缓冲区 SciaRegs.SCITXBUF c; } void SCI_SendString(const char *str) { while(*str ! \0) { SCI_SendChar(*str); } }4.2 中断方式接收数据中断服务程序示例__interrupt void SCI_RX_ISR(void) { char receivedChar; // 检查是否有接收错误 if(SciaRegs.SCIRXST.bit.RXERROR) { // 处理错误... SciaRegs.SCIRXST.bit.RXERROR 0; } // 读取接收到的数据 receivedChar SciaRegs.SCIRXBUF.all; // 处理数据... // 清除中断标志 SciaRegs.SCIFFRX.bit.RXFFINTCLR 1; PieCtrlRegs.PIEACK.all PIEACK_GROUP9; }中断初始化代码// 配置PIE中断 EALLOW; PieVectTable.SCIRXINTA SCI_RX_ISR; EDIS; // 使能PIE组9中断(SCI-A) PieCtrlRegs.PIEIER9.bit.INTx1 1; // 使能CPU中断 IER | M_INT9; // 全局中断使能 EINT;5. 常见问题与调试技巧5.1 波特率不匹配症状接收到的数据乱码解决方法确认系统时钟配置正确检查波特率计算公式中的LSPCLK值使用示波器测量实际波特率5.2 数据发送不成功检查步骤确认SCITXDA引脚配置正确检查SCICTL1.bit.TXENA是否置1使用回环模式测试(SCICCR.bit.LOOPBACKENA1)5.3 FIFO工作异常典型问题FIFO中断不触发检查SCIFFTX和SCIFFRX的中断使能位FIFO数据丢失确保及时读取接收FIFO数据调试建议在初始化完成后先发送一个已知字符串(如HELLO)使用逻辑分析仪或串口调试助手验证通信是否正常
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2570286.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!