Страница 1 из 1

Не работает передатчик CAN на AT90CAN128

Добавлено: Вт фев 23, 2016 12:11:30
_Rookie_
Всем привет.

Столкнулся с проблемой - не работает передатчик CANа на AT90CAN128.

Суть проблемы в том, что есть несколько плат на базе AT90CAN, схема CANовской части - одинаковая: выходы AT90CAN128 (TXCAN / XCK1) PD5 и (RXCAN / T1) PD6 приходят на PCA82C250 ноги 1 и 4 соответственно - дальше линия CAN с терминаторами, где мастером сидит пром контроллер.
На одной плате - все завелось без проблем и заработало - мастер спрашивает AT90CAN отвечает.
Потом начал работать с другой платой - и образовался затык - прием работает, а передатчик молчит. Во время приема (TXCAN / XCK1) PD5 дергается на некоторое время в 0, а потом стоит в 1.
Накидал тестовую прогу, в которой AT90CAN просто по таймеру шлет небольшую посылку, мастера заставил замолчать и только слушать, - результат на рабочей плате в осциллограф на PD5 вижу посылки, на другой постоянно стоит 1.
Казалось, бы явные проблемы с аппаратной частью, но т.к. и первых и вторых плат у меня несколько - решил их все проверить одним и тем же hex'ом, фьюзы тоже одинаковые выставил. результат - работает только две платы из 6, причем и среди первых, условно рабочих, одна также отказалась что-то слать. Думаю, маловероятно, что столько битых микросхем.
Зашил тестовую прогу, в плату, где CANовские ноги висят в воздухе - тоже ничего не происходит на TX - просто стоит 1.
Попробовал "вручную", без инициализации CANа подергать TX - ногой дергает, т.е. порт жив.

Собственно вопрос, может кто-то сталкивался с таким. И должен ли TX кана дергаться, если к AT90CAN не подвешен кановский приемо/передатчик.

Приложил тестовую прогу, может, все-таки в ней косяк.

Re: Не работает передатчик CAN на AT90CAN128

Добавлено: Ср мар 23, 2016 07:29:24
_Rookie_
Разобрался с проблемой.
Все дело в регистре CANCDMOB, а именно в битах
Bit 7:6 – CONMOB1:0: Configuration of Message Object
и самое главное!
These bits set the communication to be performed (no initial value after RESET)
А в программе я их только устанавливал |=, но в ноль не сбрасывал.
Поэтому часть контроллеров работала, а часть нет.