平台:F28035的SCI,上位软件是“串口大师”
故障现象:每次从串口大师发送数据时,接收FIFO中都会在前面多出两个别“0x00 ”“0x00”;而且在数据后面也会加和二个"0x00""0x00"!
中断使用的是接收中断。在中断中读接收FIFO的值。初始化设置如下:
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 = 780/256; //设置波特率
SciaRegs.SCILBAUD = 780%256;//780 - 9600 64 - 115200 用的是60M的系统时钟
SciaRegs.SCIFFTX.all=0xC008;//110 00000 0 0 0 01000
SciaRegs.SCIFFRX.all=0x0021;//000 0 0000 001 00001
SciaRegs.SCIFFCT.all=0x00;
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
SciaRegs.SCIPRI.bit.FREE = 1;
下面是中断程序:
interrupt void rxaint_isr(void) // SCI-A
{
Uint16 uiSCIData; //串口通信变量
g_ComTimeCount=g_ComTimeValue;
uiSCIData = (SciaRegs.SCIRXBUF.all & 0xFF);
if(iComNum<MAXRXDSTRLEN)
{
RS232Buff[iComNum] = uiSCIData;
iComNum++;
}
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; // clear Receive interrupt flag
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9;
}
经检察,在“串口大师”没有发数据的时候,中断也会发生!
当进入中断后,就会
RS232Buff[iComNum] = uiSCIData;
iComNum++;
使得接收的数组没办法按mobus 协议所定的格式定位,如RS232Buff[0]为设备地址。。。。
为了察明是什么原因产生的中断,在产生中断时读SCIRXST的值,如下所示:
SciaRegs.SCIRXST.all=0000000010110010;
这里的RXERROR, BRKDT, FE, RXWAKE 置位。
由于中断是由BRKDT置位产生的,请问在没有接收数据时,是什么使得BRKDT位置位?
另外FE也置位了,提示是检测到帧错误,此段程序是从F2801上移值下来的,在F2801上是正常的。低外设时钟我了改成了60 M,(controlsuit中的F28035设的是15M)波特率也是正确的,(因为接收数据显示正常)!
还有就是RXWAKE也置位了,它是接收器唤醒标志位。在没有接收数据的情况下是什么唤醒接收?
请指点!