Почему-то не сбрасываются прерывания UART'a. В коде ниже выдает "InterruptInterrupt...", но никогда - точный тип прерывания. Т.е. ни одно условие status & interrupt type не срабатывает. Уже пробовал отключать прерывания, но там есть свои проблемы.
UART_RXFIFO_FULL_INT_CLR тоже пробовал.
UART_RXFIFO_FULL_INT_CLR тоже пробовал.
Код:
LOCAL void
uart0_rx_intr_handler(void *para)
{
ETS_UART_INTR_DISABLE();
#ifdef DEBUG
os_printf("Interrupt");
#endif // DEBUG
uint32 rx_count = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S) & UART_RXFIFO_CNT;
if(rx_count > 0)
{
available += rx_count;
#ifdef DEBUG
os_printf("RX_COUNT: %lu\r\n", rx_count);
#endif // DEBUG
while(rx_count-- > 0)
{
uint8 c = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
uart_buffer[write_pointer] = c;
#ifdef DEBUG
os_printf("Got char 0x%02x\r\n", c);
#endif // DEBUG
write_pointer = (write_pointer == UART_BUF_SIZE -1) ? 0 : write_pointer+1;
}
}
uint32 status = READ_PERI_REG(UART_INT_ST(UART0));
if (status & UART_RXFIFO_FULL_INT_ST)
{
#ifdef DEBUG
os_printf("RX FIFO is full\r\n");
#endif // DEBUG
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);
}
if(status & UART_BRK_DET_INT_ST)
{
#ifdef DEBUG
os_printf("BRK interrupt\r\n");
#endif // DEBUG
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_BRK_DET_INT_CLR);
}
if(status & UART_CTS_CHG_INT_ST)
{
#ifdef DEBUG
os_printf("CTS change interrupt\r\n");
#endif // DEBUG
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_CTS_CHG_INT_CLR);
}
if(status & UART_DSR_CHG_INT_ST)
{
#ifdef DEBUG
os_printf("DSR change interrupt\r\n");
#endif // DEBUG
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_DSR_CHG_INT_CLR);
}
if(status & UART_RXFIFO_OVF_INT_ST)
{
#ifdef DEBUG
os_printf("RX FIFO overflow interrupt\r\n");
#endif // DEBUG
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_OVF_INT_CLR);
}
if(status & UART_FRM_ERR_INT_ST)
{
#ifdef DEBUG
os_printf("Frame error interrupt\r\n");
#endif // DEBUG
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_FRM_ERR_INT_CLR);
}
if(status & UART_PARITY_ERR_INT_ST)
{
#ifdef DEBUG
os_printf("Parity error interrupt\r\n");
#endif // DEBUG
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_PARITY_ERR_INT_CLR);
}
if(status & UART_TXFIFO_EMPTY_INT_ST)
{
#ifdef DEBUG
os_printf("TX FIFO empty interrupt\r\n");
#endif // DEBUG
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_TXFIFO_EMPTY_INT_CLR);
}
if(available >= 4)
{
#ifdef DEBUG
os_printf("UART Call communication task\r\n");
#endif // DEBUG
system_os_post(COMMUNICATION_TASK_PRIO, EVENT_UART_MESSAGE, 0);
}
else
{
ETS_UART_INTR_ENABLE();
}
//CLEAR_PERI_REG_MASK(UART_INT_ENA(UART0), UART_RXFIFO_FULL_INT_ENA|UART_RXFIFO_TOUT_INT_ENA |
//UART_RXFIFO_OVF_INT_ENA | UART_FRM_ERR_INT_ENA | UART_PARITY_ERR_INT_ENA);
//CLEAR_PERI_REG_MASK(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR | UART_TXFIFO_EMPTY_INT_CLR);
}