This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

am335x uart fifo 中断异常?



starterware上的uartEcho中的例子中配置uart0的FIFO triggle 值为1,我想配置FIFO大些,有些疑惑,修改的过程如下:

 

1.FIFO配置

#define TX_TRIGGLE_LEVEL 4
#define RX_TRIGGLE_LEVEL 60


void uart_fifo_configure(void)
{
      uint32_t fifoConfig = 0;
      fifoConfig = UART_FIFO_CONFIG(UART_TRIG_LVL_GRANULARITY_1,
      UART_TRIG_LVL_GRANULARITY_1,
      TX_TRIGGLE_LEVEL,
      RX_TRIGGLE_LEVEL,
     1,
     1,
     UART_DMA_EN_PATH_SCR,
     UART_DMA_MODE_0_ENABLE);
     UARTFIFOConfig(SOC_UART_0_REGS,fifoConfig);
}

2. 使能中断 

IntMasterIRQEnable(); //Enable IRQ
IntAINTCInit(); //Init IRQ

UARTIntEnable(SOC_UART_0_REGS,UART_INT_RHR_CTI);

3.中断服务程序

 

case UART_INTID_RX_THRES_REACH:
case UART_INTID_CHAR_TIMEOUT:
  {
                     lcrRegValue = UARTRegConfigModeEnable(SOC_UART_0_REGS, UART_REG_OPERATIONAL_MODE);
                     while(UARTCharsAvail(SOC_UART_0_REGS))
                     {
                                uart_interface[0].uart_rx_buf[uart_interface[0].uart_rx_write_pos] = (HWREG(SOC_UART_0_REGS+ UART_RHR));
                                uart_interface[0].uart_rx_write_pos++;
                                uart_interface[0].uart_rx_write_pos %= UARTMAXBUF;
                    }

HWREG(SOC_UART_0_REGS + UART_LCR) = lcrRegValue;
}

nCount++;

break;

 

 

在第三步,我的测试如下

1)用调试器下载程序之后,按F8运行,在PC上发送一串字符串,发送完之后,暂停程序,发现nCount值为字符串的长度(nCount已经初始化为0),说明来了一个字符就发生中断了。然后我怀疑到FIFO triggle设置失败。有了第二个测试。

2) 下载程序之后,在中断开始位置设置断点,然后F8运行,在PC上发送一串字符串,发送完之后,中断发生,断下之后按F8继续,之后断点没有起作用,说明没有进入中断,暂停程序之后, 发现nCount值为1,说明只有产生了一个中断,查看buffer,字符全部接收完成。说明FIFO是已经启用的。

3) 根据2的测试,再做一次测试,步骤与2相同,只是将断点的位置设置在中断的结束位置。发现只接收了一个字符,并且接下来,还发生了一次中断,接收了所有的字符。

以上设置断点的作用其实就是一个延时的作用,通过测试,说明其triggle值为1。

FIFO设置均使用starterware中提供的函数:UARTFIFOConfig,查看其实现,跟TRM的描述没有什么区别。

请问,可能是什么原因?

谢谢。