TMS320F28377的SCI通信
参考文章:
1,TI官网函数库
在使用官方给的SCI历程中,有出现第一次发送一包信息就出现丢包的情况,导致后面数据处理错误,在此做一个记录,以及提供一份TMS320F28377D的SCI通信例程,对初学者较好。
程序例程
第一步:初始化SCI的GPIO
EALLOW;
//SCIB,用作MODBUS通讯
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 2;//SCITXDB
GpioCtrlRegs.GPAGMUX2.bit.GPIO18 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2;//SCIRXDB
GpioCtrlRegs.GPAGMUX2.bit.GPIO19 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0;//MODBUS接收或发送引脚,低电平接收,高电平发送
GpioCtrlRegs.GPAGMUX2.bit.GPIO17 = 0;
EDIS;
做以下解释:
第一行与最后一行:与最后一行连用,说明改动中间被保护的寄存器
中间行:根据芯片手册对GPyGMUXn.GPIOz and GPyMUXn.GPIOz寄存器的描述,这几行代码将18,19,17设置成了SCITXDB,SCIRTDB,GPIO
注:我的代码中GPIO17用于了485的收发控制,可略
第二步:中断函数配置
2.1:SCIB中断名配置
该代码为将interrupt void scibRxFifoIsr(void)配置为SCIB的接收中断函数
EALLOW;
PieVectTable.SCIB_RX_INT = &scibRxFifoIsr;
EDIS;
2.2:中断函数
interrupt void scibRxFifoIsr(void)
{
Uint16 ReceivedChar1;
ReceivedChar1 = ScibRegs.SCIRXBUF.bit.SAR;
ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all = 0x100; // Issue PIE ack
}
做以下解释:
2.2.1:第二行
ReceivedChar1 = ScibRegs.SCIRXBUF.bit.SAR;
将接收到的数据0:7位传递给ReceivedChar1,定义成16位也没事,传递低8位
接收到的数据在SCIFIFO中可以配置接收多少位数据,配置好FIFO,然后改为ReceivedChar1 = ScibRegs.SCIRXBUF.all;可接受16位。
2.2.2:第三,四,五行
ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all = 0x100; // Issue PIE ack
清除溢出标志位,清除中断标志位,发布PIE应答
第三步:配置PIE
PieCtrlRegs.PIEIER9.bit.INTx3=1; //SCIB
IER |= M_INT9;
查芯片手册的PIE表可知,SCIB的接收中断为第九列第三个
第四步:配置SCIB的FiFO
ScibRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
ScibRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
ScibRegs.SCICTL2.bit.RXBKINTENA =1;
// ScibRegs.SCIHBAUD.bit.BAUD=0x0000;//波特率 115200
// ScibRegs.SCILBAUD.bit.BAUD=0x0036;//波特率 115200
ScibRegs.SCIHBAUD.all =0x0002;//波特率9600
ScibRegs.SCILBAUD.all =0x008B;
ScibRegs.SCIFFTX.bit.SCIFFENA=1;//使能 FIFO
ScibRegs.SCIFFRX.bit.RXFFIENA = 1;//使能 FIFO 接收中断
ScibRegs.SCIFFRX.bit.RXFFIL=1;//FIFO 接收字节 1
ScibRegs.SCIFFCT.all = 0x0;
ScibRegs.SCICTL1.all =0x0023; // 重启SCIB
ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
第一行:配置为,一停止位,无校验为,8字节,具体看后面英文注释
第二行:初始化SCIB时钟,具体看后面英文注释
第三行:接收缓存区使能
后面均有相关注释
完结!!!可以用了!!!接收到的数据在 ScibRegs.SCIRXBUF.bit.SAR 寄存器里
如有问题随时提问,一起学习呀