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

Состояния ошибок узла CAN

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

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

Состояния ошибок узла CAN — три режима, в которых может находиться контроллер CAN в зависимости от числа обнаруженных ошибок. Спецификация Bosch CAN 2.0 называет этот механизм fault confinement — ограничение неисправности: узел, который часто ошибается, постепенно лишается права мешать остальным.

Счётчики TEC и REC

Каждый узел ведёт два счётчика: ошибок передачи (TEC, transmit error count) и ошибок приёма (REC, receive error count). Главные правила Bosch:

  • приёмник обнаружил ошибку — REC + 1;
  • передатчик отправил флаг ошибки — TEC + 8;
  • кадр успешно передан — TEC − 1;
  • кадр успешно принят — REC − 1 (если REC был больше 127, он становится от 119 до 127).

Ошибка стоит дороже, чем успех, поэтому редкие сбои счётчики «прощают», а постоянные быстро накапливаются.

Три состояния

СостояниеУсловиеПоведение
Error activeTEC ≤ 127 и REC ≤ 127полноценно работает, при ошибке передаёт активный флаг из шести доминантных битов
Error passiveTEC ≥ 128 или REC ≥ 128передаёт только пассивный флаг из рецессивных битов, после своей передачи выжидает дольше
Bus-offTEC ≥ 256не влияет на шину

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

Из bus-off узел возвращается в error active со сброшенными счётчиками после того, как увидит на шине 128 раз по 11 рецессивных битов подряд. Делает ли контроллер это сам или ждёт команды программы, зависит от микросхемы.

Зачем это нужно

TI в SLOA101B объясняет смысл механизма так: без счётчиков неисправный узел мог бы занять шину, бесконечно отвечая кадрами ошибки на каждый кадр. Счётчики гарантируют, что такой узел сначала перестанет разрушать чужие кадры, а затем потеряет возможность передавать. Если узлы расходятся в настройке битового тайминга — скорости и точки выборки, ошибки будут возникать постоянно; проверить настройки поможет калькулятор битового тайминга CAN.

Не путать с флагом ошибки — это сигнал внутри кадра ошибки, а состояние определяет, какой флаг узел имеет право передавать.

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

Что значит bus-off в CAN?

Узел насчитал слишком много ошибок передачи — счётчик TEC дошёл до 256 — и по спецификации Bosch больше не влияет на шину: не передаёт и не подтверждает кадры. Вернуться он может только после того, как увидит на шине 128 раз по 11 рецессивных битов подряд; счётчики при этом обнуляются.

Почему одиночный узел CAN не уходит в bus-off?

Его кадры никто не подтверждает, и каждая попытка — ошибка подтверждения с TEC + 8. После 16 попыток TEC = 128 и узел становится error passive. Дальше действует исключение из правил Bosch: ошибка подтверждения у пассивного передатчика, не увидевшего доминантного бита, TEC не увеличивает. Узел повторяет кадр бесконечно, но в bus-off не уходит.

Как понять, что шина CAN сильно зашумлена?

По счётчикам ошибок. Bosch отмечает, что значение больше примерно 96 указывает на сильно возмущённую шину, и советует давать программе способ это проверить. Многие контроллеры ставят при таком счётчике флаг предупреждения.

Источники

  1. Robert Bosch GmbH. CAN Specification Version 2.0 (1991) — часть A, разд. 7 Fault Confinement: состояния error active, error passive, bus off; error active передаёт активный флаг ошибки, error passive — только пассивный и после передачи ждёт перед следующей; bus off не влияет на шину; счётчики TRANSMIT ERROR COUNT и RECEIVE ERROR COUNT, правила 1–12: приёмник +1, передатчик +8, успешная передача −1, успешный приём −1 (от 128 и выше — к 119…127); error passive при счётчике ≥ 128, bus off при TEC ≥ 256, возврат в error active при обоих ≤ 127; из bus off — после 128 раз по 11 рецессивных битов, счётчики обнуляются; счётчик больше ~96 — сильно зашумлённая шина; одиночный узел без подтверждения становится error passive, но не bus off
  2. Texas Instruments. Introduction to the Controller Area Network (CAN), SLOA101B (S. Corrigan, August 2002, rev. May 2016) — разд. 4.2.3: система счётчиков ошибок не даёт узлу занять шину повторными кадрами ошибки; разд. 4.4: пять методов контроля ошибок; если неисправный узел постоянно повторяет ошибку, контроллер после достижения предела лишает его возможности передавать

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