Обработчик:
Код
....
alt_u8 *buf_uart;
alt_u8 uart_count = 0;
....
static void uart_isr(void* context, alt_u32 id)
{
alt_u32 status;
// Чтение регистра статуса для определения причины прерываний
status = IORD_ALTERA_AVALON_UART_STATUS(UART_0_BASE);
// Очистка всех флагов ошибок
IOWR_ALTERA_AVALON_UART_STATUS(UART_0_BASE, 0);
// Прцесс чтения irq
if (status&ALTERA_AVALON_UART_STATUS_RRDY_MSK)
{
buf_uart[uart_count] = IORD_ALTERA_AVALON_UART_RXDATA(UART_0_BASE);
uart_count++;
}
// Процесс записи irq
if(uart_count >= 5)
{
// Флаг старта в основном цикле main
Start = 1;
if (status&ALTERA_AVALON_UART_STATUS_TRDY_MSK)
{
IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, buf_uart[uart_count - 1]);
}
uart_count = 0;
}
}
....
alt_u8 *buf_uart;
alt_u8 uart_count = 0;
....
static void uart_isr(void* context, alt_u32 id)
{
alt_u32 status;
// Чтение регистра статуса для определения причины прерываний
status = IORD_ALTERA_AVALON_UART_STATUS(UART_0_BASE);
// Очистка всех флагов ошибок
IOWR_ALTERA_AVALON_UART_STATUS(UART_0_BASE, 0);
// Прцесс чтения irq
if (status&ALTERA_AVALON_UART_STATUS_RRDY_MSK)
{
buf_uart[uart_count] = IORD_ALTERA_AVALON_UART_RXDATA(UART_0_BASE);
uart_count++;
}
// Процесс записи irq
if(uart_count >= 5)
{
// Флаг старта в основном цикле main
Start = 1;
if (status&ALTERA_AVALON_UART_STATUS_TRDY_MSK)
{
IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, buf_uart[uart_count - 1]);
}
uart_count = 0;
}
}
....
По прерыванию на прием одного байта все работает неплохо. Но хотелось бы разобраться как использовать прерывания по символу endofpacket. Пока не врубаюсь как это все должно работать. Существует регистр конца пакета. Совпадение очередного принятого байта с символом конца пакета сгенерит прерывание. В связи с этим вопросы:
1. Что это за символ? 0х0А? Если да то как он попадает в регистр конца пакета?
2. Как в случае прерывания по концу пакета записывать пришедшие до того байты самого пакета?
Кто сталкивался поясните пожалуйста коротко как это все работает.