微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > CC3200串口接收中断问题

CC3200串口接收中断问题

时间:10-02 整理:3721RD 点击:

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进行中断,选用特定的字符,比如换行符或者$。谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top