Почему не работает CAN на STM32?
Обновлено Редакция GAW
Контроллер bxCAN в STM32F103 сам по себе к шине не подключается: ему нужен внешний трансивер, второй узел и правильно согласованная линия. Если чего-то не хватает, программа обычно зависает уже на старте или передатчик бесконечно повторяет первый кадр.
| Симптом | Причина | Проверка |
|---|---|---|
| Тайм-аут при старте, INAK = 1 | на CAN_RX нет 11 рецессивных бит подряд | трансивер, его питание и режим; без трансивера — вход CAN_RX с подтяжкой вверх |
| Кадр уходит снова и снова, растут счётчики ошибок | нет узла, подтверждающего кадр битом ACK | второй узел с той же скоростью или Loop back; автоповтор отключает бит NART |
| Обмен то идёт, то нет | нет терминаторов или скорость узлов разная | сопротивление CANH–CANL, настройки бит-тайминга |
| CAN не стартует вместе с USB | общая память и выводы PA11/PA12 | переназначение на PB8/PB9, отказ от USB |
Выход из инициализации
По RM0008 после сброса бита INRQ контроллер не сразу переходит в нормальный режим: он ждёт, пока шина станет свободной, — 11 рецессивных бит подряд на входе CAN_RX. Если трансивер не запаян, не запитан или его выход прижат к нулю, бит INAK так и остаётся в единице, а функция запуска в HAL возвращает ошибку по тайм-ауту.
Подтверждение кадра
В слоте ACK передатчик выдаёт рецессивный бит, и любой узел, правильно принявший кадр, перезаписывает его доминантным. Единственный узел на шине подтверждения не получает — это ошибка ACK, и кадр повторяется. Поэтому для проверки нужен второй узел с той же скоростью, а для отладки программы — режим Loop back. В bus-off одиночный узел при этом не уходит: по спецификации Bosch передатчик в состоянии error passive не увеличивает счётчик ошибок за ошибку подтверждения (исключение 1 правил ограничения ошибок).
Линия
По ISO 11898 на концах линии стоят два терминатора по 120 Ом. Наш расчёт: при выключенном питании мультиметр между CANH и CANL должен показать около 60 Ом — два резистора параллельно. 120 Ом означает один терминатор, около 40 Ом — лишний третий.
Скорость и точку выборки всех узлов согласует калькулятор битового тайминга CAN. Основы шины — на странице CAN, о согласовании линии — «согласующий резистор», о счётчиках ошибок — «состояния ошибок узла CAN».
Похожие вопросы
Как проверить CAN на STM32 без второго устройства?
Включить режим Loop back битом LBKM: контроллер принимает собственные кадры и не требует подтверждения, вход CANRX при этом не учитывается. Так проверяют фильтры и программу; линию и трансивер этот режим не проверяет.
Можно ли использовать CAN и USB на STM32F103 одновременно?
Нет. По RM0008 у STM32F103 USB и CAN используют общие 512 байт памяти: в одной программе их можно включать поочерёдно, но не одновременно. К тому же CAN по умолчанию выведен на PA11 и PA12 — те же выводы, что и USB; при работе CAN их переназначают на PB8 и PB9.
Какое напряжение должно быть на CANH и CANL в покое?
Около 2,5 В на обеих линиях относительно земли трансивера — это рецессивное состояние. Во время передачи доминантного бита CANH поднимается примерно до 3,5 В, CANL опускается до 1,5 В. Если в покое одна линия у земли или питания — ищите замыкание или неисправный трансивер.
Источники
- STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — разд. 24.4.2 — переход в нормальный режим после сброса INRQ подтверждается сбросом INAK, когда bxCAN увидит 11 рецессивных бит подряд (шина свободна); бит NART в CAN_MCR отключает автоматический повтор передачи; разд. 24.5.2 — режим Loop back (LBKM) для самопроверки: ошибки подтверждения игнорируются, вход CANRX не учитывается; разд. 23.2 — в устройствах low-, medium-, high- и XL-density USB и CAN делят 512 байт SRAM: их можно использовать в одном приложении, но не одновременно; разд. 9.3.3, табл. 34 — CAN_RX/CAN_TX на PA11/PA12, с переназначением на PB8/PB9 или PD0/PD1
- Texas Instruments. SLOA101B: Introduction to the Controller Area Network (CAN), S. Corrigan, 2002, ред. 2016 — поле ACK — каждый узел, правильно принявший кадр, перезаписывает рецессивный бит доминантным, иначе передатчик повторяет кадр; ISO 11898 — витая пара 120 Ом, терминаторы 120 Ом на обоих концах; в покое CANH и CANL около 2,5 В, в доминантном состоянии около 3,5 и 1,5 В
- Robert Bosch GmbH. CAN Specification Version 2.0, 1991 — часть A, разд. 6 — ошибка подтверждения (acknowledgement error): передатчик не видит доминантного бита в слоте ACK; разд. 7, исключение 1 — передатчик в состоянии error passive при ошибке подтверждения не увеличивает счётчик ошибок передачи
Нашли ошибку?