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

 
 
> Дырка в UART NIOS, проблема при приеме
Saray_Babki_Oleg...
сообщение Oct 25 2012, 04:49
Сообщение #1





Группа: Участник
Сообщений: 8
Регистрация: 2-02-06
Пользователь №: 13 918



Не нашел данную проблему в описанных проблемах uart`a в NIOS, поэтому ...
Опишу ситуацию:
- есть железка(на ней стоит cyclone, а в нем есть nios), которая постоянно принимает/посылает данные по UART (Modbus) – использовал FIFOedAvalonUart
- при приеме данных железкой время от времени появлялись ошибки в полученных данных
- был подключен SignalTab и обнаружилось, что после передачи в железку на линии RX(железки) появляется единичный выброс (в 0), откуда эти выбросы - это тоже очень хороший вопрос.
Как этот выброс влиял на прием? Оказывается приемник uart`a ничем не защищен от помех на линии - он просто защелкивает приходящие к нему биты по счетчику-таймеру, настроенного на скорость передачу, и отсчет этот идет после того как к нему придет нулевой старт-бит, т.е. получается так, что если на линии RX вдруг образовался выброс в 0 - приемник воспримет этот спад за старт-бит.
Так вот и получалось, что UART поэтому гличу по сути был готов принимать байт, которого в реальности нет, но правда для захлопывания битов по RX нужны определенные условия (определнным образом выставлены его внутренние регистры/флаги/биты) и тут в работу UART`а включается теория Вероятности – луна в нужной фазе – прием нормально, иначе неверный прием.
Отмоделировал данную ситуацию в modelsim`е с обычным ниосовским uart`ом– и действительно проблема существует. Заинтересовавшиеся могут открыть прилогаемый проект моделсима. Модуль UART`a (uart.v – где приемник uart_rx), сгенерированный SoPC или Qsys, без разницы и там и там одно и тоже. В модели посылаю 4 байта, после второго байта запускаю глич по линии rxd. Данный глич - спад в 0 - выставляет сигнал do_start_rx (приемник готов принимать биты), в результате чего, если получится так, что тик baud_clk_en(или sample_enable) попадает между ниспадающим фронтом реального стартового бита(по линии rxd) и установкой счетчика baud_rate_counter(значением baud_load_value), а это всего пара клоков (клоков заведенного на приемника), то приемник воспринимает этот стартовый бит, как бит данных, в результате байт будет принят не верно (со сдвигом влево – смотри 3 байт – по линии rx_data) и от этого никто не застрахован, если у него в проекте с ниосом есть родной uart.
Поэтому, была сделана доработка приемника uart.v (модуль uart_rx)- "самопальными" шаблонными вставками, которые не исправляют логику работы, а добавляют контроль и которые можно посмотреть в прилагаемом файле uart_ispravl.v и если что применить в своем проекте для защиты от ненужных выбросов на линии RX.

Прикрепленные файлы
Прикрепленный файл  uart_glitch.7z ( 4 мегабайт ) Кол-во скачиваний: 16
 
Go to the top of the page
 
+Quote Post



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

 


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


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