大家好,求大家指点,我用的是STK上的例程写的UART程序,只用了UART初始化部分和读写操作程序,没有使用中断和EDMA搬运,但是现在遇到了一个问题,就是数据传输时,只能读取到我发送的前16字节数据,或者是最后的一个字节数据加上前15字节数据。而且就只能读到一次,后面时,我查了一下,发现读命令时,if(localUART_Regs->LSR & CSL_UART_LSR_DR_MASK)条件一直不满足,没法读数据。请问应该怎么改呢。是不是每次读写完之后,都要配置TXCLR,RXCLR清FIFO寄存器呢?
部分配置如下:MCR:禁止AUTO_FLOW,(不太懂这个是什么意思)
MGMT:FREE为0;
FCR: FIFOEN:1;FIFO模式; DMAMODE 1;DMA模式启动。 trigger level:14;
代码如下:
使用的读写命令:
写命令:KeyStone_UART_write(&r_cmd[0], 1, 0);
读命令:KeyStone_UART_read(&r_buf[i], 64, 0);
UART初始化部分代码:
波特率:115200,ioopback模式为0,TEST_UART_NUM=0;
gUARTCfg.DSP_Core_Speed_Hz = gDSP_Core_Speed_Hz;
gUARTCfg.dataLen = DATA_LEN_8BIT;
gUARTCfg.parityMode = PARITY_DISABLE;
gUARTCfg.stopMode = ONE_STOP_BIT;
gUARTCfg.autoFlow = AUTO_FLOW_DIS;
gUARTCfg.osmSel = OVER_SAMPLING_16X;
gUARTCfg.fifoRxTriBytes = TRIGGER_LEVEL_14BYTE;
gUARTCfg.txMaster = txMaster;
gUARTCfg.bLoopBackEnable = bLoopBackEnable;
unsigned int buffByteLen, Uint32 uartNum)
{
Uint32 byteCnt;
CSL_UartRegs *localUART_Regs;
{
if(localUART_Regs->LSR & CSL_UART_LSR_DR_MASK)
{
buffer[byteCnt] = localUART_Regs->RBR;
}
else //FIFO empty
break;
}
return byteCnt;
}
zhongji song:
回复 Thomas Yang1:
谢谢你的回答,这个地方虽然设置了gUARTCfg.bLoopBackEnable = bLoopBackEnable;但后面用的时候我禁止了。更改波特率试了一下,还是不行。我认为是UART的FIFO一共就16字节,所以如果超过十六字节的话,就需要每次用读命令去读16字节。而且如果连着用读命令,还是不行的,还必须要一个写命令,一个读命令,这样才能读到超过16字节的数据。
user4684431:
我也遇到了同样的问题,请问您的问题解决了吗?