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

Калькулятор битового тайминга CAN

Выберите контроллер, задайте частоту тактирования и скорость шины — калькулятор подберёт делитель и сегменты бита, покажет CAN_BTR для STM32 или CNF1–CNF3 для MCP2515, точку выборки и допуск частоты генератора.

Исходные данные

Контроллер CAN
МГц

частота кварца на OSC1/OSC2: у готовых модулей обычно 8 или 16 МГц

кбит/с

стандартные: 125, 250, 500, 1000 кбит/с

%

CiA 301 рекомендует 87,5 %

SJW, квантов

Результат

Регистры MCP2515
CNF1 0x00CNF2 0xB5CNF3 0x01
BTLMODE = 1, SAM = 0 (одна выборка)
BRP
0квант 125 нс = 2 периода FOSC
Квантов в бите
16 = 1 + 6 + 7 + 2Sync + Prop_Seg + PS1 + PS2
Точка выборки
87,5 %цель 87,5 %
Скорость
500 кбит/сошибка 0 %
SJW
1 квант
Допуск частоты генератора
±0,31 %по условиям Bosch для этих сегментов

Другие варианты с той же скоростью

  • BRP 1, 8 квантов, выборка 75 %CNF1 = 0x01, CNF2 = 0x91, CNF3 = 0x01

Скорость CAN получают двойным делением тактовой частоты контроллера: делитель задаёт длину кванта времени, а число квантов — длину бита. Всё остальное в битовом тайминге — выбор, сколько квантов оставить до точки выборки и сколько после. Калькулятор перебирает все делители, оставляет настройки с точной скоростью, выбирает из них ту, где точка выборки ближе всего к заданной, и переводит её в значения регистров: CAN_BTR для bxCAN в STM32 или CNF1, CNF2, CNF3 для MCP2515.

Как пользоваться калькулятором

  1. Контроллер. MCP2515 — внешний контроллер CAN с интерфейсом SPI, bxCAN — встроенный контроллер классического CAN в STM32. Для модуля FDCAN значения не подходят: у него другие регистры.
  2. Частота тактирования. Для MCP2515 это частота кварца или внешнего генератора на выводе OSC1: до 40 МГц при питании 4,5–5,5 В и до 25 МГц при 2,7–5,5 В. Для bxCAN это PCLK1 — частота шины APB1, от которой тактируется модуль, а не частота ядра. Число без приставки — мегагерцы.
  3. Скорость шины в кбит/с, до 1000: быстрее классический CAN не работает.
  4. Точка выборки в процентах длины бита, от 50 до 95. Калькулятор возьмёт ближайшую достижимую и покажет рядом заданную.
  5. SJW — на сколько квантов контроллер может подстроить бит по фронту сигнала, от 1 до 4.

В результате — значения регистров, поле BRP и длина кванта, раскладка бита по сегментам, фактические точка выборки и скорость, допуск частоты генератора. Для STM32 те же числа показаны в виде полей структуры CAN_InitTypeDef библиотеки HAL. Под результатом — до четырёх других настроек с той же скоростью: с другим числом квантов и другой точкой выборки. Введённые значения сохраняются в адресе страницы, поэтому расчётом можно поделиться: кнопка под калькулятором копирует результат вместе со ссылкой.

Битовое время CAN: кванты, сегменты и точка выборкиБит длиной 16 квантов по 125 нс (500 кбит/с): сегмент синхронизации 1 квант, Prop_Seg 6 квантов, Phase_Seg1 7 квантов и Phase_Seg2 2 кванта. Точка выборки — в конце Phase_Seg1, после 14 квантов из 16, то есть на 87,5 % бита. При пересинхронизации Phase_Seg1 удлиняется, а Phase_Seg2 укорачивается не больше чем на SJW.1 бит = 16 квантов по 125 нс = 2 мкс (500 кбит/с)SyncProp_Seg6 квантовPhase_Seg17 квантовPhase_Seg22 кванта12345678910111213141516точка выборки: 14 из 16 квантов = 87,5 %± SJWTSEG1 = Prop_Seg + Phase_Seg1 = 13TSEG2 = 2MCP2515 с кварцем 16 МГц: квант = 2 · (BRP + 1) / FOSC = 125 нс при BRP = 0
Настройка, которую калькулятор показывает при открытии страницы: MCP2515, кварц 16 МГц, 500 кбит/с. В бите 16 квантов — 1 + 6 + 7 + 2, точка выборки на 87,5 %.

Формулы

Бит состоит из NN квантов времени: один квант синхронизации, T1T_1 квантов до точки выборки и T2T_2 после неё. Квант — это kk периодов тактовой частоты ff:

fбит=fk⋅N,N=1+T1+T2,точка выборки=1+T1N.f_\text{бит} = \frac{f}{k \cdot N}, \qquad N = 1 + T_1 + T_2, \qquad \text{точка выборки} = \frac{1 + T_1}{N}.

У MCP2515 k=2⋅(BRP+1)k = 2 \cdot (\text{BRP} + 1), T1T_1 — сумма Prop_Seg и PS1, T2T_2 — это PS2. У bxCAN k=BRP+1k = \text{BRP} + 1, T1T_1 — сегмент BS1, T2T_2 — сегмент BS2. Пределы, в которых калькулятор ищет настройку:

ПараметрMCP2515STM32 bxCAN
Тактов на квант2–128, только чётные1–1024
Поле BRP0–630–1023
До точки выборки, квантов2–16 (Prop_Seg + PS1)1–16 (BS1)
После точки выборки, квантов2–8 (PS2)1–8 (BS2)
SJW, квантов1–41–4
Квантов в бите5–253–25

Prop_Seg и PS1 у MCP2515 — от 1 до 8 квантов каждый. Даташит добавляет два правила, которые калькулятор проверяет: Prop_Seg + PS1 не короче PS2, а PS2 длиннее SJW. Сегмент до точки выборки калькулятор делит так же, как драйвер Linux: Prop_Seg — половина с округлением вниз, остальное — PS1.

Найденные длины упаковываются в регистры. Каждое поле хранит длину, уменьшенную на единицу:

CAN_BTR = (SJW − 1) << 24 | (BS2 − 1) << 20 | (BS1 − 1) << 16 | BRP

CNF1 = (SJW − 1) << 6 | BRP
CNF2 = 0x80 | (PS1 − 1) << 3 | (Prop_Seg − 1)
CNF3 = PS2 − 1

Слагаемое 0x80 в CNF2 — бит BTLMODE: с ним длину PS2 задаёт регистр CNF3. Бит SAM калькулятор оставляет нулевым — одна выборка на бит; в CAN_BTR нулевыми остаются биты SILM и LBKM, то есть режим обычный.

Допуск частоты генератора — насколько частота каждого узла может отклониться от номинала, чтобы узлы не теряли синхронизацию. Калькулятор считает его по двум условиям из работы инженеров Bosch и берёт меньшее значение:

Δf≤min⁡(PS1, PS2)2⋅(13N−PS2),Δf≤SJW20N.\Delta f \le \frac{\min(\text{PS1},\ \text{PS2})}{2 \cdot (13 N - \text{PS2})}, \qquad \Delta f \le \frac{\text{SJW}}{20 N}.

Для bxCAN на месте PS1 и PS2 стоят BS1 и BS2.

Как калькулятор выбирает настройку

Одну и ту же скорость обычно дают несколько пар «делитель и число квантов». Порядок выбора такой:

  1. наименьшая ошибка скорости — точные настройки всегда впереди;
  2. в бите не меньше 8 квантов: спецификация Bosch требует от контроллера поддержки 8–25 квантов, и более короткий бит используется, только если других вариантов нет;
  3. точка выборки ближе всего к заданной;
  4. при равном отклонении — более ранняя точка выборки: после неё остаётся больше запаса на подстройку;
  5. при прочих равных — больше квантов в бите.

Пример расчёта: STM32, PCLK1 = 42 МГц, 250 кбит/с

Точка выборки 87,5 %, SJW = 1.

  1. На один бит приходится 42 000 000 / 250 000 = 168 периодов PCLK1.
  2. Раскладываем 168 на делитель и число квантов от 8 до 25: 7 × 24, 8 × 21, 12 × 14, 14 × 12 и 21 × 8.
  3. Для каждого варианта подбираем BS1 и BS2 так, чтобы точка выборки была ближе к 87,5 %. BS1 не длиннее 16 квантов, поэтому в длинных битах точка выборки получается ранней:
ДелительКвантов в битеBS1BS2Точка выборки
2186187,5 %
121411285,7 %
14129283,3 %
82116481 %
72416770,8 %
  1. В точку попадает первая строка: делитель 21, то есть BRP = 20, квант 500 нс, в бите 8 = 1 + 6 + 1 квантов.
  2. Регистр: CAN_BTR = 0 << 24 | 0 << 20 | 5 << 16 | 20 = 0x00050014. В HAL: Prescaler = 21, TimeSeg1 = CAN_BS1_6TQ, TimeSeg2 = CAN_BS2_1TQ, SyncJumpWidth = CAN_SJW_1TQ.
  3. Допуск генератора: первое условие даёт 1 / (2 · (13 · 8 − 1)) = 0,49 %, второе — 1 / (20 · 8) = 0,625 %. Действует меньшее: ±0,49 %.

Калькулятор покажет то же самое, а остальные четыре строки таблицы — в списке других вариантов. Если поставить SJW = 2, строка с BS2 = 1 отпадает: SJW не может быть длиннее BS2. Тогда калькулятор выберет вторую строку: Prescaler = 12, BS1 = 11, BS2 = 2, 14 квантов, точка выборки 85,7 %, CAN_BTR = 0x011A000B, допуск ±0,56 %.

Готовые значения регистров

Таблицы посчитаны тем же алгоритмом, что и калькулятор, для точки выборки 87,5 % и SJW = 1. В них попали только настройки с точной скоростью и не меньше чем 8 квантами в бите; там, где такой настройки нет, указана причина. Для другой точки выборки или SJW введите свои числа в калькулятор.

STM32 bxCAN: Prescaler, BS1, BS2 и CAN_BTR

Prescaler, BS1 и BS2 — значения для HAL, длины в квантах; CAN_BTR — то же самое одним числом для записи в регистр.

PCLK1СкоростьPrescalerBS1BS2Точка выборкиCAN_BTR
8 МГц1000 кбит/с16187,5 %0x00050000
800 кбит/с18190 %0x00070000
500 кбит/с113287,5 %0x001C0000
250 кбит/с213287,5 %0x001C0001
125 кбит/с413287,5 %0x001C0003
100 кбит/с513287,5 %0x001C0004
50 кбит/с1013287,5 %0x001C0009
20 кбит/с2513287,5 %0x001C0018
10 кбит/с5013287,5 %0x001C0031
16 МГц1000 кбит/с113287,5 %0x001C0000
800 кбит/с116385 %0x002F0000
500 кбит/с213287,5 %0x001C0001
250 кбит/с413287,5 %0x001C0003
125 кбит/с813287,5 %0x001C0007
100 кбит/с1013287,5 %0x001C0009
50 кбит/с2013287,5 %0x001C0013
20 кбит/с5013287,5 %0x001C0031
10 кбит/с10013287,5 %0x001C0063
36 МГц1000 кбит/с215288,9 %0x001E0001
800 кбит/с312286,7 %0x001B0002
500 кбит/с96187,5 %0x00050008
250 кбит/с913287,5 %0x001C0008
125 кбит/с1813287,5 %0x001C0011
100 кбит/с456187,5 %0x0005002C
50 кбит/с4513287,5 %0x001C002C
20 кбит/с2256187,5 %0x000500E0
10 кбит/с22513287,5 %0x001C00E0
42 МГц1000 кбит/с311285,7 %0x001A0002
800 кбит/сточного делителя нет: ближайшая 807,692 кбит/с (+0,96 %)
500 кбит/с611285,7 %0x001A0005
250 кбит/с216187,5 %0x00050014
125 кбит/с2113287,5 %0x001C0014
100 кбит/с2812286,7 %0x001B001B
50 кбит/с1056187,5 %0x00050068
20 кбит/с14012286,7 %0x001B008B
10 кбит/с5256187,5 %0x0005020C
45 МГц1000 кбит/с312286,7 %0x001B0002
800 кбит/сточного делителя нет: ближайшая 803,571 кбит/с (+0,45 %)
500 кбит/с612286,7 %0x001B0005
250 кбит/с1212286,7 %0x001B000B
125 кбит/с456187,5 %0x0005002C
100 кбит/с3012286,7 %0x001B001D
50 кбит/с6012286,7 %0x001B003B
20 кбит/с15012286,7 %0x001B0095
10 кбит/с30012286,7 %0x001B012B
48 МГц1000 кбит/с313287,5 %0x001C0002
800 кбит/с412286,7 %0x001B0003
500 кбит/с613287,5 %0x001C0005
250 кбит/с1213287,5 %0x001C000B
125 кбит/с2413287,5 %0x001C0017
100 кбит/с3013287,5 %0x001C001D
50 кбит/с6013287,5 %0x001C003B
20 кбит/с15013287,5 %0x001C0095
10 кбит/с30013287,5 %0x001C012B

MCP2515: CNF1, CNF2 и CNF3

Значения для BTLMODE = 1. Сумма в столбце «Квантов в бите» — квант синхронизации, Prop_Seg, PS1 и PS2.

КварцСкоростьCNF1CNF2CNF3Квантов в битеТочка выборки
8 МГц1000 кбит/снедостижимо при такой частоте
800 кбит/столько 5 квантов в бите
500 кбит/с0x000x910x018 = 1 + 2 + 3 + 275 %
250 кбит/с0x000xB50x0116 = 1 + 6 + 7 + 287,5 %
125 кбит/с0x010xB50x0116 = 1 + 6 + 7 + 287,5 %
100 кбит/с0x010xBF0x0220 = 1 + 8 + 8 + 385 %
50 кбит/с0x040xB50x0116 = 1 + 6 + 7 + 287,5 %
20 кбит/с0x090xBF0x0220 = 1 + 8 + 8 + 385 %
10 кбит/с0x180xB50x0116 = 1 + 6 + 7 + 287,5 %
16 МГц1000 кбит/с0x000x910x018 = 1 + 2 + 3 + 275 %
800 кбит/с0x000x9A0x0110 = 1 + 3 + 4 + 280 %
500 кбит/с0x000xB50x0116 = 1 + 6 + 7 + 287,5 %
250 кбит/с0x010xB50x0116 = 1 + 6 + 7 + 287,5 %
125 кбит/с0x030xB50x0116 = 1 + 6 + 7 + 287,5 %
100 кбит/с0x040xB50x0116 = 1 + 6 + 7 + 287,5 %
50 кбит/с0x090xB50x0116 = 1 + 6 + 7 + 287,5 %
20 кбит/с0x180xB50x0116 = 1 + 6 + 7 + 287,5 %
10 кбит/с0x310xB50x0116 = 1 + 6 + 7 + 287,5 %
20 МГц1000 кбит/с0x000x9A0x0110 = 1 + 3 + 4 + 280 %
800 кбит/сточного делителя нет: ближайшая 769,231 кбит/с (−3,8 %)
500 кбит/с0x000xBF0x0220 = 1 + 8 + 8 + 385 %
250 кбит/с0x010xBF0x0220 = 1 + 8 + 8 + 385 %
125 кбит/с0x040xB50x0116 = 1 + 6 + 7 + 287,5 %
100 кбит/с0x040xBF0x0220 = 1 + 8 + 8 + 385 %
50 кбит/с0x090xBF0x0220 = 1 + 8 + 8 + 385 %
20 кбит/с0x180xBF0x0220 = 1 + 8 + 8 + 385 %
10 кбит/с0x310xBF0x0220 = 1 + 8 + 8 + 385 %

Точка выборки у MCP2515 с 8 квантами в бите — 75 %: PS2 не бывает короче 2 квантов. С кварцем 20 МГц на большинстве скоростей бит состоит из 20 квантов, и ближайшая к 87,5 % точка выборки — 85 %.

Типичные ошибки

  • Вместо PCLK1 подставлена частота ядра. bxCAN тактируется от шины APB1. Если делитель этой шины не равен единице, PCLK1 ниже частоты ядра, и реальная скорость окажется во столько же раз ниже расчётной.
  • В поле Prescaler записан BRP. В HAL поле Prescaler — это делитель от 1 до 1024, единицу функция HAL_CAN_Init вычитает сама. BRP на единицу меньше, и он нужен, только если писать в CAN_BTR напрямую.
  • Длины сегментов записаны в регистр как есть. Поля регистров хранят длину минус один: BS1 = 6 квантов — это 5 в поле TS1, PS2 = 2 кванта — это 1 в CNF3. Константы HAL вида CAN_BS1_6TQ уже учитывают это.
  • У MCP2515 не установлен BTLMODE. Без него микросхема не смотрит в CNF3 и берёт PS2 равным большему из PS1 и 2 квантов. Если записать CNF2 = 0x35 вместо 0xB5, PS2 станет 7 квантов вместо 2, бит — 21 квант вместо 16, и с кварцем 16 МГц вместо 500 кбит/с получится 381 кбит/с.
  • Частота кварца в программе не та, что на плате. Квант MCP2515 задаётся в периодах кварца, поэтому значения для 16 МГц на плате с кварцем 8 МГц дадут ровно половину скорости.
  • Регистры записаны не в том режиме. CNF1–CNF3 меняются только в режиме конфигурации MCP2515. HAL_CAN_Init перед записью CAN_BTR сама переводит bxCAN в режим инициализации.
  • Разные точки выборки у узлов. По спецификации Bosch положение точки выборки следует выбирать общим для всех узлов. Если узлы настраивают разные люди, договоритесь о скорости, точке выборки и SJW заранее.
  • Скорость «почти та». Ошибка скорости расходует допуск генератора. Когда калькулятор предупреждает, что ошибка не меньше допуска, настройкой пользоваться нельзя — нужна другая тактовая частота.

Калькулятор отвечает на вопрос, что записать в регистры. Хватит ли сегмента до точки выборки на задержки в линии заданной длины и что происходит с битом при подстройке — в разделе «Битовый тайминг» статьи о шине CAN.

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

Какие Prescaler, BS1 и BS2 задать для 500 кбит/с на STM32 при PCLK1 = 36 МГц?

Prescaler = 9, BS1 = 6 квантов, BS2 = 1 квант, SJW = 1: квант 250 нс, в бите 8 квантов, точка выборки 87,5 %, CAN_BTR = 0x00050008. Если нужен SJW = 2, возьмите Prescaler = 4, BS1 = 15, BS2 = 2: 18 квантов, точка выборки 88,9 %, CAN_BTR = 0x011E0003. PCLK1 — частота шины APB1, а не ядра; 36 МГц — её предел у STM32F103.

Какие CNF1, CNF2 и CNF3 записать в MCP2515 для 500 кбит/с?

С кварцем 16 МГц: CNF1 = 0x00, CNF2 = 0xB5, CNF3 = 0x01 — 16 квантов в бите, точка выборки 87,5 %. С кварцем 8 МГц: CNF1 = 0x00, CNF2 = 0x91, CNF3 = 0x01 — в бите только 8 квантов, и точка выборки не позже 75 %, потому что PS2 у MCP2515 не короче 2 квантов. Значения рассчитаны для BTLMODE = 1, а записать их можно только в режиме конфигурации.

Почему MCP2515 с кварцем 8 МГц не работает на 1 Мбит/с?

Квант у MCP2515 не короче двух периодов кварца: при 8 МГц это 250 нс. Бит на 1 Мбит/с длится 1000 нс — 4 кванта, а микросхеме нужно не меньше 5: квант синхронизации, по одному на Prop_Seg и PS1 и два на PS2. Потолок для кварца 8 МГц — 800 кбит/с с 5 квантами и точкой выборки 60 %. Для 1 Мбит/с нужен кварц не меньше 10 МГц, а чтобы в бите было 8 квантов — 16 МГц.

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

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

Что делать, если точная скорость не получается?

Скорость получается точно, только когда частота тактирования делится на скорость нацело, а частное раскладывается на делитель и число квантов в бите — лучше от 8 до 25. Пример: PCLK1 = 42 МГц и 800 кбит/с дают 52,5 — не целое. Ближайшая настройка — 807,692 кбит/с, ошибка +0,96 % при допуске генератора ±0,38 % для этих сегментов: узел будет терять синхронизацию. Выход — другая частота PCLK1 (с 36 или 48 МГц 800 кбит/с получаются точно) или другая скорость.

Чем BS1 и BS2 в STM32 отличаются от Prop_Seg, PS1 и PS2 в MCP2515?

Это одни и те же отрезки бита, нарезанные по-разному. В bxCAN всё между квантом синхронизации и точкой выборки — один сегмент BS1 длиной 1–16 квантов; в MCP2515 он разделён на Prop_Seg и PS1, по 1–8 квантов. BS2 и PS2 — участок после точки выборки: 1–8 квантов у bxCAN и 2–8 у MCP2515. На работу шины влияет только сумма до точки выборки, поэтому калькулятор делит её между Prop_Seg и PS1 примерно пополам.

Источники

  1. Robert Bosch GmbH. CAN Specification Version 2.0, 1991 — часть B, разд. 10 — сегменты бита, 8–25 квантов на бит, SJW не больше Phase_Seg1, общая для всех узлов точка выборки; часть A, разд. 9 — допуск генератора 1,58 %
  2. Microchip. MCP2515 Stand-Alone CAN Controller with SPI Interface, DS20001801J — разд. 5 — квант TQ = 2·(BRP + 1)/FOSC, длины сегментов, правила программирования, пример для 20 МГц и 125 кбит/с; регистры CNF1–CNF3; разд. 10.1 — режим конфигурации; табл. 13-2 — частота генератора
  3. STMicroelectronics. RM0008 Reference manual STM32F101xx–STM32F107xx, Rev 21, 2021 — гл. 24 — bxCAN: разд. 24.7.7 «Bit timing» и регистр CAN_BTR
  4. STMicroelectronics. STM32F1 HAL driver: stm32f1xx_hal_can.h, stm32f1xx_hal_can.c; CMSIS device header stm32f103xb.h — поле Prescaler 1–1024, константы CAN_BS1_1TQ…16TQ, CAN_BS2_1TQ…8TQ, CAN_SJW_1TQ…4TQ; HAL_CAN_Init записывает в CAN_BTR значение Prescaler − 1; позиции полей регистра
  5. F. Hartwich, A. Bassemir (Robert Bosch GmbH). The Configuration of the CAN Bit Timing, 6th iCC, 1999 — две формулы допуска частоты генератора
  6. Linux kernel: drivers/net/can/dev/calc_bittiming.c — порядок подбора: сначала ошибка скорости, затем точка выборки; точки выборки по умолчанию 87,5, 80 и 75 %; деление сегмента до точки выборки на Prop_Seg и Phase_Seg1
Встроить калькулятор на свой сайт

Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах

<iframe src="https://gaw.ru/embed/can-bit-timing/" title="Калькулятор битового тайминга CAN" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/can-bit-timing/">Калькулятор битового тайминга CAN</a> — GAW.ru</p>
Автоподстройка высоты рамки

Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.

<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>

Обновлено . Нашли ошибку в расчёте? Напишите нам.