реклама на сайте
подробности

 
 
> Nios II Uart прерывания по приему байта
Acvarif
сообщение Jun 26 2016, 07:29
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Организованы в системе на Nios II прерыывания Uart по приему одного байта на скорости 115200
Байты приходят короткими пакетами по 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;
  }
}

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;
}


Данный тест проводится на Циклоне 4 (DE0Nano Terasic). Проблема в том, что если количество байт в пакете небольшое (~40) то все работает нормально. С увеличением количества байт в пекете очевидно сбивается счетчик uart_count и первый синхробайт 0x55 уже не определяется. Код простейший. Подскажите пожалуйста что в нем не так?

Сообщение отредактировал Acvarif - Jun 26 2016, 07:37
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 16:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01353 секунд с 7
ELECTRONIX ©2004-2016