dontium 发表于 2014-10-9 10:47
这样是简单,但还要重新设置FIFO。
实际上,楼主在和大家玩“脑筋急转弯”,我也被迷糊了!
“我的解决方法是每当发送一个数据块(4个字节)时,就对接收FIFO进行清空,这样就不会因数据接收错位而错误接收数据了,问题出来了,如何有效的清空FIFO??”
如果FIFO里面的数据不使用,还清它干吗?
如果FIFO的数据是有用,那么必须要读它,一读不就自动清除了吗?
我的问题跟楼主差不多,用的28335.
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时就不会错位了。但是发现清不了还是一直错位 |