可不可以帮我看下这个问题: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时就不会错位了。但是发现清不了FIFO还是一直错位
Hank Zhao:
清零FIFO只影响接收,对发送方没影响,你可以在接收出错后给上位机发消息,让其重新发送数据,然后重新开始接收。
可不可以帮我看下这个问题: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时就不会错位了。但是发现清不了FIFO还是一直错位
Jia Li3:
回复 Hank Zhao:
嗯,明白~
不过我遇到的问题是,比如第一次FIFO收到4个字节不会进入中断,第二次收到16个字节,这样第二次的前12个字节跟着第一次的4个字节填满16级FIFO进入中断,读取数据发现错误,给上位机发送信息让其重新发数据(16个),这时候重新接收无法把FIFO清零,第二次收到的后4个字节又会跟新的数据前12个一起进入中断。我是想发现读的数据错误,能把FIFO清零这样再次接收就不会有问题了
可不可以帮我看下这个问题: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时就不会错位了。但是发现清不了FIFO还是一直错位
Hank Zhao:
回复 Jia Li3:
你可以在先清除FIFO,然后给上位机发消息,等待一段时间之后再Re-enable FIFO,把后四位给丢弃掉。
可不可以帮我看下这个问题: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时就不会错位了。但是发现清不了FIFO还是一直错位
Jia Li3:
回复 Hank Zhao:
我知道Re-enable FIFO是ScicRegs.SCIFFRX.bit.RXFIFORESET=1;
我想知道的是清除FIFO怎么设置?各种办法都一直清不掉
1,ScicRegs.SCIFFRX.bit.RXFIFORESET=0;吗?功能描述写0将接收器FIFO指针复位到0是相当于清除FIFO了吗?
2,还是对RXFFST状态位进行设置?
可不可以帮我看下这个问题: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时就不会错位了。但是发现清不了FIFO还是一直错位
Hank Zhao:
回复 Jia Li3:
1,是的,RXFIFORESET写0将接收器FIFO指针复位到0就是相当于清除了FIFO,下次接收到数据就会放入FIFO 0的位置,之后再放入FIFO 1。
2,RXFFST状态位是只读的,不能设置。
可不可以帮我看下这个问题: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时就不会错位了。但是发现清不了FIFO还是一直错位
Jia Li3:
回复 Hank Zhao:
谢谢啦