大家好:
我用F28377D的SCI,用轮询方式接收,遇到问题。
Uint16 scid_read(void)
{
Uint16 rtn=0;
while(ScidRegs.SCIFFRX.bit.RXFFST == 0);
rtn = ScidRegs.SCIRXBUF.all;
// while(ScidRegs.SCIFFRX.bit.RXFFST != 0)
// {
// rtn = ScidRegs.SCIRXBUF.all;
// }
return rtn;
}
用上面的方式,可以接收到数据。但是程序就会死等到那里。
但是用下面的方式,接收不到,仿真时可以看到SCIRXBUF寄存器中的数据在变化,说明接收到了,但是while(RXFFST != 0)这个条件就是过不去。
void UART_GpioInit(void)
{
GPIO_SetupPinMux(77, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(77, GPIO_INPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(76, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(76, GPIO_OUTPUT, GPIO_ASYNC);
}
void scid_init(Uint32 baud)
{
//
// Note: Clocks were turned on to the SCIA peripheral
// in the InitSysCtrl() function
//
Uint16 brr;
Uint16 brrh,brrl;
ScidRegs.SCICCR.all = 0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
ScidRegs.SCICTL1.all = 0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
ScidRegs.SCICTL2.all = 0x0000;
ScidRegs.SCICTL2.bit.TXINTENA = 0;
ScidRegs.SCICTL2.bit.RXBKINTENA = 0;
brr=(Uint16)(50000000/(baud*8)-1);//低速时钟50MHz
brrh = brr>>8;
brrl = brr & 0xff;
ScidRegs.SCIHBAUD.all = 0x0002;//9600
ScidRegs.SCILBAUD.all = 0x008B;
ScidRegs.SCICCR.bit.LOOPBKENA = 0; // Enable loop back
ScidRegs.SCICTL1.all = 0x0023; // Relinquish SCI from Reset
}
void scid_fifo_init()
{
ScidRegs.SCIFFTX.all = 0xE040;//初始化发送缓冲寄存器
ScidRegs.SCIFFRX.all = 0x2040;//接收缓冲寄存器0个levle
ScidRegs.SCIFFCT.all = 0x0;
}
while(1)
{
read_data = scid_read();
}
Green Deng:
确认一下,是否使用"(RXFFST != 0)"?(在第一个代码段中对此进行了注释。)
如果您使用的是"while(RXFFST != 0)",则问题在于它将一直保留在这里,直到缓冲区为空。 但是,由于无法传递while循环,因此永远不会清空缓冲区。 解决方案是将其更改为"while(RXFFST == 0)",它将等待直到缓冲区不为空。 然后可以执行其余的读取功能。 请参阅以下C2000Ware SCI函数,该函数显示了使用阻塞字符读取的示例:
C2000Ware_version#\ driverlib \ f2837xd \ examples \ cpu1 \ sci中的sci_ex3_echoback.c
user5860441:
回复 Green Deng:
问题已经解决,多谢。本来想把帖子删除,奈何不知怎么删。
Green Deng:
回复 user5860441:
好的,方便的话可以分享一下解决经验