Байты приходят короткими пакетами по 72 байта с периодом 0.5 сек. Если количество принятых байт равно
72 и первый байт равен 0х55 то Start = 1; В основном цикле main все сбрасывается (uart_count, Start).
...
Код
alt_u8 Start = 0;
alt_u8 buf_uart[256];
alt_u16 uart_count = 0;
...
// Инициализация прерываний по UART
void Uart_irq_init()
{
// Регистрация обработчика прерываний
alt_irq_register(UART_0_IRQ, (void*)UART_0_IRQ, uart_isr);
}
...
// прерывания по UART
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++;
}
if(uart_count == 72 && buf_uart[0] == 0x55)
{
Start = 1;
uart_count = 0;
}
}
alt_u8 buf_uart[256];
alt_u16 uart_count = 0;
...
// Инициализация прерываний по UART
void Uart_irq_init()
{
// Регистрация обработчика прерываний
alt_irq_register(UART_0_IRQ, (void*)UART_0_IRQ, uart_isr);
}
...
// прерывания по UART
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++;
}
if(uart_count == 72 && buf_uart[0] == 0x55)
{
Start = 1;
uart_count = 0;
}
}
Main
Код
int main (void)
{
alt_u8 led = 0x2;
alt_u8 dir = 0;
Uart_irq_init();
alt_irq_enabled();
// главный цикл
while(1)
{
if(Start == 1)
{
Start = 0;
// бегущий светодиод
if(led & 0x81)
dir = (dir ^ 0x1);
if(dir)
led = led >> 1;
else
led = led << 1;
// запись в PIO_0_BASE (0x00000000) led
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, led);
}
}
return 0;
}
{
alt_u8 led = 0x2;
alt_u8 dir = 0;
Uart_irq_init();
alt_irq_enabled();
// главный цикл
while(1)
{
if(Start == 1)
{
Start = 0;
// бегущий светодиод
if(led & 0x81)
dir = (dir ^ 0x1);
if(dir)
led = led >> 1;
else
led = led << 1;
// запись в PIO_0_BASE (0x00000000) led
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, led);
}
}
return 0;
}
Данный тест проводится на Циклоне 4 (DE0Nano Terasic). Проблема в том, что если количество байт в пакете небольшое (~40) то все работает нормально. С увеличением количества байт в пекете очевидно сбивается счетчик uart_count и первый синхробайт 0x55 уже не определяется. Код простейший. Подскажите пожалуйста что в нем не так?