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

 
 
> 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
Ответов
torik
сообщение Apr 2 2009, 05:57
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 15:59
Рейтинг@Mail.ru


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