Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FIFO UART-а
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
elusive
Для передачи использую интерфейс UART. Есть входной FIFO глубиной 32.
Ставлю уровень заполнения FIFO и прерывание по этому событию. В прерывании считываю всю FIFO и провожу необходимый мне анализ данных. Обработчик по времени очень короткий.

Так вот при передаче пакетов размером примерно до 60 байт все нормально принимается и читается.
При передаче пакетов больше 60 байт в буфер FIFO почему-то попадают только первые 60 байт! То есть я их считываю как обычно, а после этого FIFO остается пустой, а куда делись остальные байты???

При чем возможно два сценария: установился флажок OVERRUN либо НЕ установился. В случае OVERRUN я еще могу понять - настолько быстро приходят байты, что даже с коротким обработчиком и глубоким буфером мы их не успеваем забрать.
Но что происходит если никаких ошибок не возникало? Как UART "прозевал" последущие байты, почему не появилось новое прерывание по уровню FIFO?
Палыч
Цитата(elusive @ Jun 18 2013, 11:53) *
Есть входной FIFO глубиной 32.
...
Так вот при передаче пакетов размером примерно до 60 байт все нормально принимается и читается.
При передаче пакетов больше 60 байт в буфер FIFO почему-то попадают только первые 60 байт!
Что-то я не въехал: так какая же глубина FIFO ? 32 байта? Шестьдесят? Или ещё больше?
elusive
Цитата(Палыч @ Jun 18 2013, 15:21) *
Что-то я не въехал: так какая же глубина FIFO ? 32 байта? Шестьдесят? Или ещё больше?


Входной аппаратный FIFO на 32.
Когда я по прерыванию начинаю считывать оттуда байты он постепенно очищается и параллельно туда валятся новые байты. В сумме у меня выходит принять только 60 байт, потом наступает переполнение, как правило. Иногда даже переполнение не устанавливается, но FIFO почему-то пуст, хотя входной пакет более 100 байтов.

По мере чтения из аппаратного FIFO я пишу в свой программный буфер размером с максимальный пакет, который вообще может прийти - 64кбайта.
andrey74
у меня тоже были проблемы из-за FIFO UARTа, просто его отключил и считывал все символы по прерыванию в отдельный массив, мне так проще
aaarrr
Как зовут UART? И приведите свой код для чтения.
elusive
Цитата(andrey74 @ Jun 18 2013, 16:11) *
у меня тоже были проблемы из-за FIFO UARTа, просто его отключил и считывал все символы по прерыванию в отдельный массив, мне так проще


По сути дела мне не хватает глубины FIFO, как я понял, поэтому отключить FIFO тут не поможет.

Обработчик выглядит примерно так:
Код
uint8_t ReadData;

ReadData = ReadData_from_UART_Register();
if (ReadData == 0x77)
{
flag1 = 1;
flag2 = 0;
}
if ((flag6 == 0)&&(ReadData != 0x01))
{
counter++;
flag 6 = flag4;
}


Суть в том что в нем мы попадаем в один какой-нибудь if и делаем буквально пару движений с переменными статуса.
На байт обработчик тратит примерно 15 мкс, обычно меньше.
Палыч
Если хотите получить какие-то советы/рекомендации - так поделитесь информацией !
Что за UART? Как его настраиваете? Как считываете с него данные? Что за данные? С какой скоростью поступают? И т.п. ...
Лето наступило... Телепаты отдыхают!
Сергей Борщ
Рискну телепатически предположить, что статус сбрасывается при чтении очередного байта. Поэтому проверять его надо до, а не после чтения данных.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.