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

Почему не работает CAN на ESP32?

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

Контроллер CAN у ESP32 называется TWAI, но протокол тот же — ISO 11898-1. Поэтому и неисправности те же, что у любого узла шины CAN, плюс две особенности ESP32: трансивера в чипе нет, а для отладки есть режимы, которые прячут проблемы шины.

Порядок проверки

ШагЧто проверитьПризнак проблемы
1программа в режиме self-test без шиныне проходит даже самопроверка — ошибка в коде или выводах
2есть внешний трансивер, питание, общий проводTX дёргается, на CANH и CANL тишина
3на шине есть второй работающий узелкадр повторяется, счётчик ошибок растёт
4одинаковая скорость и точка выборкиошибки формы и бит-стаффинга, bus-off
5два терминатора по 120 Ом на концахмежду CANH и CANL без питания не 60 Ом
6нет узлов CAN FDошибки при каждом кадре FD

Почему нужен второй узел

Передатчик в CAN ждёт подтверждения: каждый узел, правильно принявший кадр, перезаписывает рецессивный бит ACK доминантным. Если подтверждения нет, кадр считается не доставленным и повторяется, а счётчик ошибок передачи растёт на 8 за попытку. Наш расчёт: через 16 попыток TEC = 128, и узел становится error passive. Дальше по исключению 1 спецификации Bosch ошибка подтверждения у пассивного передатчика счётчик не увеличивает: узел повторяет кадр бесконечно, но в bus-off не уходит (состояния ошибок). Bus-off — признак других ошибок: разной скорости, плохой линии, помех. Узел в режиме listen-only подтверждение не даёт — по ESP-IDF он не передаёт ни одного доминантного бита, включая ACK.

Наш расчёт для проверки терминаторов: два резистора по 120 Ом параллельно дают 60 Ом; 120 Ом — один терминатор, около 40 Ом — лишний третий.

Скорость

TWAI ESP32 работает до 1 Мбит/с, нижний предел зависит от ревизии кристалла: 25 кбит/с у ранних ревизий и 12,5 кбит/с у v3.0 и v3.1. Скорость и точку выборки у всех узлов задают одинаково — тайминги для своей частоты посчитает калькулятор битовых таймингов CAN. Те же шаги для STM32 и типичные ошибки с терминаторами разобраны в ответе «Почему не работает CAN на STM32».

Похожие вопросы

Как проверить TWAI на одной плате без второго узла?

Включить режим самопроверки (enable_self_test): по ESP-IDF в нём контроллер не требует подтверждения ACK. Трансивер при этом можно даже не ставить — документация разрешает для проверки одного узла соединить TX и RX напрямую. Так проверяют программу, а уже потом — шину.

Почему после ошибок узел перестал передавать совсем?

Он в состоянии bus-off: счётчик ошибок передачи дошёл до 256. По ESP-IDF узел остаётся отключённым, пока программа не вызовет twai_node_recover(), а возврат происходит после 129 серий по 11 рецессивных бит; спецификация Bosch называет 128 серий, ESP-IDF — 129, разница в одну серию на практике незаметна. Причину ошибок надо устранить, иначе узел снова уйдёт в bus-off. Одиночный узел без ACK до bus-off не доходит — это признак ошибок формы, скорости или помех на шине.

Можно ли подключить ESP32 к шине, где работают узлы CAN FD?

Нет. По ESP-IDF контроллеры TWAI ESP32 не поддерживают кадры FD и воспринимают их как ошибку — узел будет отвечать кадрами ошибки и мешать шине. Для такой сети нужен контроллер CAN FD.

Источники

  1. Espressif. ESP-IDF Programming Guide v6.1: Two-Wire Automotive Interface (TWAI), ESP32 — встроенного трансивера нет, нужен внешний (например TJA105x для ISO 11898-2); для проверки одного узла TX и RX можно замкнуть; enable_self_test — ACK при передаче не проверяется; enable_listen_only — узел не передаёт доминантных бит, включая ACK; состояния: error active (TEC и REC < 96), warning (≥ 96), passive (≥ 128), bus off (TEC ≥ 256); twai_node_recover() — возврат после 129 серий по 11 рецессивных бит
  2. Robert Bosch GmbH. CAN Specification Version 2.0, 1991 — часть A, разд. 7 Fault Confinement: передатчик +8 за флаг ошибки; исключение 1 — пассивный передатчик с ошибкой подтверждения, не увидевший доминантного бита в пассивном флаге ошибки, TEC не увеличивает; error passive при счётчике ≥ 128, bus off при TEC ≥ 256; возврат из bus off после 128 раз по 11 рецессивных битов
  3. Texas Instruments. SLOA101B: Introduction to the Controller Area Network (CAN) — поле ACK — каждый узел, правильно принявший кадр, перезаписывает рецессивный бит доминантным, иначе передатчик повторяет кадр; ISO 11898 — терминаторы 120 Ом на обоих концах линии
  4. Espressif. ESP32 Technical Reference Manual v5.8, гл. 25 — TWAI совместим с ISO 11898-1 (CAN 2.0); 25 кбит/с – 1 Мбит/с у ревизий v0.0–v1.1, 12,5 кбит/с – 1 Мбит/с у v3.0 и v3.1; кадры CAN FD не поддерживаются

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