Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Nios и UART
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
torik
В SOPC Builder имеется Nios и UART. Необходимо организовать связь с Vinculum. RTOS отсутствует.

Не хотелось бы делать все вручную через регистры UART. Прерывания тоже, вроде не нужны.

Пытаюсь для начала работать с UART как с файлом:

Цитата
char msg1[1024];
FILE* fp;
fp = fopen ("/dev/uart_0", "r+");
if (fp) {
fread (&msg1, strlen(msg1), 1, fp);
}


При этом, во-первых, сообщение от винкулум теряется почти полностью. Во-вторых, сразу после старта программы, когда еще даже не открыт файл, сигнал RTS уже 0. А это есть не правильно, т.к. дает винклуму передать сообщение еще до открытия файла.

Где бы можно поподробнее, с простыми примерами поглядеть, как правильно работать с UART, как с фалом или через HAL? В даташите на сам UART мало чего сказано...
Serhiy_UA
Цитата(torik @ Apr 1 2009, 09:45) *
Не хотелось бы делать все вручную через регистры UART. Прерывания тоже, вроде не нужны.

Лучше все написать самому, без HAL и файлов. Тем более, у Вас без прерываний.
Организуйте выдачу одного байта, потом цепочку. У меня так и работает.

Если у Вас старт-кит, то можно также и через USB-Blaster, с выводом на консоль.
Kuzmi4
Что есть Vinculum не знаю, но в своё время очень сильно терроризировал альтеру по поводу вывода чего либо через УАРТ.
Всё в обсчем свелось к тому что гораздо проще написать свой код для передачи приёма данных по уарту через интерупт, чем подъёзать хал..
Не составило труда портировать код с меги (были наработки smile.gif )
Выложил бы , но оно где то дома в горах дисков......
torik
Цитата
Лучше все написать самому, без HAL и файлов. Тем более, у Вас без прерываний.
Организуйте выдачу одного байта, потом цепочку. У меня так и работает.


А почему это лучше? Мне как раз казалось, что лучше стандартными средствами. Единственное, что непонятно, каким образом "стандартные средства" будут рулить CTS, RTS. Эксперимент показывает, что никак вообще sad.gif.
И тогда уж, где можно картинки посмотреть с сигналами RTS, CTS?

Цитата
Если у Вас старт-кит, то можно также и через USB-Blaster, с выводом на консоль.

Нет, у меня своя плата, но через USB-Blaster также можно вывести на консоль.
Kuzmi4
Цитата
Во-вторых, сразу после старта программы, когда еще даже не открыт файл, сигнал RTS уже 0.

Если глянуть в
http://www.altera.com/literature/hb/nios2/n2cpu_nii51010.pdf
страница 6-14
Цитата
If the Flow Control hardware option is not enabled, the RTS bit always reads 0, and writing
has no effect. Refer to ”Flow Control” on page 6–5.

По ходу то же чт ои у вас наблюдается biggrin.gif

Там так же написано что RTS битик в status-регистре напрямую конектится к пину.... То есть его самому писать нужно..Врядли стандартные халовские ф-ции это делают...
torik
Нет, не то же smile.gif. У меня Flow Control hardware option разрешена...
Serhiy_UA
Про консоль: подразумевал JTAG-UART. Здесь вообще все просто и наглядно.

А с RTS, CTS не работал, хватило RxD, TxD. С этими двумя не сложно, начните с них.

Просто при приеме цепочки байт из компа, нужно было делать логику выделения-отделения этих цепочек, т.е. промежутков между командными блоками. В этом случае вводил в SOPC еще аппаратный таймер.

По поводу HAL: наелся, что называется задешево, теперь оскома.
Kuzmi4
2 torik -
А есчё может глупый вопрос - а Include CTS/RTS pins and control register bits настрока вкл ? А т опишут что если setting is off, то будет плохо...

Попробуйте всё же напрямую пописать в RTS битик в status-регистре..
И замкнуть RTS и CTS - по идее вы должны будете увидеть связь - там в описании корки говорится что это почти сквозные сигналы ( разве что по CTS там можно генерить прерывание и есть детектор фронта) rolleyes.gif

Не было там трудностей с этими сигналами - работал правда в ручную, но всё работало как по http://www.altera.com/literature/hb/nios2/n2cpu_nii51010.pdf
torik
А как насчет примерчика работы с УАРТ вручную? Что-то не клеится.

Вот код функции чтения. Ставим CTS, после чего девай начинает передавать данные моему УАРТу. Я просто анализирую флаг приема.
Вроде бы все элементарно, но нихрена не работает sad.gif.
Код
void vnc_rx(    alt_vnc* vnc,
                char* msg
                ) {
    int tmp2 = 0;
    alt_u16 tmp, tmp1;
    int timeout = 0;

    IOWR(vnc->UART_BASE,2,0);
    tmp = IORD(vnc->UART_BASE,2) & 0x00000080;

    vnc_rts_on(vnc); //разрешаем устройству передать данные
    while(timeout < 350000) { //ждем приема пока таймаут не сработает
        tmp = IORD(vnc->UART_BASE,2) & 0x0080; //анализируем флаг приема УАРТ
        if(tmp) {
            timeout = 0;
            tmp1 = IORD(vnc->UART_BASE,0);  //читаем принятый байт
            *msg = tmp1;
            msg++;
            tmp2++; //считаем число принятых символов
        }
        timeout++;
    }
    vnc_rts_off(vnc);
}


После того как я устанавливаю CTS, девайс сразу выдает мне все данные, что у него накопились. Если я пошагово лезу в эту функцию, то первый байт принимаю (остальные, ясно, теряются).
Но если я выполняю функцию целиком, у меня вообще ничего не принимает, ни одного байта. Ну иногда могу словить часть сообщения.
Может где-то задержка нужна или еще чего?


С сигналами CTS, RTS все в норме, они включаются и выключаются как надо. Отказаться от них не могу изначально, т.к. они для винклума нужны обязательно.

Цитата
но всё работало как по http://www.altera.com/literature/hb/nios2/n2cpu_nii51010.pdf

В даташите нет примера работы вручную
yura-w
Цитата(torik @ Apr 1 2009, 10:45) *
Где бы можно поподробнее, с простыми примерами поглядеть, как правильно работать с UART, как с фалом или через HAL? В даташите на сам UART мало чего сказано...

посмотрите здесь
применял в своем проекте, все работало.
Serhiy_UA
Цитата(torik @ Apr 2 2009, 08:57) *
А как насчет примерчика работы с УАРТ вручную? Что-то не клеится.


По поводу опроса статуса, у меня так (а у Вас зачем vnc->UART_BASE ????):
alt_u16 w;

// ----- for Input
w=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);
if (w & ALTERA_AVALON_UART_STATUS_RRDY_MSK)
{
};

Похоже Вам все таки нужно прерывание...
torik
Цитата
vnc->UART_BASE

Это просто структура создана для удобства...
А прерывания-то зачем? Мне сообщения должны приходить только когда я их "попрошу"
torik
Прием пошел, видимо я регистр статуса не очищал после приема байта.
Сделал прием по таймауту (я же не знаю сколько символов мне придет)...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.