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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Bubble в UART LPC2148
3m-soft
сообщение Sep 25 2007, 09:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-07
Пользователь №: 30 026



Работаю с LPC2148, но никак не могу решить проблему с UART. Осциллятор у меня на 12Мгц из-за USB модуля, второй осциллятор часовой. Понятное дело что битрейт на UART с нулевой ошибкой выставить невозможно. На UART0 реализован обычный текстовый терминал. На UART1 рабочее устройство с которым ведется обмен данными. Так вот в зависимости от степени расхождения в битрейте с устройством на длинных пакетах может произойти какой-то срыв в мозгах у LPC и он начинает "базарить" (bubble) на оба UART как наружу так и вовнутрь, т.е. в течение нескольких секунд я наблюдаю на экране терминала как быстро быстро прет всякая х...ня, тоже самое происходит и вовнутрь, т.е. в течение этого же времени оба модуля активно принимают "левые" данные в основном просто нули. Подчеркиваю, что базарит он на оба модуля одновременно, и так посрет посрет данными и успокаивается и продолжает работать. Раньше bubble вызывал вообще зависание, да такое что внешний ресет не помогал, а помогало только выключение питание или сторожевой таймер, но я поиграл с таймингами MAM и теперь он не всегда зависает. Плюс к этому я выяснил что если во время работы с PLL, устройство что-нибудь ответит в UART, то это bubble с последующим гарантированным зависанием. Раньше эта прога работала на LPC2194 с осциллятором 11059200 и таких проблем не было. Кстати терминал параллельно продублирован на логический канал USB и когда UART0 гадит мусором с свою терминальную программу, то в специальной терминальной программе подключенной через USB в это время все в порядке, так что это точно модуль UART0 сам что-то гонит, а не моя прога что-то сдуру посылает.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 25 2007, 10:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(3m-soft @ Sep 25 2007, 12:59) *
Понятное дело что битрейт на UART с нулевой ошибкой выставить невозможно.

С нулевой и не надо, а с достаточной - воспользуйтесь fractional baud rate generator
Цитата
срыв в мозгах у LPC и он начинает "базарить" (bubble) на оба UART как наружу так и вовнутрь

Поверьте моему опыту, что срыв не в мозгах LPC, а у Вас в программе.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 25 2007, 10:16
Сообщение #3


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(3m-soft @ Sep 25 2007, 13:59) *
Работаю с LPC2148, но никак не могу решить проблему с UART. Осциллятор у меня на 12Мгц из-за USB модуля, второй осциллятор часовой. Понятное дело что битрейт на UART с нулевой ошибкой выставить невозможно. На UART0 реализован обычный текстовый терминал. На UART1 рабочее устройство с которым ведется обмен данными. Так вот в зависимости от степени расхождения в битрейте с устройством на длинных пакетах может произойти какой-то срыв в мозгах у LPC и он начинает "базарить" (bubble) на оба UART как наружу так и вовнутрь, т.е. в течение нескольких секунд я наблюдаю на экране терминала как быстро быстро прет всякая х...ня, тоже самое происходит и вовнутрь, т.е. в течение этого же времени оба модуля активно принимают "левые" данные в основном просто нули. Подчеркиваю, что базарит он на оба модуля одновременно, и так посрет посрет данными и успокаивается и продолжает работать. Раньше bubble вызывал вообще зависание, да такое что внешний ресет не помогал, а помогало только выключение питание или сторожевой таймер, но я поиграл с таймингами MAM и теперь он не всегда зависает. Плюс к этому я выяснил что если во время работы с PLL, устройство что-нибудь ответит в UART, то это bubble с последующим гарантированным зависанием. Раньше эта прога работала на LPC2194 с осциллятором 11059200 и таких проблем не было. Кстати терминал параллельно продублирован на логический канал USB и когда UART0 гадит мусором с свою терминальную программу, то в специальной терминальной программе подключенной через USB в это время все в порядке, так что это точно модуль UART0 сам что-то гонит, а не моя прога что-то сдуру посылает.

Я читал, читал - так и не понял (часовой кварц, USB. bubble, зависание, 2 UART ...).
В правильно заданном вопросе - половина ответа (афоризм).
Русский матрос задать умеет правильный вопрос (Чиж).
Наконец дошло.
При каких ошибках по частоте возможна работа UART ?
Если такой вопрос отвечаю. 4,5 %
Go to the top of the page
 
+Quote Post
3m-soft
сообщение Sep 25 2007, 10:21
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-07
Пользователь №: 30 026



Fractional baud rate generator я использую с самого начала, хотя пробовал и без него.

Параллельный логический канал по USB для того и сделал чтобы разобраться в проблеме, так вот учитывая на каком уровне происходит параллелизация, то в том то и дело что не может программа посылать эти данные сама иначе это дублировалось бы и в USB канал. Конечно есть там пара строк кода после узла распараллеливания, которые отвечают уже непосредственно за передачу в UART0, но всё уже несколько раз перепроверено.

Извините, что написал в вопросе так много, но просто проблема настолько глубокая что блин не знаю как в двух словах описать. Я же описывал и то что уже предпринял.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 25 2007, 10:38
Сообщение #5


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(3m-soft @ Sep 25 2007, 14:21) *
Fractional baud rate generator я использую с самого начала, хотя пробовал и без него.

Параллельный логический канал по USB для того и сделал чтобы разобраться в проблеме, так вот учитывая на каком уровне происходит параллелизация, то в том то и дело что не может программа посылать эти данные сама иначе это дублировалось бы и в USB канал. Конечно есть там пара строк кода после узла распараллеливания, которые отвечают уже непосредственно за передачу в UART0, но всё уже несколько раз перепроверено.

Извините, что написал в вопросе так много, но просто проблема настолько глубокая что блин не знаю как в двух словах описать. Я же описывал и то что уже предпринял.

Краткость- сестра таланта (афоризм).
Как же тебе ответить, если ты ничего не говоришь (Иван Васильевич меняет профессию).
Go to the top of the page
 
+Quote Post
3m-soft
сообщение Sep 25 2007, 10:41
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-07
Пользователь №: 30 026



Дело ещё в том, что разных устройств таких для UART1 много и у каждого свой разработчик и своя ошибка в битрейте, бывает нулевая, бывает большая. Вот сейчас лежит одно и разница у нас с ним в 4%, пока он посылает мне пакеты-ответы длиной в 4 байта всё в порядке, когда длиной в 19 байт, то либо я получаю дополнительный странный довесок в несколько байт, либо в течение 2-3 секунд получаю максимум данных на этом битрейте, но так как дальше 128 байт у меня уже откидывается, то я не знаю сколько точно. Есть другое устройство с точно таким же протоколом связи, только ошибка гораздо меньше, так вот с ним все отрабатывает по протоколу нормально. Кстати это проблемное устройство прекрасно работает по этому протоколу с ПК, а со мной не хочет.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 25 2007, 10:49
Сообщение #7


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(3m-soft @ Sep 25 2007, 14:41) *
Дело ещё в том, что разных устройств таких для UART1 много и у каждого свой разработчик и своя ошибка в битрейте, бывает нулевая, бывает большая. Вот сейчас лежит одно и разница у нас с ним в 4%, пока он посылает мне пакеты-ответы длиной в 4 байта всё в порядке, когда длиной в 19 байт, то либо я получаю дополнительный странный довесок в несколько байт, либо в течение 2-3 секунд получаю максимум данных на этом битрейте, но так как дальше 128 байт у меня уже откидывается, то я не знаю сколько точно. Есть другое устройство с точно таким же протоколом связи, только ошибка гораздо меньше, так вот с ним все отрабатывает по протоколу нормально. Кстати это проблемное устройство прекрасно работает по этому протоколу с ПК, а со мной не хочет.

Если обмениваются устройства с ошибками по скорости - ошибка суммируется.
Решение - снижать скорость передачи.
Go to the top of the page
 
+Quote Post
3m-soft
сообщение Sep 25 2007, 11:07
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-07
Пользователь №: 30 026



Цитата(alexander55 @ Sep 25 2007, 15:49) *
Если обмениваются устройства с ошибками по скорости - ошибка суммируется.
Решение - снижать скорость передачи.


Дело в том что и скорость и протокол стандартизированы и не могут быть изменены и пока это единственное устройство с которым я не могу связаться на длинных пакетах. С другими, у которых нет такой ошибки битрейта по этому протоколу и на этой скорости я работаю.
Просто я уже усвоил несколько правил: не менять частоту ядра пока есть вероятность что устройство что-то ответит и держать включенным сторожевой таймер. Кстати мой LPC когда начинает базарить умудряется перепрошить микроконтролллер в одном из таких устройств, вот каждый раз смеху то когда у него слетает прошивка. Так как с другими устройствами это случается эпизодически, то я пока особо не паниковал, но вот теперь мне срочно нужно решение проблемы. Я конечно не ругаю мозги LPC и всё таки думаю что это проблема моей проги, но вот только найти причину никак не могу.
Go to the top of the page
 
+Quote Post
_basile
сообщение Sep 25 2007, 11:07
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 175
Регистрация: 18-01-06
Из: Москва
Пользователь №: 13 329



Цитата(3m-soft @ Sep 25 2007, 14:41) *
Дело ещё в том, что разных устройств таких для UART1 много и у каждого свой разработчик и своя ошибка в битрейте, бывает нулевая, бывает большая. Вот сейчас лежит одно и разница у нас с ним в 4%, пока он посылает мне пакеты-ответы длиной в 4 байта всё в порядке, когда длиной в 19 байт, то либо я получаю дополнительный странный довесок в несколько байт, либо в течение 2-3 секунд получаю максимум данных на этом битрейте, но так как дальше 128 байт у меня уже откидывается, то я не знаю сколько точно. Есть другое устройство с точно таким же протоколом связи, только ошибка гораздо меньше, так вот с ним все отрабатывает по протоколу нормально. Кстати это проблемное устройство прекрасно работает по этому протоколу с ПК, а со мной не хочет.


В UART побайтовая синхронизация. Для этого вначале каждого байта посылается стартовый бит, а в конце - стоповый. Соответственно, отдельные байты никак по времени между собой не связаны (в том числе и внутри пакета). Ищи жопу в программе.


--------------------
" Будут с водкою дебаты, отвечай : Нет ребяты-демократы, только чай ! "
Go to the top of the page
 
+Quote Post
alexander55
сообщение Sep 25 2007, 11:13
Сообщение #10


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(3m-soft @ Sep 25 2007, 15:07) *
Дело в том что и скорость и протокол стандартизированы и не могут быть изменены и пока это единственное устройство с которым я не могу связаться на длинных пакетах. С другими, у которых нет такой ошибки битрейта по этому протоколу и на этой скорости я работаю.
Просто я уже усвоил несколько правил: не менять частоту ядра пока есть вероятность что устройство что-то ответит и держать включенным сторожевой таймер. Кстати мой LPC когда начинает базарить умудряется перепрошить микроконтролллер в одном из таких устройств, вот каждый раз смеху то когда у него слетает прошивка. Так как с другими устройствами это случается эпизодически, то я пока особо не паниковал, но вот теперь мне срочно нужно решение проблемы. Я конечно не ругаю мозги LPC и всё таки думаю что это проблема моей проги, но вот только найти причину никак не могу.

Еще решение.
Для LPC частоту периферии можно можно поднять (если есть такая возможность) и тем увеличить точность.
У меня уже заболела голова от разгадывания головоломок.
Go to the top of the page
 
+Quote Post
3m-soft
сообщение Sep 25 2007, 11:51
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-07
Пользователь №: 30 026



За счет Fractional baud rate у меня ошибка 0,0006%, так что большая ошибка не у меня, а у устройства, а оно куплено, а директор мне я..ца оторвет если деньги уплачены зря. Мне надо как-то подогнаться к нему по битрейту чтобы работать, я пробовал уже ставить битрейт который примерно у него, тем самым сократив ошибку между нами, но все равно косяки те же. Не пойму откуда появляются лишние байты, ведь в работе с ПК их нет. Приходит ровно 19 байт, а в LPC либо появляются лишние байты, либо bubble. И повторяю что с другими устройствами на LPC лишних байт нет, лишь совсем изредка bubble бывает.
Go to the top of the page
 
+Quote Post
3m-soft
сообщение Sep 25 2007, 13:30
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-07
Пользователь №: 30 026



Не согласится ли кто из умных форума сего посмотреть на мой модуль для работы с UART? 05.gif

Сообщение отредактировал 3m-soft - Sep 25 2007, 13:31
Прикрепленные файлы
Прикрепленный файл  Serial.rar ( 2.47 килобайт ) Кол-во скачиваний: 40
 
Go to the top of the page
 
+Quote Post
amw
сообщение Sep 25 2007, 15:17
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Вероятно порблема в том, что передача или прием данных происходит в момент перенастройки PLL.
По USB изменение частоты (читай искажения сигнала на шине) при перестройке PLL просто отсеется на уровне HOST контроллера аппаратно.
В UART синхронизация идет поБИТно. Именно потому что по старт БИТу определяется начало байта. Именно к этому старт БИТу привязывается защелкивание остальных битов.
И если стоп бит придет не вовремя, то и будет описанная ситуация.
Особенно сказывается при ошибке в скорости и именно таким образом.
Проверяйте в UART биты ошибок приема. И при изменениях PLL вообще отключайте UART.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
3m-soft
сообщение Sep 25 2007, 15:40
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-07
Пользователь №: 30 026



Цитата(amw @ Sep 25 2007, 20:17) *
Вероятно порблема в том, что передача или прием данных происходит в момент перенастройки PLL.
По USB изменение частоты (читай искажения сигнала на шине) при перестройке PLL просто отсеется на уровне HOST контроллера аппаратно.
В UART синхронизация идет поБИТно. Именно потому что по старт БИТу определяется начало байта. Именно к этому старт БИТу привязывается защелкивание остальных битов.
И если стоп бит придет не вовремя, то и будет описанная ситуация.
Особенно сказывается при ошибке в скорости и именно таким образом.
Проверяйте в UART биты ошибок приема. И при изменениях PLL вообще отключайте UART.


Я конечно понимаю, что рассказываю фантастические вещи, но во время перенастройки 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. Кстати почему никто не думает что это может быть проблема компилятора или компиляции.
Go to the top of the page
 
+Quote Post
_basile
сообщение Sep 25 2007, 19:03
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 175
Регистрация: 18-01-06
Из: Москва
Пользователь №: 13 329



Цитата(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(). Сделай для приема обычный массив со счетчиком принятых байт. А протокол реализуй прямо в обработчике прерывания.
А в основном цикле просто опрашивай состояние (пакет принят/не принят). Если пакет принят - делаешь его разборку, обнуляешь счетчик принятых байт, сбрасываешь статус.


--------------------
" Будут с водкою дебаты, отвечай : Нет ребяты-демократы, только чай ! "
Go to the top of the page
 
+Quote Post

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

 


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


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