我用UART4与DSP连接,dsp通过UART发送命令,TM4C129X收到后作出相应指令。
现在我用接收中断的方式,因为TM4C129X还有其他的任务在做不能一直等在UART_readPolling这个函数中,所以采用的中断方式。
但是进入中断callback函数之后,只能读到第2个byte,并没有读到第一个byte,比如发送{0x90,0x03,0x24,0x4b,0x6f,0xa5},进入中断之后 ,
UART_readPolling(gUart4Hdl, inputheadChar, 1) 只能读到0x03开始的,我理解是FIFO是16bytes的,设了level是1/8所以,是接收到2个byte才产生中断;那需要什么方法才能将接收到的数据,都读到呢?
禁用FIFO之后,相当于深度只有1了,当DSP发送过来数据之后,就会产生over错误中断,也不能正常接收数据。
代码如下:
UART_Params_init(&UartParams);
UartParams.baudRate = 9600;
UartParams.readDataMode=UART_DATA_TEXT;
UartParams.readMode = UART_MODE_CALLBACK; /*!< Mode for all read calls */
UartParams.readCallback = Drv_UartCharGet; /*!< Pointer to read callback */
UartParams.readEcho = UART_ECHO_OFF;
gUart4Hdl = UART_open(Board_UART4, &UartParams);
if (gUart4Hdl == NULL)
{
System_printf("Error open UART4\n");
return FAIL;
}
UARTIntClear(UART4_BASE, UART_INT_RT);
UARTIntEnable(UART4_BASE, UART_INT_RT);
UARTFIFOLevelSet(UART4_BASE,UART_FIFO_TX1_8,UART_FIFO_RX1_8);
UARTFIFOEnable(UART4_BASE);
UARTDisableSIR(UART4_BASE);
void Drv_UartCharGetUser(void)
{
UINT8 i;
if(UARTCharsAvail(UART4_BASE))
{
UART_readPolling(gUart4Hdl, inputheadChar, 1);
if(inputheadChar[0] == 0x90)
{
for(i=1; i<5; i++)
{
UART_readPolling(gUart4Hdl, &inputheadChar[i], sizeof(UINT8));
}
}
}
}
Jacky Xu:
你用的操作系统?
如果没用,那你的中断子程序是什么?
Matt Tian:
回复 Jacky Xu:
用的sys/bios
xyz549040622:
回复 Matt Tian:
不行的话,用DMA传。一个字节的FIFO也是可以的。你的处理方式不对,收一个存一个是最简单的。