用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了呢? 谢谢您了!