This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

28069sci中断响应问题

本人在用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大神看见,麻烦帮忙出出主意,万分感谢!

  • 做了下对比实验,将Scia与Scib对调后,Scia与电脑的连接没有任何问题,中断响应很好,Scib与蓝牙模块的连接中,出现了同样时好时坏的问题,前一晚两个串口工作还都正常,睡一觉起来,一行代码都没动,Scib与蓝牙模块的通讯就挂掉了,SCIRXST寄存器显示0x00B0错误,无法恢复,功亏一篑。。。。可能问题不是出在软件上,是在硬件上。。。

  • 恩,根据你说的应该是硬件上的问题。
  • 我的建议是您检查下电平转换芯片是不是有问题,还有就是经电平转换后的RX和TX信号是怎么设计的。
    建议您以后将问题发到c2000 论坛:
    e2echina.ti.com/.../
  • 用示波器看了下,Sci配置出来的9600,高电平为104us,低电平为104us,计算得出波特率9615,;
    而蓝牙模块,在未连接另外一个蓝牙模块只是使用AT指令时,高电平为100us,低电平为108us,高电平波特率10k,低电平波特率9259;
    在两个蓝牙模块连接进行透传的情况下,高电平108us,低电平102us,高电平波特率9259,低电平波特率9803,;
    MCU与蓝牙模块的连接方式为无任何器件直连;
    请问您有什么好的经验么
  • 用示波器看了下,Sci配置出来的9600,高电平为104us,低电平为104us,计算得出波特率9615,;
    而蓝牙模块,在未连接另外一个蓝牙模块只是使用AT指令时,高电平为100us,低电平为108us,高电平波特率10k,低电平波特率9259;
    在两个蓝牙模块连接进行透传的情况下,高电平108us,低电平102us,高电平波特率9259,低电平波特率9803,;
    MCU与蓝牙模块的连接方式为无任何器件直连;
    请问是不是这波特率不那么精准,造成的SCIRXST寄存器这些标志位置位,从而导致SCI时好时坏的彻底break down?
    不好意思发帖的时候没注意是不是C2000论坛,以后注意。
    谢谢您!