
Комментарии 7
Про выбор сегментов: перебирать сочетания не нужно, всё сводится к двум решениям.
Сколько квантов на бит. Берём 8–25, удобно 16. PRESDIV = f_can / (битрейт × N). Для 24 МГц и 500 кбит/с: 24 000 000 / (500 000 × 16) = 3.
Где точка выборки. Она после PROP+PSEG1, то есть (1 + PROP + PSEG1) / N. Для CAN classic обычно берут 87,5% (рекомендация CiA), в автомобилях часто 80–87,5%. Главное, чтобы у всех узлов на шине она была примерно одинаковой, иначе на длинной линии посыплются ошибки формы.
Итого для 500 кбит/с: SYNC 1 + PROP 5 + PSEG1 8 + PSEG2 2 = 16 квантов, выборка на 14/16 = 87,5%. RJW = min(4, PSEG2), здесь 2. В регистр CTRL1 эти поля пишутся минус единица.
И небольшая поправка про 120 Ом. Терминатор ставится не на каждом узле, а только на двух физических концах шины. Если поставить на каждом, при трёх-четырёх узлах суммарное сопротивление упадёт до 30–40 Ом, и трансиверу станет тяжело. Проверка простая: при выключенном питании между CAN_H и CAN_L должно быть около 60 Ом.
Ещё одна вещь, на которой многие спотыкаются на столе. Если узел на шине один, его кадры никто не подтверждает (нет ACK), счётчик ошибок передачи растёт, и контроллер уходит в error passive. Со стороны это выглядит как «прерывания сыплются, ничего не уходит», хотя битрейт выставлен правильно. Для первого запуска нужен второй узел (PCAN-View тут как раз подойдёт) или режим loopback.
что меня смутило - из того что я видел, сеть работает только со стандартным или только с расширенным идентификатором, никогда не видел чтобы жили в одной сети одновременно.
Живут, стандарт это прямо допускает. В кадре есть бит IDE, и при арбитраже, если первые 11 бит совпадают, стандартный кадр выигрывает у расширенного (у него на месте SRR и IDE доминантные биты). На практике смешанные сети встречаются: например, диагностика по ISO 15765-4 бывает и 11-, и 29-битной, и её запросы могут идти по той же шине, что и обычный обмен блоков. Если у контроллера раздельные фильтры для стандартных и расширенных ID, как в статье, то как раз для таких случаев.
по тексту есть некоторые корявости которые могут трактоваться неоднозначно:
трансивер может принимать до 12 разных CAN‑FD пакетов. То есть памяти там 792+ байт.
SDK от вендора безальтернативно устанавливает именно нулевой фильтр.
Проверяются флаги mailbox, которые условно сконфигурированы для отправки. В случае взведенных флагов вызываются формирование принятого пакета
делают какие то сложнейшие математический вычисления
Большинство CAN‑трансиверов также предоставляют возможность делать ADC выборку
По имени прерывания мы определим адрес конкретного трансивера
Невозможно отлаживать CAN через CAN,
как бы обо всем можно догадаться, несложно, но вызывает некоторое удивление
Настройка CAN шины на китайском микроконтроллере