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.

F28335接收进不去中断



//SCI初始化

void InitSci(void)
{
   
       InitSciGpio();

    SciaRegs.SCIFFTX.all=0xE040;
    SciaRegs.SCIFFRX.all=0x204f;
     SciaRegs.SCICCR.all =0x0007;  
    SciaRegs.SCICTL1.all =0x0003; 
                                 
    SciaRegs.SCICTL2.bit.TXINTENA =0;            //关闭发送中断
    SciaRegs.SCICTL2.bit.RXBKINTENA =1;            //接收中断使能
    SciaRegs.SCIHBAUD    =0x0007;  // 2400 baud @LSPCLK = 37.5MHz.
    SciaRegs.SCILBAUD    =0x00a0;
 
    
    SciaRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset

    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
    SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;
    IER |= M_INT9;                        //使能第9中断级
    PieCtrlRegs.PIEIER9.bit.INTx1 = 1;        //使能SCI-A中断
    EINT;                                //使能全局中断
    ERTM;
}

//中断服务程序

interrupt void SciaRxIsr(void)
{
    pp = SciaRegs.SCIRXBUF.all;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
    SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;
    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;  
}
可以看到SCIRXBUF中有数据,但是就是进入不了中断,求各位指导

  • 楼主参考一下28335的scia_loopback_interrupts例程。比对一下看看有什么区别。

    SCI必须是符合中断要求才会进入中断,没有超时中断。我看到楼主设定的SciaRegs.SCIFFRX.all=0x204f;也就是说SCI要接收满16个数据才会进入中断。

     

  • 谢谢你的解答,改了后好用了,但是在中断服务程序中接收会出现乱序的情况,比如发送的是1,2,3,4,5,接收就变成1,4,2,5,3,在主程序中接收不会出现这种情况。

    另外还有一个问题我不使用FIFO模式,把关于SCIFFRX的配置注释掉后为什么进不去中断了呢

    void InitSci(void)
    {
       
           InitSciGpio();
         SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                      
        SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                     
        SciaRegs.SCICTL2.bit.TXINTENA =0;            //关闭发送中断
        SciaRegs.SCICTL2.bit.RXBKINTENA =1;            //接收中断使能
        SciaRegs.SCIHBAUD    =0x0007;  // 2400 baud @LSPCLK = 37.5MHz.
        SciaRegs.SCILBAUD    =0x00a0;
     
        SciaRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset

     
         IER |= M_INT9;                        //使能第9中断级
        PieCtrlRegs.PIEIER9.bit.INTx1 = 1;        //使能SCI-A中断
        EINT;                                //使能全局中断
        ERTM;
    }   

    interrupt void SciaRxIsr(void)
    {
          pp = SciaRegs.SCIRXBUF.all;
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
     }

  • 注释掉之后,其他的地方有重新设置SCIFFRX没有?比如RXFFIENA Receive FIFO interrupt enable要允许。

    不应该是乱序,估计发送的时候就是14253,比如发送的是long型0x12345678,按照地址顺序发送就是0x78,0x56,0x34,0x12

     

  • 现在解决了,是FIFO接收中断等级设置错误,没有完全理解FIFO,现在用了感觉FIFO真不错,但是由于我一次要接收5个数,有三个标志数,在中断数组接收不能保证第一个就是标志数啊,所以用FIFO后还得找标志,这样处理有点麻烦,再问下怎样能确保第一个数就是标志数呢,就是我知道的数,也就是说每次取出来的5个数的顺序都是确定的

  • 发给SCI的数据的顺序和读出来的顺序应该是一样的,不应该,发送的是1,2,3,4,5,接收就变成1,4,2,5,3

    楼主,您可以参考一下TI例程包中的scia_loopback_interrupts例程,里面发送和接收的顺序是一样的,并且程序中还有校验。