Почему не работает 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.
Источники
- 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 рецессивных бит
- 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 рецессивных битов
- Texas Instruments. SLOA101B: Introduction to the Controller Area Network (CAN) — поле ACK — каждый узел, правильно принявший кадр, перезаписывает рецессивный бит доминантным, иначе передатчик повторяет кадр; ISO 11898 — терминаторы 120 Ом на обоих концах линии
- 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 не поддерживаются
Нашли ошибку?
Смотрите также
- TWAI (CAN в ESP32)Встроенный контроллер CAN 2.0 у ESP32 под названием Espressif
- Error active, error passive, bus-offТри состояния узла CAN по счётчикам ошибок
- CANCAN_H и CAN_L, терминаторы, кадр, арбитраж, ошибки, тайминг, MCP2515
- Почему не работает CAN на STM32?INAK не сбрасывается, нет ACK, общие с USB выводы
- Битовый тайминг CANCAN_BTR для STM32, CNF1–CNF3 для MCP2515, точка выборки