TI中文支持网
TI专业的中文技术问题搜集分享网站

28335 SCI 如何清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:

清零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:

谢谢啦

赞(0)
未经允许不得转载:TI中文支持网 » 28335 SCI 如何清FIFO
分享到: 更多 (0)