【TMS320开发】基于TMS320F28377SPTPS的SCI串口开发实战
目录
一、开发前期准备
1.1 硬件环境
本次实战采用TMS320F28377SPTPS芯片作为核心控制器,该芯片属于TI C2000系列高性能数字信号控制器(DSC),内置4个可独立配置的SCI(Serial Communication Interface)模块,本质上与通用UART功能一致,支持异步串行通信,可实现与PC机、其他MCU或外设的点对点数据交互,其SCI模块支持多种数据格式和工作模式,且引脚可灵活配置。搭配的硬件器材如下:
-
TMS320F28377SPTPS开发板(核心芯片,推荐TI官方LAUNCHXL-F28377S开发板,便于快速上手);
-
USB转TTL模块(如CH340G,用于实现开发板SCI串口与PC机USB口的电平转换,DSP的SCI引脚为TTL电平,PC机串口为RS232电平,需通过该模块完成匹配);
-
杜邦线(用于连接开发板SCI引脚与USB转TTL模块);
-
PC机(安装串口助手,用于发送和接收数据,验证通信功能);
-
5V电源适配器(为开发板供电,确保供电稳定,避免因电压波动影响通信)。

1.2 软件环境
软件环境搭建围绕TI官方开发工具展开,确保工具版本兼容,避免开发过程中出现兼容性问题,具体配置如下:
-
集成开发环境(IDE):Code Composer Studio(CCS),推荐版本12.0及以上,该环境集编辑、编译、链接、软件仿真、硬件调试于一体,是TMS320系列DSP的主流开发工具;
-
芯片支持包:C2000Ware,版本需匹配CCS版本,包含TMS320F28377SPTPS的寄存器定义、外设驱动库、示例代码等核心资源,是SCI模块配置的基础支撑;
-
串口助手:推荐SecureCRT、SSCOM或串口调试助手,用于PC机与开发板之间的串口通信测试,支持波特率、数据位等参数配置;
-
驱动程序:安装USB转TTL模块驱动(如CH340驱动)和CCS调试驱动,确保PC机可正常识别开发板和USB转TTL模块。
1.3 核心知识点储备
在开发前需掌握TMS320F28377SPTPS SCI模块的核心特性,为后续开发奠定基础:
-
SCI模块工作模式:支持异步通信,可配置数据位(5~8位)、停止位(1~2位)、校验位(无校验、奇校验、偶校验),支持波特率可编程,最高波特率可满足高频通信需求;
-
数据传输方式:支持查询模式、中断模式和DMA模式,本次实战重点实现查询模式(简单易上手,适合入门)和中断模式(高效,适合多任务场景);
-
寄存器配置:核心寄存器包括SCI控制寄存器(SCICTL1、SCICTL2)、波特率寄存器(SCIHBAUD、SCILBAUD)、数据缓冲寄存器(SCITXBUF、SCIRXBUF)、FIFO控制寄存器(SCIFFTX、SCIFFRX)等,需熟练掌握各寄存器的功能和配置方法;
-
引脚复用:TMS320F28377SPTPS的SCI引脚可通过GPIO复用配置,需确认所用SCI模块对应的GPIO引脚,避免引脚冲突,例如SCI-A通常对应GPIO28(TXD)和GPIO29(RXD)。
二、硬件电路设计与连接
2.1 核心电路设计
TMS320F28377SPTPS的SCI串口电路设计核心是实现“开发板SCI引脚→USB转TTL模块→PC机”的信号传输,重点关注电平匹配和引脚连接,无需复杂的外围电路,具体设计要点如下:
-
电平转换:TMS320F28377SPTPS的SCI引脚输出/输入为3.3V TTL电平,而PC机USB口为5V电平,因此需通过USB转TTL模块(CH340G)完成3.3V与5V的电平转换,避免电平不匹配导致通信失败或芯片损坏;
-
引脚配置:选择SCI-A模块(常用模块,便于调试),其TXD引脚(SCITXDA)对应GPIO28,RXD引脚(SCIRXDA)对应GPIO29,需将这两个引脚配置为SCI功能模式,而非GPIO通用模式;
-
电源与接地:USB转TTL模块的VCC引脚接5V电源(可从开发板5V引脚引出),GND引脚与开发板GND引脚共地,确保共地参考,减少信号干扰;开发板需单独供电,确保供电稳定。
2.2 硬件连接步骤
按照以下步骤完成硬件连接,连接前需关闭所有设备电源,避免短路损坏器件:
-
连接开发板与USB转TTL模块:
-
开发板SCI-A TXD(GPIO28) → USB转TTL模块RXD(标注“RX”或“RXD”);
-
开发板SCI-A RXD(GPIO29) → USB转TTL模块TXD(标注“TX”或“TXD”);
-
开发板GND → USB转TTL模块GND(共地,至关重要,否则会出现数据乱码或无法通信)。
-
-
连接USB转TTL模块与PC机:将USB转TTL模块的USB接口插入PC机USB口,PC机会自动识别(若未识别,需安装CH340驱动);
-
为开发板供电:将5V电源适配器接入开发板电源接口,确保电源指示灯正常亮起,开发板正常启动。
注意:连接时需区分TXD和RXD引脚,遵循“交叉连接”原则(开发板TXD接模块RXD,开发板RXD接模块TXD),若接反会导致无法接收数据;同时避免VCC与GND接反,防止烧毁器件。
三、软件开发实现(基于CCS)
本次软件开发基于C语言,使用C2000Ware库函数和寄存器配置两种方式实现SCI串口通信,分别实现查询模式下的“PC机发送、开发板接收并回显”和中断模式下的“开发板主动发送数据、PC机接收”,步骤清晰,可直接复制代码调试。
3.1 工程创建与环境配置
-
打开CCS软件,点击“File→New→CCS Project”,创建新工程;
-
在工程配置界面,选择芯片型号“TMS320F28377SPTPS”,选择编译器版本(推荐TI v21.6.0.LTS),设置工程名称和保存路径,点击“Finish”;
-
添加C2000Ware库文件:右键点击工程,选择“Properties→Build→C2000Ware”,勾选对应芯片的库文件,确保寄存器定义、驱动函数可正常调用;
-
添加头文件路径:在工程Properties中,找到“Build→Include Options”,添加C2000Ware库的头文件路径(如“C:\ti\c2000ware\driverlib\f28377s\driverlib”),避免头文件引用错误;
-
创建主程序文件:右键点击工程“Source”文件夹,选择“New→Source File”,命名为“main.c”,用于编写SCI串口开发代码。
3.2 通用初始化配置(系统时钟+GPIO复用)
无论查询模式还是中断模式,都需先完成系统时钟初始化和SCI引脚复用配置,确保SCI模块正常工作,代码如下(含详细注释):
#include "F28x_Project.h" // 标准头文件,包含所有外设定义 #include "sci.h" // SCI驱动头文件,部分版本需手动包含 // 函数声明 void InitSysCtrl_Custom(void); // 系统时钟初始化(自定义配置) void InitSCI_Gpio(void); // SCI引脚复用配置 void main(void) { // 1. 系统初始化 InitSysCtrl_Custom(); // 初始化系统时钟 DINT; // 禁用全局中断 InitPieCtrl(); // 初始化PIE控制寄存器 IER = 0x0000; // 禁用所有CPU中断 IFR = 0x0000; // 清除所有中断标志 InitPieVectTable(); // 初始化PIE向量表 // 2. SCI引脚复用配置 InitSCI_Gpio(); // 3. SCI模块初始化(后续分模式实现) // ...(查询模式/中断模式初始化代码) // 4. 主循环(后续分模式实现) while(1) { // ...(数据收发逻辑) } } // 系统时钟初始化:配置系统时钟为100MHz,LSPCLK为25MHz(SCI波特率依赖LSPCLK) void InitSysCtrl_Custom(void) { EALLOW; // 允许访问受保护寄存器 // 配置振荡器:使用内部振荡器,频率10MHz SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 0x01; // 选择内部振荡器 SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 1; // 关闭外部时钟输入 // 配置PLL锁相环,将10MHz振荡器时钟倍频至100MHz SysCtrlRegs.PLLCR.bit.DIV = 0x0A; // PLL倍频系数,10MHz×10=100MHz while(SysCtrlRegs.PLLSTS.bit.LOCKS != 1); // 等待PLL锁相环稳定 // 配置外设时钟:LSPCLK = SYSCLK / 4 = 25MHz(SCI模块使用LSPCLK) SysCtrlRegs.LOSPCP.bit.LSPCLKDIV = 0x03; // 分频系数4 EDIS; // 禁止访问受保护寄存器 } // SCI引脚复用配置:配置GPIO28(SCITXDA)和GPIO29(SCIRXDA)为SCI功能 void InitSCI_Gpio(void) { EALLOW; // 配置GPIO28为SCITXDA功能(MUX=1) GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 0x01; GpioCtrlRegs.GPADIR.bit.GPIO28 = 1; // GPIO28为输出(TXD) GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // 使能上拉电阻 // 配置GPIO29为SCIRXDA功能(MUX=1) GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 0x01; GpioCtrlRegs.GPADIR.bit.GPIO29 = 0; // GPIO29为输入(RXD) GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // 使能上拉电阻 EDIS; }
说明:系统时钟配置中,LSPCLK(低速外设时钟)为25MHz,SCI波特率的计算依赖该时钟,后续波特率配置需基于此时钟进行计算;GPIO复用配置需确保引脚功能正确,避免与其他外设冲突。
3.3 模式1:查询模式(PC发送→开发板接收→回显)
查询模式通过循环查询SCI接收寄存器的状态,判断是否有数据接收,接收完成后立即回显给PC机,逻辑简单,适合入门调试,在主程序中添加SCI初始化和收发逻辑,完整代码如下(补充到main.c中):
// 函数声明(补充) void InitSCI_Query(void); // 查询模式SCI初始化 void SCI_SendByte(uint16_t data); // 发送一个字节 uint16_t SCI_ReceiveByte(void); // 接收一个字节 // 主函数中替换SCI初始化和主循环部分 void main(void) { uint16_t rxData; // 接收数据缓存 // 1. 系统初始化(同3.2) InitSysCtrl_Custom(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); // 2. SCI引脚复用配置(同3.2) InitSCI_Gpio(); // 3. 查询模式SCI初始化 InitSCI_Query(); // 4. 主循环:接收PC机数据并回显 while(1) { rxData = SCI_ReceiveByte(); // 等待接收数据(查询模式,阻塞等待) SCI_SendByte(rxData); // 回显接收的数据给PC机 } } // 查询模式SCI初始化:配置波特率115200,8位数据位,1位停止位,无校验 void InitSCI_Query(void) { EALLOW; // 初始化SCI FIFO(可选,开启FIFO可减少数据丢失) SciaRegs.SCIFFTX.all = 0x8000; // 清除FIFO状态,不复位 SciaRegs.SCIFFRX.all = 0x0000; SciaRegs.SCIFFCT.all = 0x00; // 波特率配置:LSPCLK=25MHz,目标波特率115200 // 波特率计算公式:BRR = (LSPCLK / (baud × 8)) - 1 // 计算:(25e6 / (115200×8)) - 1 ≈ 27.126 → 取整27(0x1B) SciaRegs.SCIHBAUD.all = 0x00; // 波特率高8位 SciaRegs.SCILBAUD.all = 0x1B; // 波特率低8位(27) // 配置数据格式:8位数据位,1位停止位,无校验,异步模式 SciaRegs.SCICCR.all = 0x0007; // 0000 0000 0000 0111 → 8位数据,无校验 SciaRegs.SCICTL1.all = 0x0003; // 清除软件复位,禁用中断 SciaRegs.SCICTL2.bit.RXBKINTENA = 0; // 关闭接收中断 SciaRegs.SCICTL2.bit.TXINTENA = 0; // 关闭发送中断 SciaRegs.SCICTL1.all = 0x0023; // 使能SCI接收和发送(RE=1, TE=1) // 使能FIFO SciaRegs.SCIFFTX.bit.SCIFFENA = 1; SciaRegs.SCIFFRX.bit.SCIFFENA = 1; EDIS; } // 发送一个字节数据(查询模式,等待发送缓冲区为空) void SCI_SendByte(uint16_t data) { while(SciaRegs.SCIFFTX.bit.TXFFST != 0); // 等待发送FIFO为空 SciaRegs.SCITXBUF.all = data; // 发送数据到缓冲区 } // 接收一个字节数据(查询模式,阻塞等待接收完成) uint16_t SCI_ReceiveByte(void) { while(SciaRegs.SCIFFRX.bit.RXFFST == 0); // 等待接收FIFO有数据 return SciaRegs.SCIRXBUF.all; // 读取接收的数据 }
说明:波特率计算是关键,若LSPCLK改变,需重新计算BRR值,例如LSPCLK=50MHz时,115200波特率的BRR值约为53(0x35);查询模式为阻塞式接收,主循环会一直等待数据,适合简单的点对点通信场景。
3.4 模式2:中断模式(开发板主动发送+接收中断回显)
中断模式下,开发板主动向PC机发送固定数据,同时开启接收中断,当接收到PC机数据时,通过中断服务函数完成回显,无需阻塞主循环,适合多任务开发场景,完整代码如下(替换查询模式代码):
// 函数声明(补充) void InitSCI_Interrupt(void); // 中断模式SCI初始化 void SCI_SendString(const char *msg); // 发送字符串 interrupt void scia_rx_isr(void); // SCI接收中断服务函数 // 全局变量:接收数据缓存 uint16_t rxData; void main(void) { // 1. 系统初始化(同3.2) InitSysCtrl_Custom(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); // 2. SCI引脚复用配置(同3.2) InitSCI_Gpio(); // 3. 中断模式SCI初始化 InitSCI_Interrupt(); // 4. 主循环:主动向PC机发送数据 while(1) { SCI_SendString("Hello PC! This is TMS320F28377SPTPS SCI Test.\r\n"); DELAY_US(1000000); // 延时1秒,每秒发送一次数据 } } // 中断模式SCI初始化:配置波特率115200,开启接收中断 void InitSCI_Interrupt(void) { EALLOW; // 初始化SCI FIFO SciaRegs.SCIFFTX.all = 0x8000; SciaRegs.SCIFFRX.all = 0x0000; SciaRegs.SCIFFCT.all = 0x00; // 波特率配置(同查询模式,LSPCLK=25MHz,115200波特率) SciaRegs.SCIHBAUD.all = 0x00; SciaRegs.SCILBAUD.all = 0x1B; // 数据格式配置(同查询模式) SciaRegs.SCICCR.all = 0x0007; SciaRegs.SCICTL1.all = 0x0003; // 配置中断:开启接收中断,关闭发送中断 SciaRegs.SCICTL2.bit.RXBKINTENA = 1; // 使能接收中断(RX/Break) SciaRegs.SCICTL2.bit.TXINTENA = 0; // 关闭发送中断 // 使能SCI接收和发送 SciaRegs.SCICTL1.all = 0x0023; // 配置FIFO中断触发级别:接收FIFO有1个字节即触发中断 SciaRegs.SCIFFRX.bit.RXFIFOLVL = 1; SciaRegs.SCIFFRX.bit.RXFFIENA = 1; // 使能FIFO接收中断 // 使能FIFO SciaRegs.SCIFFTX.bit.SCIFFENA = 1; SciaRegs.SCIFFRX.bit.SCIFFENA = 1; // 映射SCI接收中断到中断向量表 PieVectTable.SCIA_RX_INT = &scia_rx_isr; // 使能PIE中断组和CPU中断 PieCtrlRegs.PIEIER9.bit.INTx1 = 1; // PIE组9,INT1(SCIA RX中断) IER |= M_INT9; // 使能CPU中断线9 EINT; // 使能全局中断 ERTM; // 使能实时模式中断 EDIS; } // 发送字符串函数 void SCI_SendString(const char *msg) { int i; for(i = 0; msg[i] != '\0'; i++) { SCI_SendByte(msg[i]); // 调用之前的发送字节函数 } } // SCI接收中断服务函数:接收数据并回显 interrupt void scia_rx_isr(void) { rxData = SciaRegs.SCIRXBUF.all; // 读取接收的数据 SCI_SendByte(rxData); // 回显数据给PC机 // 清除PIE中断应答位,允许再次触发中断 PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; }
说明:中断模式的核心是配置中断向量表、开启中断使能(PIE中断和全局中断),中断服务函数需在向量表中注册,且需清除中断应答位,否则中断会持续触发;FIFO中断触发级别可根据需求调整,例如接收4个字节后触发中断,减少中断次数。
四、调试验证与问题排查
4.1 调试前准备
-
编译工程:点击CCS工具栏“Rebuild All”,编译工程,确保无错误(0 errors, 0 warnings),若有错误,检查头文件路径、寄存器定义或代码语法;
-
连接开发板:将开发板通过USB线连接到PC机(用于调试),确保CCS可识别开发板(在“View→Target Configuration”中查看);
-
配置串口助手:打开串口助手,选择USB转TTL模块对应的串口号(在PC机“设备管理器→端口”中查看),配置参数:波特率115200、数据位8、停止位1、无校验、无流控,点击“打开串口”。
4.2 分模式调试验证
4.2.1 查询模式验证
-
加载程序:在CCS中点击“Load Program”,选择编译生成的.out文件,加载到开发板;
-
运行程序:点击“Run”按钮,程序开始运行,主循环等待接收数据;
-
发送数据:在串口助手中输入任意字符(如“SCI Test”),点击“发送”;
-
验证结果:若串口助手接收区显示相同的字符(如“SCI Test”),说明查询模式通信正常,开发板成功接收并回显数据。
4.2.2 中断模式验证
-
加载中断模式程序,运行程序;
-
查看接收区:串口助手接收区每隔1秒会收到开发板发送的字符串“Hello PC! This is TMS320F28377SPTPS SCI Test.”;
-
发送数据验证:在串口助手中发送任意字符,接收区会立即回显该字符,说明接收中断正常工作。
4.3 常见问题排查
开发过程中可能出现通信失败、数据乱码等问题,结合实战经验,常见问题及排查方法如下:
-
问题1:串口助手无法识别串口号?
-
排查:USB转TTL模块驱动未安装或安装失败;USB线接触不良;开发板未供电。
-
解决:重新安装CH340驱动;更换USB线;检查开发板电源连接,确保电源正常。
-
-
问题2:数据发送/接收失败,无任何响应?
-
排查:TXD/RXD引脚接反;SCI引脚复用配置错误(GPIO未配置为SCI功能);SCI模块未使能;波特率计算错误。
-
解决:重新检查引脚连接,确保交叉连接;核对GPIO复用配置代码,确认MUX值正确;检查SCI初始化代码,确保SCICTL1寄存器使能接收和发送;重新计算波特率BRR值,匹配LSPCLK频率。
-
-
问题3:接收数据乱码?
-
排查:波特率不匹配;系统时钟配置错误(LSPCLK频率错误);硬件共地不良,存在信号干扰;FIFO未开启导致数据丢失。
-
解决:确保串口助手与开发板波特率一致;核对系统时钟初始化代码,确保LSPCLK为25MHz;检查GND连接,确保共地;开启SCI FIFO,减少数据丢失。
-
-
问题4:中断模式下无中断响应?
-
排查:中断向量表映射错误;PIE中断或全局中断未使能;中断服务函数未清除中断应答位;FIFO中断触发级别配置错误。
-
解决:核对中断向量表映射代码,确保SCIA_RX_INT指向正确的中断服务函数;检查PIEIER9和IER寄存器配置,确保中断使能;在中断服务函数中添加PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;调整RXFIFOLVL值,确保触发级别正确。
-
五、开发总结与扩展
5.1 开发总结
本次基于TMS320F28377SPTPS的SCI串口开发实战,完成了查询模式和中断模式的通信实现,核心要点如下:
-
硬件层面:重点关注SCI引脚复用配置和电平转换,遵循“交叉连接”原则,确保共地,减少信号干扰;
-
软件层面:系统时钟初始化需确保LSPCLK频率正确,波特率计算基于LSPCLK,SCI模块初始化需配置数据格式、FIFO和中断(中断模式);
-
调试层面:分步骤验证,先确保硬件连接正确,再通过串口助手验证通信功能,遇到问题优先排查引脚、波特率和中断配置。
通过本次实战,可掌握TMS320F28377SPTPS SCI模块的核心配置方法,理解查询模式和中断模式的区别及适用场景,为后续更复杂的串口通信(如多字节传输、DMA模式)奠定基础。
5.2 开发扩展
基于本次实战,可进行以下扩展开发,满足更复杂的应用需求:
-
DMA模式开发:使用SCI DMA功能,实现高速数据传输,减少CPU占用率,适合大量数据收发场景;
-
多SCI模块通信:TMS320F28377SPTPS有4个SCI模块,可配置多个SCI接口,实现与多个外设的同时通信;
-
串口协议实现:基于SCI串口实现自定义通信协议(如Modbus协议),用于工业控制场景中的设备交互;
-
错误处理优化:在代码中添加奇偶校验、帧错误检测等功能,提高通信的稳定性和可靠性;
-
串口烧录功能:结合SCI串口实现程序烧录,通过上位机程序将固件烧录到DSP芯片中,简化开发流程。
后续开发中,可结合C2000Ware的示例代码,进一步优化串口通信的效率和稳定性,适配实际项目需求。
更多推荐
所有评论(0)