Перейти к содержанию
    

Поведение при отключенных устройствах (no ack)

Во всех ли случаях контроллер переходит в ERROR PASSIVE когда нет подключенных устройств (обрыв кабеля, ACK не выдается) ?

 

Разбираюсь с формированием флагов состояния и счетчиками ошибок. (линукс, socketcan, чип allwinner A20)

Обнаружил что если во время работы отключить все кан устройства выдернув кабель начинает увеличиваться tx error counter и когда он достигает 128 драйвер рапортует о состоянии ERRER PASSIVE. Это соответствует спецификации.

 

Если же ни одного устройства не подключено при старте или рестарте драйвера он переходит в состояние ERROR WARNING, при этом tx error counter равен 128. Нет ли здесь ошибки ? Разве может быть ERROR WARNING при том что счетчик ошибок = 128 ?

 

В примечаниях спецификации бош упоминается ситуация старта системы когда еще некому выдавать ACK и там написано что контроллер не должен переходить в состояние BUS-OFF.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Миландра это описано так :

 

В каждом CAN контроллере имеется два счетчика.

Этими счетчиками являются счетчик ошибок приема и счетчик ошибок передачи .

Изменение состояния этих счетчиков происходит при приеме или передаче кадра ошибки.

Когда любой счетчик достигает значения 128, контроллер CAN переходит в режим «error passive».

В этом режиме он продолжает отзываться на кадры ошибки, однако при генерации кадра ошибки он вместо доминантных битов выставляет на шину рецессивные.

Если счетчик ошибок передачи достигает значения 255, то контроллер CAN переходит в режим «bus-off» и больше не принимает участия в обмене по шине.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

цитата из Миландра - почти цитирование стандарта бош, за исключением последней строчки:

ЕМНИП, выход из BUSOFF зависит от конкретной реализации - некоторые контроллеры надо из программы дергать, а некоторые имеют флаг, отвечающий за автоматический выход из BUSOFF по условию 11*28 рецесивных бит (согласно конечному автомату на счетчик ошибок из стандарта бош).

 

еще момент:

Обнаружил что если во время работы отключить все кан устройства выдернув кабель начинает увеличиваться tx error counter и когда он достигает 128 драйвер рапортует о состоянии ERRER PASSIVE.
это тоже зависит от конкретной реализации - у неокторые есть бит SingleShot (выключен по умолчанию) - при включении при отправке и неполучении аск не будет пытаться вновь передать кадр (в каких-то применениях может оказаться полезным)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда любой счетчик достигает значения 128, контроллер CAN переходит в режим «error passive».

В этом режиме он продолжает отзываться на кадры ошибки, однако при генерации кадра ошибки он вместо доминантных битов выставляет на шину рецессивные.

тоже читал это в стандарте, но не понимаю какой смысл выставлять passive error frame из рецессивных битов?

все равно никакой узел это не увидит...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обнаружил что если во время работы отключить все кан устройства выдернув кабель начинает увеличиваться tx error counter и когда он достигает 128 драйвер рапортует о состоянии ERRER PASSIVE. Это соответствует спецификации.

Если же ни одного устройства не подключено при старте или рестарте драйвера он переходит в состояние ERROR WARNING, при этом tx error counter равен 128. Нет ли здесь ошибки ? Разве может быть ERROR WARNING при том что счетчик ошибок = 128 ?

STMовский CAN передатчик ведет себя точно также... При этом во втором случае он продолжает передавать на пинах.

 

В примечаниях спецификации бош упоминается ситуация старта системы когда еще некому выдавать ACK и там написано что контроллер не должен переходить в состояние BUS-OFF.

Наверное, эти гады что-то знают...

 

ИМХО в первом случае передатчик знает, что на шине кто-то был, поэтому при увеличении счетчика ошибок первым делом делает так, чтобы он не уложил уже существующую сеть. А во втором случае возможно это связано с автоопределением скорости - т.е. он будет что-то передавать, пока не получит первый Ack - это значит, что приемник настроился на нужную частоту. Если он в эетом случае быстро перейдет в Error Passive, то передача остановится и приемнику не на что будет настраиваться.

ПС. Это все предположения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тоже читал это в стандарте, но не понимаю какой смысл выставлять passive error frame из рецессивных битов?

все равно никакой узел это не увидит...

так _все_ узлы выставляют error frame - типа некая пауза для восстановления линии, возможности перехода глючного узла в пассивное состояние

ну и завязано на эти счетчики ошибок и хитрый бошевский алгоритм

я миландр не читал, но осуждаю :) там еще бывают инкременты не на 1

вот http://www.can-wiki.info/doku.php?id=can_faq:can_faq_erors по-моему лучше описано

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...