Ответ: >Если пакеты начнут приходить до начала работы устройства (инициализация
>довольно большая), то в VIC уже будет висеть флаг, а прерывание почему-то
>генериться не начинает. Как выгребать из такой ситуации?
У меня тоже не маленькая инициализация, VIC инициализирую последним. Uart перед ним, и только уже опосля всего:
__enable_interrupt();
Нормально все работает, «выгребать» не приходится.
>Если первый пакет приходит после инициализации, то принимаю его нормально (14
>байт ФИФО и один бит по прерыванию CTI). Потом делаю U0IER = 0; U0FCR = 0;
Прежде чем делать U0FCR=0 нужно забрать полученное из FIFO, иначе там одни 0x00 останутся… ;)
>После обработки опять разрешаю прерывание и устанавливаю U0FCR.
На простом U0FCR = 0 не останавливаюсь – дополнительно сбрасываю флагами RFR=1/TFR=1 (там же в FCR) перед разрешением FIFO.
>После этого начинается бардак. Бывает, что срабатывает два раза прерывание от
>ФИФО, бывает, что постоянно сыпятся прерывания CTI. Что я неправильно делаю? И
>как лучше это сделать?
Всяко может быть, например, начинается прием, а там уже летит пакет… Если отталкиваться от вашего описания протокола, то можно попробовать начинать прием пакета с прерывания CTI: как бы начинаем «щупать» поток по сработавшему таймеру, ждем паузы в нем (CTI) и, дождавшись, принимаем на грудь нормальный, не рваный пакет, а непосредственно перед приемом недурственно очистить FIFO Rx.