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

Арбитраж шины

Арбитраж шины — правило, по которому несколько передатчиков, начавших передачу одновременно, выясняют, кто продолжит. В CAN и I2C он происходит прямо во время передачи, побитно и без потери данных победителя.

Обновлено Редакция GAW

Арбитраж шины (bus arbitration) — механизм, по которому узлы на общей шине без единого ведущего решают, кто из одновременно начавших передачу её продолжит. В CAN и I²C он построен на свойстве линии, когда один уровень сильнее другого: доминантный уровень перекрывает рецессивный. В CAN доминантный — логический 0, который активно создаёт передатчик, рецессивный — 1, когда никто не передаёт. В I²C то же даёт схема с открытым стоком: ноль на линии, если её прижал хоть один выход.

Как проходит арбитраж

Все узлы, начавшие передачу одновременно, передают свои биты и сравнивают каждый с фактическим уровнем шины. Пока уровни совпадают, передача продолжается. Узел, который выдал рецессивную единицу, а увидел доминантный ноль, проиграл: он прекращает передачу и становится приёмником. Кадр победителя при этом не искажается и не задерживается.

CANI²C
Доминантный уровень0 (разность CAN_H − CAN_L около 2 В)0 (линия прижата к земле)
По чему идёт арбитражидентификатор и бит RTRадрес и данные на SDA
Кто побеждаетменьший идентификаторменьший адрес или данные

Следствия для CAN

  • Меньший идентификатор — выше приоритет. Приоритеты раздают по важности сообщений: в примере TI сообщения тормозной системы получают меньший идентификатор, чем указатели поворота.
  • Идентификаторы передатчиков должны быть уникальными: если два узла отправят кадры с одинаковым идентификатором и разными данными, на первом несовпавшем бите данных возникнет ошибка бита.

На том же свойстве доминантного уровня построено подтверждение приёма: любой узел, принявший кадр без ошибок, выдаёт доминантный бит ACK. Подробно — в статьях о шине CAN и интерфейсе I²C; в I²C от арбитража зависит и выбор адреса устройства.

Частые вопросы

Почему в CAN меньший идентификатор важнее?

Ноль — доминантный уровень: если один узел передаёт 0, а другой 1, на шине будет 0. При одновременной передаче узлы сравнивают каждый свой бит идентификатора с уровнем шины, и тот, кто выдал рецессивную единицу, а увидел доминантный ноль, выбывает. Поэтому в первом несовпавшем бите побеждает ноль, и идентификатор из одних нулей выигрывает всегда.

Портится ли кадр при арбитраже?

Нет. Пока уровни совпадают, все узлы передают одно и то же; проигравший прекращает передачу на первом несовпавшем бите и становится приёмником, а кадр победителя идёт дальше без искажений и задержек. Проигравшие повторяют попытку, когда шина освободится.

Как проходит арбитраж в I2C?

Так же побитно, но по линии SDA и по адресу и данным. Каждый ведущий сверяет выставленный бит с уровнем линии; кто передал единицу, а увидел ноль, проиграл и отпускает SDA. Приоритетов нет: в первом несовпавшем бите выигрывает ноль, поэтому из двух адресов побеждает меньший.

Источники

  1. Robert Bosch GmbH. CAN Specification Version 2.0, 1991 — доминантный и рецессивный уровни, побитовый арбитраж по идентификатору и RTR; проигравший прекращает передачу
  2. NXP Semiconductors. UM10204: I2C-bus specification and user manual, Rev. 7.0, 2021 — синхронизация тактов и арбитраж по SDA при нескольких ведущих
  3. Texas Instruments. SLOA101B: Introduction to the Controller Area Network (CAN), S. Corrigan, 2002, ред. 2016 — пример приоритетов: сообщения тормозной системы с меньшим идентификатором

Нашли ошибку?