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

Точка выборки CAN

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

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

Точка выборки (sample point) — момент внутри бита CAN, в который контроллер считывает уровень шины. Её выражают в процентах длительности бита от его начала. Бит CAN делится на кванты времени (time quanta): первый квант — сегмент синхронизации, затем сегменты до точки выборки (Prop_Seg и Phase_Seg1, у STM32 — объединённый BS1) и сегмент после неё (Phase_Seg2, у STM32 — BS2). По спецификации Bosch в бите от 8 до 25 квантов.

SP=1+Prop_Seg+Phase_Seg11+Prop_Seg+Phase_Seg1+Phase_Seg2\text{SP} = \frac{1 + \text{Prop\_Seg} + \text{Phase\_Seg1}}{1 + \text{Prop\_Seg} + \text{Phase\_Seg1} + \text{Phase\_Seg2}}

Зачем она поздно в бите

Сигнал от передатчика доходит до дальнего узла и возвращается с задержкой — в CAN подтверждение и арбитраж требуют, чтобы все узлы видели один и тот же бит одновременно. Поздняя точка выборки оставляет время на распространение по линии и задержки трансиверов. Слишком поздняя оставляет мало запаса на ресинхронизацию по фронтам, поэтому на высоких скоростях её сдвигают раньше: драйвер Linux по умолчанию берёт 87,5 % до 500 кбит/с, 80 % до 800 кбит/с и 75 % выше.

Примеры для 500 кбит/с

КонтроллерТактированиеНастройкаКвантов в битеТочка выборки
STM32F103 (bxCAN)APB1 36 МГцPrescaler 9, BS1 6, BS2 1887,5 %
MCP2515кварц 16 МГцCNF1 0x00, CNF2 0xB5, CNF3 0x011687,5 %

Рассчитать делитель, сегменты, SJW и значения регистров для STM32 и MCP2515, а также проверить допуск генераторов поможет калькулятор битового тайминга CAN. Устройство шины, уровни и формат кадра — в статье о шине CAN, а битовую структуру кадра нарисует конструктор кадра CAN.

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

Какую точку выборки выбрать?

Если особых требований нет — 87,5 %. Такую точку для скоростей до 500 кбит/с берёт по умолчанию драйвер CAN в Linux; до 800 кбит/с он берёт 80 %, выше — 75 %. Важнее самого числа, чтобы точка выборки совпадала у всех узлов шины.

Как настроить 500 кбит/с на STM32 с точкой выборки 87,5 %?

При частоте шины APB1 36 МГц: Prescaler = 9, BS1 = 6 квантов, BS2 = 1 квант, SJW = 1. Квант — 250 нс, в бите 8 квантов, точка выборки (1 + 6) / 8 = 87,5 %, значение регистра CAN_BTR = 0x00050008.

Что такое SJW?

Ширина скачка ресинхронизации (synchronization jump width) — на сколько квантов контроллер может удлинить или укоротить бит, подстраиваясь под фронты на шине. По спецификации Bosch она не больше длины сегмента перед точкой выборки. SJW больше 1 нужен при неточных генераторах, например керамических резонаторах.

Источники

  1. Robert Bosch GmbH. CAN Specification Version 2.0, 1991 — часть B, разд. 10 — сегменты бита, 8–25 квантов на бит, SJW не больше Phase_Seg1, общая для всех узлов точка выборки
  2. Microchip. MCP2515 Stand-Alone CAN Controller with SPI Interface, DS20001801J — разд. 5 — квант TQ = 2·(BRP + 1)/FOSC, длины сегментов, регистры CNF1–CNF3
  3. STMicroelectronics. RM0008 Reference manual STM32F101xx–STM32F107xx, Rev 21, 2021 — гл. 24 — bxCAN: разд. 24.7.7 «Bit timing», регистр CAN_BTR
  4. Linux kernel: drivers/net/can/dev/calc_bittiming.c — точки выборки по умолчанию: 87,5 % до 500 кбит/с, 80 % до 800 кбит/с, 75 % выше

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