|
Nios и UART, Как правильно работать? |
|
|
|
Apr 1 2009, 06:45
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
 |
Ответов
(1 - 12)
|
Apr 1 2009, 09:58
|
Знающий
   
Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112

|
Цитата(torik @ Apr 1 2009, 09:45)  Не хотелось бы делать все вручную через регистры UART. Прерывания тоже, вроде не нужны. Лучше все написать самому, без HAL и файлов. Тем более, у Вас без прерываний. Организуйте выдачу одного байта, потом цепочку. У меня так и работает. Если у Вас старт-кит, то можно также и через USB-Blaster, с выводом на консоль.
|
|
|
|
|
Apr 1 2009, 10:07
|

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

|
Цитата Лучше все написать самому, без HAL и файлов. Тем более, у Вас без прерываний. Организуйте выдачу одного байта, потом цепочку. У меня так и работает. А почему это лучше? Мне как раз казалось, что лучше стандартными средствами. Единственное, что непонятно, каким образом "стандартные средства" будут рулить CTS, RTS. Эксперимент показывает, что никак вообще  . И тогда уж, где можно картинки посмотреть с сигналами RTS, CTS? Цитата Если у Вас старт-кит, то можно также и через USB-Blaster, с выводом на консоль. Нет, у меня своя плата, но через USB-Blaster также можно вывести на консоль.
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Apr 1 2009, 10:18
|

Гуру
     
Группа: Свой
Сообщений: 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. По ходу то же чт ои у вас наблюдается  Там так же написано что RTS битик в status-регистре напрямую конектится к пину.... То есть его самому писать нужно..Врядли стандартные халовские ф-ции это делают...
|
|
|
|
|
Apr 2 2009, 05:57
|

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

|
А как насчет примерчика работы с УАРТ вручную? Что-то не клеится. Вот код функции чтения. Ставим CTS, после чего девай начинает передавать данные моему УАРТу. Я просто анализирую флаг приема. Вроде бы все элементарно, но нихрена не работает  . Код 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 все в норме, они включаются и выключаются как надо. Отказаться от них не могу изначально, т.к. они для винклума нужны обязательно. Цитата В даташите нет примера работы вручную
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Apr 2 2009, 06:23
|
Местный
  
Группа: Свой
Сообщений: 305
Регистрация: 22-06-07
Из: Санкт-Петербург
Пользователь №: 28 617

|
Цитата(torik @ Apr 1 2009, 10:45)  Где бы можно поподробнее, с простыми примерами поглядеть, как правильно работать с UART, как с фалом или через HAL? В даташите на сам UART мало чего сказано... посмотрите здесьприменял в своем проекте, все работало.
|
|
|
|
|
Apr 2 2009, 07:37
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|