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

 
 
 
Reply to this topicStart new topic
> NIOS + UART прерывания
Acvarif
сообщение Aug 16 2015, 12:32
Сообщение #1


Знающий
****

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



Застрял на прерываниях по NIOS UART. Точнее на прерываниях по endofpacket.
Обработчик:
Код
....
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. Как в случае прерывания по концу пакета записывать пришедшие до того байты самого пакета?

Кто сталкивался поясните пожалуйста коротко как это все работает.
Go to the top of the page
 
+Quote Post
Unfog
сообщение Aug 17 2015, 06:09
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 20-05-12
Из: Санкт-Петербург
Пользователь №: 71 932



В документе ds_nios_uart.pdf на странице 3 есть табличка, в которой есть этот EOP.
На странице 9 в табл. 3 есть маска прерывания по EOP. Дальше там все расписано.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Aug 17 2015, 09:36
Сообщение #3


Знающий
****

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



Цитата(Unfog @ Aug 17 2015, 09:09) *
В документе ds_nios_uart.pdf на странице 3 есть табличка, в которой есть этот EOP.
На странице 9 в табл. 3 есть маска прерывания по EOP. Дальше там все расписано.

Спасибо. Нашел. Прочитал. Получается по умолчанию в регистре EOP 0х00"..endofpacket Register
The end of packet character is determined by the value of the endofpacket register. The default value is zero..."
Тоесть если в пакете информации встретится 0х00 то будет сгенерировано прерывание конца пакета?
Go to the top of the page
 
+Quote Post
Unfog
сообщение Aug 17 2015, 10:37
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 20-05-12
Из: Санкт-Петербург
Пользователь №: 71 932



Если оно разрешено, то да. "Enable interrupt for an end of packet encountered"
Удобно для байт-стаффинга, например.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Aug 17 2015, 12:54
Сообщение #5


Знающий
****

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



Цитата(Unfog @ Aug 17 2015, 13:37) *
Если оно разрешено, то да. "Enable interrupt for an end of packet encountered"
Удобно для байт-стаффинга, например.

Понятно. Да, стаффинг это что? Типа ловля нужного байта? Не совсем врубаюсь как при этом режиме записывать в массив все предыдущие байты до байта конца пакета.
В случае прерываний по каждому байту все просто. Каждое прерывание инкрементирует счетчик, который является номером байта в массиве и записывает принятый байт в нужное место массива . В случае с прерыванием по концу пакета такой номер не пройдет. Как в этом случае накапливать в массив информацию?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 17 2015, 13:05
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ДМА, например, FIFO автомат,
Go to the top of the page
 
+Quote Post
Unfog
сообщение Aug 17 2015, 15:25
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 20-05-12
Из: Санкт-Петербург
Пользователь №: 71 932



Цитата
Как в этом случае накапливать в массив информацию?

Для простоты, имхо, лучше начать с FIFO.
Цитата
Да, стаффинг это что?

Кодирование передачи таким образом, чтобы она всегда заканчивалась на определенный символ, который при этом отсутствует в теле посылки. Очень упрощает прием. Если нужно могу подробно описать.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Aug 17 2015, 16:16
Сообщение #8


Знающий
****

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



Цитата(Unfog @ Aug 17 2015, 18:25) *
Для простоты, имхо, лучше начать с FIFO.

Кодирование передачи таким образом, чтобы она всегда заканчивалась на определенный символ, который при этом отсутствует в теле посылки. Очень упрощает прием. Если нужно могу подробно описать.

Спасибо. В целом понятно. В продолжение темы возник еще вопрос по Avalon записи, которая должна быть после приема пакета с генерацией прерывания по концу пакета. Далее формируется импульс во внешнем устройстве типа так:
Код
        // формирование пуска транзакций
        IOWR_32DIRECT(FIRENISEY_0_BASE, 0, 1);
        Delay(0x000f);
        IOWR_32DIRECT(FIRENISEY_0_BASE, 0, 0);
        Delay(0x000f);

Диаграмма выглядит так:
Прикрепленное изображение

Процес записи делаю так:
Код
.....
    -- формирование запуска одной транзакции
    process(clk)
    begin
    if (falling_edge(clk)) then
        if(avs_s0_address = "00" and avs_s0_write_n = '0') then
            if(avs_s0_writedata = "00000000000000000000000000000001") then
                s_aso_out0_ready <= '1';
            elsif (avs_s0_writedata = "00000000000000000000000000000000") then    
                s_aso_out0_ready <= '0';
....
Суть непонятки: Все должно выполниться по отрицательному фронту clk. Что имеется ввиду под clk? Это системный клок? Дело в том, что я использую в качестве clk частоту которая присутствует в моем внешнем устройстве. Эта частота ниже в 5 раз системной (100 mHz) частоты и не связана с системной частотой, поскольку идет с другого выхода PLL.
Запись работает. Вопрос в том насколько надежна будет такая система записи данных во внешнее устройство с шины Avalon?
Go to the top of the page
 
+Quote Post
Unfog
сообщение Aug 17 2015, 18:05
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 20-05-12
Из: Санкт-Петербург
Пользователь №: 71 932



Не уловил сути, если честно.
Это какой то запускающий импульс?
Цитата(Acvarif @ Aug 17 2015, 19:16) *
Код
        // формирование пуска транзакций
        IOWR_32DIRECT(FIRENISEY_0_BASE, 0, 1);
        Delay(0x000f);
        IOWR_32DIRECT(FIRENISEY_0_BASE, 0, 0);
        Delay(0x000f);

Если да, то его можно просто в PIO писать. Там все по фронту клока, на котором NIOS работает будет писаться. Далее если нужно считывать сигнал на другой частоте, то нужно поставить синхронизатор. По простому 2 д-триггера последовательно, и на них вторую частоту и подавать.

И да, clk в данном случае клок NIOS. И данные можно (я бы сказал, что нужно) читать по фронту этой частоты.

Сообщение отредактировал Unfog - Aug 17 2015, 18:08
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Aug 18 2015, 04:58
Сообщение #10


Знающий
****

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



Цитата(Unfog @ Aug 17 2015, 21:05) *
Не уловил сути, если честно.
Это какой то запускающий импульс?

Да, это импульс от которого начинает разворачиваться вся диаграмма работы устройства. Просто импульс формируется внутри устройства без выхода на PIO.
И таки да. Его можно сформировать на PIO. Только тогда нужно будет задействовать 2 ножки PIO. Одна будет выходом импульса, который формируется по прерыванию в программе NIOS, другая входом в схему устройства.


Спасибо.

Сообщение отредактировал Acvarif - Aug 18 2015, 05:02
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 07:34
Рейтинг@Mail.ru


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