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

 
 
> Nios и UART, Как правильно работать?
torik
сообщение Apr 1 2009, 06:45
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



В 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 мало чего сказано...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
Serhiy_UA
сообщение Apr 1 2009, 09:58
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112



Цитата(torik @ Apr 1 2009, 09:45) *
Не хотелось бы делать все вручную через регистры UART. Прерывания тоже, вроде не нужны.

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

Если у Вас старт-кит, то можно также и через USB-Blaster, с выводом на консоль.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Apr 1 2009, 10:06
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Что есть Vinculum не знаю, но в своё время очень сильно терроризировал альтеру по поводу вывода чего либо через УАРТ.
Всё в обсчем свелось к тому что гораздо проще написать свой код для передачи приёма данных по уарту через интерупт, чем подъёзать хал..
Не составило труда портировать код с меги (были наработки smile.gif )
Выложил бы , но оно где то дома в горах дисков......
Go to the top of the page
 
+Quote Post
torik
сообщение Apr 1 2009, 10:07
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



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


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

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

Нет, у меня своя плата, но через USB-Blaster также можно вывести на консоль.


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Apr 1 2009, 10:18
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Цитата
Во-вторых, сразу после старта программы, когда еще даже не открыт файл, сигнал 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-регистре напрямую конектится к пину.... То есть его самому писать нужно..Врядли стандартные халовские ф-ции это делают...
Go to the top of the page
 
+Quote Post
torik
сообщение Apr 1 2009, 10:23
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Нет, не то же smile.gif. У меня Flow Control hardware option разрешена...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
Serhiy_UA
сообщение Apr 1 2009, 10:23
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112



Про консоль: подразумевал JTAG-UART. Здесь вообще все просто и наглядно.

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

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

По поводу HAL: наелся, что называется задешево, теперь оскома.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Apr 1 2009, 10:31
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



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
Go to the top of the page
 
+Quote Post
torik
сообщение Apr 2 2009, 05:57
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



А как насчет примерчика работы с УАРТ вручную? Что-то не клеится.

Вот код функции чтения. Ставим 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

В даташите нет примера работы вручную


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
yura-w
сообщение Apr 2 2009, 06:23
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 305
Регистрация: 22-06-07
Из: Санкт-Петербург
Пользователь №: 28 617



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

посмотрите здесь
применял в своем проекте, все работало.
Go to the top of the page
 
+Quote Post
Serhiy_UA
сообщение Apr 2 2009, 07:37
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112



Цитата(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)
{
};

Похоже Вам все таки нужно прерывание...

Сообщение отредактировал Serhiy_UA - Apr 2 2009, 07:39
Go to the top of the page
 
+Quote Post
torik
сообщение Apr 2 2009, 09:15
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Цитата
vnc->UART_BASE

Это просто структура создана для удобства...
А прерывания-то зачем? Мне сообщения должны приходить только когда я их "попрошу"


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
torik
сообщение Apr 2 2009, 10:21
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Прием пошел, видимо я регистр статуса не очищал после приема байта.
Сделал прием по таймауту (я же не знаю сколько символов мне придет)...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 14:17
Рейтинг@Mail.ru


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