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.

2808的SCI通信

用2808的SCIa实现串行通信,可是单步执行时发现发送两个数据后TXRDY位就自动变为零了   这是什么原因呢?

  • 变零以后再也变不回来吗?

  • 是的  变零以后就再也变不回来了     请问这是什么原因呢?

  • zhujing,

          你的SCI有没有使能FIFO功能?TXRDY标志位在写入数据之后会自动清零。有没有具体代码,把情况说得更具体点。

  • 我没有使用FIFO功能,就是简单的程序如下:

    #include "DSP280x_Device.h"     // Headerfile Include File

    #include "DSP280x_Examples.h"   // Examples Include File

    Uint16 Sci_VarRx[10]={0x11,0xee,0x33,0xaa,0x44,0xbb,0x55,0xcc,0x66,0xdd};

     unsigned int i;

    void InitSci()

     {  

          SciaRegs.SCICCR.bit.STOPBITS=0;  

          SciaRegs.SCICCR.bit.PARITYENA=0;  

          SciaRegs.SCICCR.bit.LOOPBKENA=0;  

          SciaRegs.SCICCR.bit.ADDRIDLE_MODE=0;  

          SciaRegs.SCICCR.bit.SCICHAR=7;  

          SciaRegs.SCICTL1.bit.TXENA=1;  

          SciaRegs.SCICTL1.bit.RXENA=0;  

          SciaRegs.SCIHBAUD=0x01;  

          SciaRegs.SCILBAUD=0x43;  

          SciaRegs.SCICTL1.bit.SWRESET=1; 

     }

    void InitGpio()

     {

        EALLOW;

        GpioCtrlRegs.GPAPUD.bit.GPIO28= 0;   

        GpioCtrlRegs.GPAMUX2.bit.GPIO28=1; 

         EDIS;

    }

    void main()

     { 

        InitSysCtrl();//关闭看门狗 初始化系统时钟和外设时钟   

        DINT;

        IER = 0x0000;

        IFR = 0x0000;

       InitPieCtrl();

        InitPieVectTable();

        InitGpio();

        InitSci();

        i=0;

        for(;;)

        {        

                if(SciaRegs.SCICTL2.bit.TXRDY) 

                      {

                           SciaRegs.SCITXBUF = Sci_VarRx[i];

                           i++;

                        }          

        }

    //===================================== // No more. //=====================================//

    最开始单步运行时SCICTL2为0x00C0,然后可以把数据0x11传到buff,继续单步时SCICTL2为0x0080,然后可以把数据0xee传到buff,然后再一直单步时SCICTL2就一直是0x0000了,而我全部运行后然后又暂停,buff的值会在数组中的数之间变化,但是SCICTL2的值一直是0x0000。请问这是什么原因呢?

     

     

  • 补充,全部运行后然后又暂停,buff的值会随机变化,但是SCICTL2的值一直是0x0000。

  • zhujing,

    下面的代码有问题,i应该限制不能大于9,如果大于9,归零。另外接一个串口调试助手软件。你可以设一个断点在  SciaRegs.SCITXBUF = Sci_VarRx[i];,点运行。

      

                if(SciaRegs.SCICTL2.bit.TXRDY) 

                      {

                           SciaRegs.SCITXBUF = Sci_VarRx[i];

                           i++;

                        }

  • 嗯 ,  我是加了限制不能大于9的语句,回复的时候改格式删注释时不小心删了;就是在i++后面加上if(i == 10)    {     i = 0;    };我按照您的设置好断点后,buff里面的数据确实是按照数组中的数据顺序能一个一个的发送,可是我上位机上不能接收到,请问这是什么原因呢? 我用的是usb—rs232的串口线,驱动也装好了,难道可能是上位机的问题或者是232芯片问题?PS:为什么单步执行的时候TXRDY在发送两个数据后就一直变为0x0000了呢?   谢谢您了!

  • hajins,

          你要是每次都能够进入设置的断点,就表示标志位是能够置位的。至于为什么看不到,要注意当数据一旦写入buf,这个标志位会自动清零。你可以用CCS的register窗口观看。

           至于上位机不能接收,你要确保参数都设置正确。先用示波器观测芯片的SCITX引脚有数据输出,然后把示波器探针往外部电路移,确保232电路有数据发送出去,如果这一部分没有问题,就是上位机软件的问题。

    Eric