Цитата(3m-soft @ Sep 25 2007, 15:51)

За счет Fractional baud rate у меня ошибка 0,0006%, так что большая ошибка не у меня, а у устройства, а оно куплено, а директор мне я..ца оторвет если деньги уплачены зря. Мне надо как-то подогнаться к нему по битрейту чтобы работать, я пробовал уже ставить битрейт который примерно у него, тем самым сократив ошибку между нами, но все равно косяки те же. Не пойму откуда появляются лишние байты, ведь в работе с ПК их нет. Приходит ровно 19 байт, а в LPC либо появляются лишние байты, либо bubble. И повторяю что с другими устройствами на LPC лишних байт нет, лишь совсем изредка bubble бывает.
А значение 19-ти байт, которые приходят в LPC те же, что и отправленные "устройством" и принятые РС, только к ним добавляются лишние байты? Или первые 19 байт тоже не совпадают с отправленными "устройством"?
И еще. Как я понял, информация передается пакетами. Т.е. в пакете должны быть байты, определяющие начало и конец пакета (ну, и контрольная сумма пакета при нормальном протоколе). В таком случае, отделить пакет от мусора - не проблема.
Цитата(3m-soft @ Sep 25 2007, 19:40)

Я конечно понимаю, что рассказываю фантастические вещи, но во время перенастройки PLL (а это не часто бывает) я конечно отключаю UART вплоть до того, что питание от UART отрубаю, но когда включаю потом обратно то и возникает зависание вот в этом куске кода:
__irq void uart1_irq(void)
{
......
// Узнать статус
unsigned char status=U1LSR;
while ((status & (1<<0))!=0) // Есть входные данные
{
// Получить байт и узнать статус
unsigned char ch=U1RBR; status=U1LSR;
....
}
.....
}
Вы скажете что этого не может быть, я тоже так думаю, но это так и из этого кстати выручает сторожевой таймер.
Хотя меня больше волнует проблема того что он двунаправленно спамит по двум модулям UART одновременно.
P.S. Кстати почему никто не думает что это может быть проблема компилятора или компиляции.
Посмотрел исходник, и вот чего скажу, хоть сами мы не местные.
Выкинь нафиг FIFO. Ты же разборку пакета все равно где-то в основном цикле программы делаешь,
выковыривая принятые байты через receive0(). Сделай для приема обычный массив со счетчиком принятых байт. А протокол реализуй прямо в обработчике прерывания.
А в основном цикле просто опрашивай состояние (пакет принят/не принят). Если пакет принят - делаешь его разборку, обнуляешь счетчик принятых байт, сбрасываешь статус.