|
Коллизия в CAN |
|
|
|
Feb 20 2015, 08:22
|
Группа: Новичок
Сообщений: 3
Регистрация: 20-02-15
Пользователь №: 85 274

|
Ребята, помогите разобраться. В стандарте J1939 сказано, что если два узла с одинаковыми идентификаторами и разными данными осуществляют передачу одновременно, то произойдет коллизия. Коллизия приведет к ошибке, количество ошибок определит статус узла(активная ошибка, пассивная ошибка, отключение от шины). Но непонятно как отловить эту коллизию? По каким признакам определить, что произошла именно коллизия?
|
|
|
|
|
 |
Ответов
|
May 6 2015, 10:10
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 27-10-08
Пользователь №: 41 225

|
Вообще в CAN коллизия ошибкой не является и не ведет к порче данных. Передатчик, проигравший арбитраж, перестает передавать и ждет освобождения шины, после чего передает свое сообщение. Ошибкой может стать блокировка шины, когда на шине образуется доминанта, и передатчики не могут запустить передачу. Тогда формируются ошибки шины связи.
|
|
|
|
|
May 6 2015, 18:36
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 27-10-08
Пользователь №: 41 225

|
Цитата(adnega @ May 6 2015, 13:17)  Вы не путаете коллизию с потерей арбитража? А чем проигрыш арбитража отличается от коллизии в CAN? При учете того, что с шины уходит тот передатчик, который из-за коллизии не может установить передаваемое состояние. При это данные, передаваемые выигравшим передатчиком, не искажаются. Да, внимательно перечитал старт темы, вношу правку - я расписывал про коллизию и арбитраж на MAC уровне CAN. ТС же говорил о коллизии на уровне протокола, когда на шине будут работать два устройства с одинаковым адресом. Такую коллизию поймать средствами MAC-уровня невозможно, это должно решаться как раз на протокольном уровне.
Сообщение отредактировал lead_seller - May 6 2015, 18:43
|
|
|
|
|
May 6 2015, 21:48
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(lead_seller @ May 6 2015, 21:36)  А чем проигрыш арбитража отличается от коллизии в CAN? Хоть это и не относится к вопросу ТС... давайте разберемся) Если адреса узлов разные и передача стартует одновременно, то узел с меньшим адресом выигрывает арбитраж и продолжает передавать. Проигравший не просто отвалится, он еще и корректно примет эту посылку. Но это только в поле адреса узла. Если при передаче данных и служебных полей будет обнаружен доминант при передаче рецессива, то узел не перейдет в режим слушателя, а начнет активно действовать: 1) увеличит счетчик ошибок передачи (+8?); 2) если счетчик меньше определенного значения (<127?), то выставит несколько доминантов (6?) на шине - мол, ошибка (активная). Все кто принимал увидят эту ошибку и увеличат свои счетчики ошибок приема; 3) если счетчик больше определенного числа, то выставит несколько рецессивов (6?) - тоже ошибка, только пассивная; 4) если счетчик переполнился (255), то наступает bus-off на сколько-то idle-циклов шины (13?). 5) если счетчик не переполнился, то будет повторная передача (если она включена, зависит от протокола, настроек контроллера и т.п.). При этом bus-off гарантируется. Итого: два одинаковых id узла на шине страшное зло! а не просто потеря арбитража. PS. В деталях могу напутать, но общий смысл такой.
|
|
|
|
|
May 7 2015, 07:49
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 27-10-08
Пользователь №: 41 225

|
Цитата(adnega @ May 7 2015, 00:48)  Хоть это и не относится к вопросу ТС... давайте разберемся)
Если адреса узлов разные и передача стартует одновременно, то узел с меньшим адресом выигрывает арбитраж и продолжает передавать. Проигравший не просто отвалится, он еще и корректно примет эту посылку.
Но это только в поле адреса узла. Если при передаче данных и служебных полей будет обнаружен доминант при передаче рецессива, то узел не перейдет в режим слушателя, а начнет активно действовать: 1) увеличит счетчик ошибок передачи (+8?); 2) если счетчик меньше определенного значения (<127?), то выставит несколько доминантов (6?) на шине - мол, ошибка (активная). Все кто принимал увидят эту ошибку и увеличат свои счетчики ошибок приема; 3) если счетчик больше определенного числа, то выставит несколько рецессивов (6?) - тоже ошибка, только пассивная; 4) если счетчик переполнился (255), то наступает bus-off на сколько-то idle-циклов шины (13?). 5) если счетчик не переполнился, то будет повторная передача (если она включена, зависит от протокола, настроек контроллера и т.п.). При этом bus-off гарантируется.
Итого: два одинаковых id узла на шине страшное зло! а не просто потеря арбитража.
PS. В деталях могу напутать, но общий смысл такой. Спасибо за информацию. Действительно начал вчитываться в доступное, там расписывается алгоритм арбитража именно в Arbitration field. Не подскажите, где можно посмотреть именно по коллизиям вне поле арбитража? К сожалению доступа к ISO 11898 не имею, а общедоступные статьи описывают только арбитраж в поле заголовка пакета.
|
|
|
|
Сообщений в этой теме
drnoob Коллизия в CAN Feb 20 2015, 08:22 adnega Цитата(drnoob @ Feb 20 2015, 11:22) По ка... Feb 20 2015, 08:31 drnoob Вот комбинации флагов состояния в зависимости о ко... Feb 20 2015, 08:38 adnega Цитата(drnoob @ Feb 20 2015, 11:38) Вот к... Feb 20 2015, 08:51 drnoob Интересно, даже не знал. Жаль, подобной детализаци... Feb 20 2015, 10:27 adnega Цитата(drnoob @ Feb 20 2015, 13:27) Интер... Feb 20 2015, 10:54
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|