|
谢啦~可不可以帮我看下这个问题:28335sci接收数据错误如何清FIFO的问题
interrupt void scicRxFifoIsr(void)
{
Uint16 i;
for(i=0;i<16;i++)
{
rdataC=ScicRegs.SCIRXBUF.all; // Read data
}
if(rdataC[0]==0xEB&&rdataC[1]==0x90&&rdataC[2]==0xEB&&rdataC[3]==0x90)
{
if(rdataC[4]==0x00&&rdataC[5]==0x06)
{Tyd=1;}
else if(rdataC[4]==0x01&&rdataC[5]==0x03)
{
Tyd=2;
}
else if(rdataC[4]==0x01&&rdataC[5]==0x04)
{Tyd=3;}
}
else
{
ScicRegs.SCIFFRX.bit.RXFIFORESET=0;
ScicRegs.SCIFFRX.bit.RXFIFORESET=1;
}
ScicRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
ScicRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all|=0x80; // Issue PIE ack
}
问题是这样的,我接收中断使用的16级FIFO。上位机给我传16帧(EB90EB9000060102030405060708090A)的数据正好进一次中断,然后判断前四个是不是EB90EB90以及功能码。但是这种方法容易出现的问题是假如第一位错误比如先发过来一个01,然后才是需要的16帧数据,这样当FIFO接收到09时就会进入中断,读过FIFO数据后 FIFO清0,然后0A就留在了下次FIFO第一位,然后等满16级再次进入中断,这样就会出现一直错一位数据。所以我想当判断接收错误时,把FIFO清0,这样下次再接收EB90EB9000060102030405060708090A时就不会错位了。但是发现清不了还是一直错位 |
|