本人在用28069做四旋翼项目,从stm32平台移植过来,在使用28069的过程中,sci出现了非常头疼的问题,三个星期还没有调出来,基本处于绝望状态了。。。
在程序中scia负责与蓝牙模块通讯,90M低速时钟分频出波特率9600,FIFO深度设置为1,只开启接收中断,每进来一个字节就进中断进行一次处理;
scib负责与电脑CH340G通讯,90M低速时钟分频出波特率115200,FIFO深度设置为1,只开启接收中断,每进来一个字节就进中断进行一次处理;
两个sci同时使用,在while(1)中会有两个定时器TImer0和Timer1使用,中断周期1ms;
使用XDS100V2进行调试;
软件为CCS6.1.0;
以上为使用背景;
以下为配置代码:
void Scia_Init(Uint32 freq)
{
Uint32 Baud;
Baud = ((90000000 / freq) /8) - 1;
//SciB
SciaRegs.SCIFFTX.all=0xE040;
SciaRegs.SCIFFRX.all=0x2041;
SciaRegs.SCIFFCT.all=0x0;
//ScibRegs.SCIPRI.bit.FREE = 1;
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
SciaRegs.SCIHBAUD = (Baud >> 8); //@LSPCLK = 90 MHz .
SciaRegs.SCILBAUD = (Baud & 0x00FF);
EALLOW;
PieVectTable.SCIRXINTA = &sciaRxFifoIsr;
EDIS;
//PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE Group 9, INT1
IER |= M_INT9;
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
SciaRegs.SCIFFRX.bit.RXFFIENA = 1;
Scia_Rx_Count = 0;
memset((void *)Scia_Rx_Buffer,0,sizeof(Scia_Rx_Buffer));
}
void Scib_Init(Uint32 freq)
{
Uint32 Baud;
Baud = ((90000000 / freq) /8) - 1;
//SciB
ScibRegs.SCIFFTX.all=0xE040;
ScibRegs.SCIFFRX.all=0x2041;
ScibRegs.SCIFFCT.all=0x0;
//ScibRegs.SCIPRI.bit.FREE = 1;
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.SCIHBAUD = (Baud >> 8); //@LSPCLK = 90 MHz .
ScibRegs.SCILBAUD = (Baud & 0x00FF);
EALLOW;
PieVectTable.SCIRXINTB = &scibRxFifoIsr;
EDIS;
//PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE Group 9, INT2
IER |= M_INT9;
ScibRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
ScibRegs.SCIFFRX.bit.RXFFIENA = 1;
Scib_Rx_Count = 0;
memset((void *)Scib_Rx_Buffer,0,sizeof(Scib_Rx_Buffer));
}
现在的使用现象为:
1、在调试的过程中,Scia接收会出现时好时坏的现象,将中断设置在中断接收函数中,在进入断点时蓝牙模块不会停止发送数据,现在中断有时会进不去,并且在运行了一段时间后不定时间无法再次进入中断,观察SCIRXST寄存器显示0x00B2错误,无法恢复,SCIRXBUF寄存器显示为0x806F,最高位接收错误也置位,请问是什么原因?
2、scia的中断会时好时坏,同时scib的中断,将断点设置在中断函数中,使用串口调试助手手动向scib发送数据,不论进入断点后电脑发送多少次数据,scib都能正常进入中断,两个sci的配置函数我都是复制粘贴的。
3、CCS的编译器对于8位指针进行16位结构体的强制解释,直接就跑飞。。。现将强制解释改为逐字节带入才解决问题。。。。(此条为吐槽。。。)
由此现象,我推算问题为:
1、28069的scia硬件有bug(在28377刚出时就在16位差分adc上吃过亏);
2、蓝牙模块的波特率不稳定(在stm32上跑一点问题都没有,同样是每接收一个字节进入中断处理),scia的比特率配置完后SCIBAUD为0x0492,计算为9607Hz,0.07%的误码率应该不至于这么不稳定吧。。。毕竟scib的115200跑起来一点问题都没有。。。。
3、中断响应时间处理时间过长或者有冲突,C2000的中断现场保护每次要消耗9个时钟,两个Timer每ms就要跑30个时钟左右,也就是在跑接收中断时,有可能会遇见SCI中断被Timer中断打断的情况,造成接收混乱或冲突,C2000的中断处理不会这么坑吧。。。我已经把PWM和ADC的中断都关掉了。。。。
我这边计划在硬件将scia与scib对调下做下对比试验看看,推算的这三个问题,目测都不太好解决,请各位C2000的大神和TI的技术支持帮忙看下问题到底出在了哪里,三个星期的无休攻坚,已然崩溃。。。
如果Eric大神看见,麻烦帮忙出出主意,万分感谢!