При описании задачи для начала хоть бы камень указали! :) Подозреваю что это LPCxxxx
> Пакеты сыпятся очень часто (предназначены не только этому устройству).
Значит возможно что и паузы то между ними нет? Да и не стОит на неё закладываться.
> Никаких контрольных сумм, адресация - одним битом в старшем байте.
Не понятно! Что есть старший байт? Первый в пакете? В остальных байтах пакета старший бит нулевой? А случайно не 9-ти битные посылки, (в своё время широко использовалось)?
> Теперь о том, что у меня не получается.
> Если пакеты начнут приходить до начала работы устройства
> (инициализация довольно большая), то в VIC уже будет висеть
> флаг, а прерывание почему-то генериться не начинает.
> Как выгребать из такой ситуации?
Что то у Вас в инициализации не то.
> Если первый пакет приходит после инициализации,
> то принимаю его нормально (14 байт ФИФО и один
> бит по прерыванию CTI).
^^^
байт
> Потом делаю U0IER = 0;
> U0FCR = 0;
> После обработки опять разрешаю прерывание и устанавливаю U0FCR.
> После этого начинается бардак. Бывает, что срабатывает два раза> > прерывание от ФИФО, бывает, что постоянно сыпятся прерывания CTI.
Что-то я не пойму зачем эти махинации с U0FCR?
А на CTI Вы весь буфер выгребаете или только 1 байт?
Я бы всётаки принимал весь трафик с простенькой машиной состояний
из:
1. Ожидание 1-го байта пакета (с игнорированием остальных)
- если приняли 1-ый байт пакета переход в 2
- если не 1-ый остаёмся
2. Приём пакета в буфер.
- по ошибкам, таймаутам и пр. исключениям переход в 1.
- если приняли весь пакет то проверяем а надо ли
его обработать.
- если нет то в переход в 1
- если да то или непосредственная обработка
и переход в 1.
Всё это в прерывании.
Примечания:
1. Если признак "вашего" пакета в первом байте, то можно сразу
ждать следующего первого байта если приняли байт не вашего
пакета.
2. Обработку можно тоже разделить.
Например в прерывании UART по приёму пакета для индикатора
можно лишь перекладывать байтики в буфер ЖКИ в памяти и
взводить некий(ие) флаг(и).
А уж гденить в другом месте проверять флаг необходимости
апдейта индикатора и обновлять его.
Т.е. для 20х2 определяем массив на 20х2 байтиков под символы
и 20х2-битную переменную с флагами обновления соответствующей
буквы.
Или у Вас граф. ЖКИ?