Вопрос специалистам по CAN
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Alekhast 11 марта 2004 г. 09:50

Люди, кто тут специалист по CAN? Помогите советом, будьте добры, а то у меня в микроконтроллере T89C51CC01UA (ATMEL) деется что-то странное.

В общем, есть два модуля - один высылает сообщения CAN, другой их принимает. Так вот высылающий перед посылкой правильного фрейма высылает сначала 16 (не больше и не меньше) ошибочных фреймов, ошибка, по-моему, в поле EOF (точное положение не могу определить) - там 6 доминантных битов подряд видно. Потом 16 таких фиговин вышлет, и посылка становится нормальной - все начинает работать. Доминантные биты исчезают, меняясь на рецессивные, причем сама посылка абсолютно не меняется - меняются только эти биты в конце фрейма.

Сначала я думал так - поскольку приемник работает в режиме Active Listening, то не высылает на шину бита подтверждения приема сообщения (доминантного бита, умещаемого в слоте ACK передаваемого сообщения). значит, отсутствие бита подтверждения может восприниматься передатчиком как помеха на шине, вследствие чего передатчик генерирует фрейм ошибки. Но тогда почему он его генерирует только 16 раз, а потом начинает работать нормально? Чтобы проверить предположение, перепрограммировал приемник на работу в обычном режиме приема, с подтверждением принятого сообщения. Бит подтверждения, разумеется, на шине появился. Но ничего не изменилось - передатчик продолжает генерировать 16 ошибочных фреймов.
Правда, есть один момент, который меня настораживает - на входе передатчика долна появляться его собственная рамка, с _добавленным_ битом подтверждения ACK. Собственная рамка на входе передатчика присутствует, однако я не вижу в ней надписанного бита ACK, несмотря на то, что он высылается приемником. Единственное объяснение этому явлению - я просто перепутал типы битов на экране осциллографа - доминантные принял за рецессивные. Но по-моему, все верно - логическая 1 на выходе TxDC микроконтроллера соответствует рецессивному уровню на шине, или я не прав?

Затем я решил вообще отключить приемник, оставив только резисторные терминаторы на концах шины. Думал, приемник каким-то образом заставляет ошибаться передатчик. Нет, после отсоединения приемника ошибки передатчика как были, так и остались.

Была также мысль, что поскольку я не сбрасываю значения всех регистров в начале программы, то случайные значения, устанавливающиеся после включения питания, могут нарушать работу передатчика. Но тогда снова возникает вопрос - почему каждый раз возникает ровно 16 ошибок? Поскольку значения регистров после сброса питания случайны, они вряд-ли могут каждый раз устанавливаться одинаковым образом. Поэтому я с помощью загрузчика FLIP запускал загруженную в передатчик программу, причем в установках FLIPа стоит пункт "Reset before loading". Насколько я знаю, FLIP перед запуском загруженной программы очищает содержимое всех регистров микроконтроллера. Но даже такой запуск программы ошибки не устраняет. Значит, случайные значения регистров тут ни при чем.

Следовательно, вопрос - кто может знать, почему передатчик после сброса питания генерирует 16 фреймов ошибки, после чего начинает работать нормально? Всем заранее благодарен за ответы и советы.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru