CAN-арбитраж осуществляется с помощью идентификаторов, и любой узел на шине может передавать с любым идентификатором (в идеале это не должно быть, но неприятный узел может).
Что если два разных узла, подключенных к одной и той же шине CAN, передают сообщения с одинаковыми идентификаторами, но разными байтами данных?
Мое мышление: оно будет генерировать мусор в автобусе. Тот, кто имеет доминирующие биты, будет передан только им.
Ответы:
Раздел 6.1 спецификации CAN :
Таким образом, узел, который сначала передает «1», когда другой передает «0», заметит битовую ошибку, а затем сообщит об ошибке как обычно - передавая флаг ошибки (см. Раздел 3.1.3), как описано формально в разделе 6.2.
Неофициально, если этот узел активен по ошибкам (что должно быть обычным случаем), он передаст флаг ошибки из 6 доминирующих битов, который также будут обнаружены всеми другими узлами (как ошибка заполнения). Это приводит к полному уничтожению этого сообщения:
Затем каждый передатчик будет пытаться повторить передачу - в зависимости от точного времени повторных передач, один из них может запуститься в достаточной степени, прежде чем другой начнет регулировать усиление шины. В противном случае та же последовательность может повториться. (Или другое сообщение с более высоким приоритетом может на некоторое время отключить их обоих!)
Расширенный ответ, вдохновленный ответом @ clabbacchio ниже.
Вы упомянули «неприятные узлы», и clabbacchio делает правильное замечание, что если два узла передают в разное время, каждый получатель должен решить, что делать с его множественными приемами.
Это было продемонстрировано взломом в прошлом году . В этом разделе в разделе «Особенности PSCM» обсуждается, как злоумышленник может синхронизироваться с обычными сообщениями на шине и воспроизводить свое злое сообщение непосредственно перед тем, которое собирается отправить «хороший» ECU. Принимающий ECU принимает более раннее сообщение, обновляет свой счетчик сообщений и затем отбрасывает «хорошие» сообщения как ошибочные, потому что его счетчик сообщений не увеличился.
источник
В своем вопросе вы выдвигаете эту гипотезу:
Это предполагает, что два сообщения передаются в одно и то же время, что является частным случаем более общей проблемы. Действительный ответ Мартина покрывает эту конкретную проблему, но игнорирует (более общий) случай, когда два узла осуществляют передачу в разное время.
В этом случае на шине будут циркулировать два сообщения с одним и тем же идентификатором, но разной полезной нагрузкой, и получатели должны различать эти два сообщения и решать, нужен ли им контент. Если им не удается различить два сообщения, они могут неверно истолковать данные и вызвать более серьезные проблемы, чем просто кадры ошибок.
Например, скажем, что одно сообщение содержит показание датчика температуры, а другое содержит целевое положение привода в одном и том же байте (ДОЛЖНО БЫТЬ НИКОГДА НЕ ПРОИЗОЙДЕТ В РЕАЛЬНОЙ ЖИЗНИ), вы можете получить привод в качестве цели, даже не зная об этом.
источник
Если поле данных сообщений отличается, вы (надеюсь!) Получите на шине сообщение об ошибке из-за неправильного CRC.
источник