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.

关于28035的sci通讯

 SciaRegs.SCICCR  的STOP BITS 设定为0时1个停止位时,通讯不正常;

设定为1时2个停止位,通讯正常,想问一下为什么?

  • 您好!

    请参考TI的F28035的官方历程,就用的是1个停止位

    void scia_fifo_init()

    {

      SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback

                                     // No parity,8 char bits,

                                     // async mode, idle-line protocol

      SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,

                                     // Disable RX ERR, SLEEP, TXWAKE

      SciaRegs.SCICTL2.bit.TXINTENA =1;

      SciaRegs.SCICTL2.bit.RXBKINTENA =1;

      SciaRegs.SCIHBAUD = 0x0000;

      SciaRegs.SCILBAUD = SCI_PRD;

      SciaRegs.SCICCR.bit.LOOPBKENA =0; // Enable loop back

      SciaRegs.SCIFFTX.all=0xC000;

      SciaRegs.SCIFFRX.all=0x0028;

      SciaRegs.SCIFFCT.all=0x00;

      SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset

      SciaRegs.SCIFFTX.bit.SCIRST=1;

      SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;

      SciaRegs.SCIFFRX.bit.RXFIFORESET=1;

    }

  • void scia_fifo_init()

    {

    SciaRegs.SCICCR.all =0x0087;   // 2 stop bit,  No loopback

                                     // no parity,8 char bits,

                                     // async mode, idle-line protocol

      SciaRegs.SCICTL1.all =0x0007;  // enable TX, RX, internal SCICLK,

                                     // Disable RX ERR, SLEEP, TXWAKE

      SciaRegs.SCICTL2.bit.TXINTENA =1;

      SciaRegs.SCICTL2.bit.RXBKINTENA =1;

      SciaRegs.SCIHBAUD = 0x0000;

      SciaRegs.SCILBAUD = 0x0060;

    //  SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back

      SciaRegs.SCIFFTX.all=0xC028;

      SciaRegs.SCIFFRX.all=0x0021;

      SciaRegs.SCIFFCT.all=0x00;

      SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset

      SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;

      SciaRegs.SCIFFRX.bit.RXFIFORESET=1;

    }

    上面的程序能正常工作

    void scia_fifo_init()

    {

    SciaRegs.SCICCR.all =0x0007;   // 1stop bit,  No loopback

                                     // no parity,8 char bits,

                                     // async mode, idle-line protocol

      SciaRegs.SCICTL1.all =0x0007;  // enable TX, RX, internal SCICLK,

                                     // Disable RX ERR, SLEEP, TXWAKE

      SciaRegs.SCICTL2.bit.TXINTENA =1;

      SciaRegs.SCICTL2.bit.RXBKINTENA =1;

      SciaRegs.SCIHBAUD = 0x0000;

      SciaRegs.SCILBAUD = 0x0060;

    //  SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back

      SciaRegs.SCIFFTX.all=0xC028;

      SciaRegs.SCIFFRX.all=0x0021;

      SciaRegs.SCIFFCT.all=0x00;

      SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset

      SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;

      SciaRegs.SCIFFRX.bit.RXFIFORESET=1;

    }

    改成一个停止位就不行,为什么?

  • interrupt void sciaTxFifoIsr(void)

    {

    Uint16 i;

    EINT;

    if(SdataA_Num<=16)

    {

       for(i=0; i< SdataA_Num; i++)

       {

       while (SciaRegs.SCIFFTX.bit.TXFFST != 0){}    

      SciaRegs.SCITXBUF=SdataA[i];     // Send data

    }

    EDIS;   // This is needed to disable write to EALLOW protected registers

       PieCtrlRegs.PIEIER9.bit.INTx2=0;     // PIE Group 9, INT2

       EINT;

    SciaRegs.SCIFFTX.bit.TXFFINTCLR=1; // Clear SCI Interrupt flag

    PieCtrlRegs.PIEACK.all|=0x100;      // Issue PIE ACK

    }

    SdataA_Num = 7 ,我上位机只能收到5个字节,CRC校验的字节丢失。

  • 用历程也不行么?

  • 历程一个停止位是没问题的,我以上两个程序,只相差SciaRegs.SCICCR.all =0x0007; SciaRegs.SCICCR.all =0x0087; 一个停止位,一个能工作,一个不能工作,很奇怪

  • 原因找到了,是因为接受中断函数中SciaRegs.SCICTL1.bit.SWRESET=1;引起的,注释掉后,正常了