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

2808的SCI通信

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

Victor Zheng:

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

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

hajinsoul:

回复 Victor Zheng:

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

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

Eric Ma:

zhujing,

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

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

hajinsoul:

回复 Eric Ma:

我没有使用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。请问这是什么原因呢?

 

 

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

hajinsoul:

回复 hajinsoul:

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

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

Eric Ma:

回复 hajinsoul:

zhujing,

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

  

            if(SciaRegs.SCICTL2.bit.TXRDY) 

                  {

                       SciaRegs.SCITXBUF = Sci_VarRx[i];

                       i++;

                    }

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

hajinsoul:

回复 Eric Ma:

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

赞(0)
未经允许不得转载:TI中文支持网 » 2808的SCI通信
分享到: 更多 (0)