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.

关于SCI中断的一点疑惑



平台: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也置位了,它是接收器唤醒标志位。在没有接收数据的情况下是什么唤醒接收

请指点!

  • 另外我在主循环中加入了如下的复位程序:

     for(;;)  //infinite loop
     {
         if((SciaRegs.SCIRXST.all & 0x80) !=0)
            {
          ComnErrCount++;
                EALLOW;
       SciaRegs.SCICTL1.all =0x03;
       asm( " NOP ");
       asm( " NOP ");
       asm( " NOP ");
       SciaRegs.SCICTL1.all =0x23;
       EDIS;
                if(ComnErrCount>5000)
         communicate = 1;
       else communicate = 0;

            }

    }