CC3200串口接收中断问题
TI工程师,你们好
我在使用串口时,把FIFO禁止,并且不使用DMA方式,只是单纯的中断方式,为何接收中断的触发还是以1/8 FIFIO来触发,也就是说每次一定要发送偶数个数据中断才触发,我看到DATASHEET上说明,如果禁止FIFO了,他会有个前置1字节的寄存器来保存接收到的数据,请问有什么办法来触发只要来数据了就出发接收中断呢?
以下是我初始化串口的代码片段:
MAP_PRCMPeripheralClkEnable(PRCM_UARTA0, PRCM_RUN_MODE_CLK); MAP_PinTypeUART(PIN_55, PIN_MODE_3); MAP_PinTypeUART(PIN_57, PIN_MODE_3); MAP_UARTFIFODisable(UARTA0_BASE); MAP_UARTConfigSetExpClk(UARTA0_BASE, MAP_PRCMPeripheralClockGet(PRCM_UARTA0), UART0_BAUD_RATE, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); MAP_UARTIntRegister(UARTA0_BASE, UARTIntHandler); MAP_UARTTxIntModeSet(UARTA0_BASE, UART_TXINT_MODE_EOT); MAP_UARTIntEnable(UARTA0_BASE, UART_INT_RX); MAP_UARTIntEnable(UARTA0_BASE, UART_INT_TX); MAP_UARTEnable(UARTA0_BASE); ...
这里是我检测和处理中断的代码片段:
static void UARTIntHandler(void){ long temp_data; unsigned long ulStatus = MAP_UARTIntStatus(UARTA0_BASE, true); if(UART_INT_RX & ulStatus){//Receive Interrupt ulStatus ^= UART_INT_RX; MAP_UARTIntClear(UARTA0_BASE, UART_INT_RX); temp_data = HWREG(UARTA0_BASE + UART_O_DR); ... } if(UART_INT_OE & ulStatus){//Overrun Error Interrupt ulStatus ^= UART_INT_OE; MAP_UARTIntClear(UARTA0_BASE, UART_INT_OE); temp_data = HWREG(UARTA0_BASE + UART_O_DR); } if(UART_INT_TX & ulStatus){//Transmit Interrupt ulStatus ^= UART_INT_TX; MAP_UARTIntClear(UARTA0_BASE, UART_INT_TX); ... } MAP_UARTIntClear(UARTA0_BASE, ulStatus); }
你好,
CC3200的UART的FIFO是16*8bit,FIFO的level最少可以配置在1/8,也就是最少需要2个字节来触发中断。
如果你需要每个字节都触发中断的话,你可以添加另外一个Time out的中断触发。
在UART的初始化的时候加上
UARTIntClear(UARTA0_BASE, UART_INT_RT);
UARTIntEnable(UARTA0_BASE, UART_INT_RT);
在中断处理函数里面加上
if(ulStatus & UART_INT_RT)
{
}
VV,谢谢你的回答
那这个Time out中断是接收数据超时呢,还是我应用没能及时读取而超时呢,既然是超时,那这个超时时间又是多少呢?那是否加了这个中断后RX中断还是需要吗?
能否说明一下使用这个Time out中断来接收单字节的原理呢?谢谢
VV 谢谢你的回答,我想我明白了.
亲,您好,我正好也用到UART中断接收,能够向您请教一下,我QQ:1297491250,谢谢呀
好的,可以互相交流一下,你现在遇到什么问题呢?
奇数的时候,有一个字符发送不出去呀
这个问题我之前有遇到过,我的解决办法是不使用FIFO,设置串口参数 MAP_UARTTxIntModeSet(UARTA0_BASE, UART_TXINT_MODE_EOT); ,使串口发完最后一位才触发中断。
另外还要 VV大神说设置处理RecvTimer标志,就可以解决这个问题了
我想请问下,这个Time out的中断触发的时间间隔是多少呢?
UARTIntClear(UARTA0_BASE, UART_INT_RT); UARTIntEnable(UARTA0_BASE, UART_INT_RT);
请问不使用fifo进行中断,选用特定的字符,比如换行符或者$。谢谢