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

Конструктор кадра CAN и CAN FD

Введите идентификатор и данные — инструмент соберёт кадр классического CAN или CAN FD бит за битом: поля, CRC, вставленные биты, длину и длительность на выбранных скоростях. Обратный режим разбирает строку битов классического CAN с логического анализатора и показывает, в каком месте кадр нарушает правила.

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

Режим
Протокол
Формат кадра
HEX

от 0 до 7FF

Тип кадра

DLC = 2; формат: 00 11, 0x00,0x11 или 0011

кбит/с

125, 250, 500, 1000 — для длительности кадра

Слот ACK на шине

Результат

CRC-15
0x4C12
19474 в десятичной записи; считается по 35 битам от SOF до конца данных
Длина кадра на шине
64 бита60 без вставок; с межкадровым интервалом — 67
Вставленных битов
4для такого формата и длины данных — не больше 12
Длительность кадра
128 мксбит — 2 мкс; с межкадровым интервалом — 134 мкс
Худший случай
72 битаоценка сверху; с интервалом — 75 бит, 150 мкс
Кадров в секунду при 100 % загрузке
7 462таких, как этот; самых длинных — 6 666

Кадр по битам

Слева направо в порядке передачи. Линия над битами — уровень на выводе RXD: вверху рецессивный (1), внизу доминантный (0).

Кадр CAN по битам: стандартный кадр, 64 бита на шинеSOFID · идентификатор0x110 = 272RTRIDEr0DLC2D0 · данные, байт 00x00 = 0D1 · данные, байт 10x11 = 17CRC · контрольная сумма0x4C12DELACKDELEOF · конец кадраIFSБит 1 кадра: SOF = 0 (доминантный)01Бит 2 кадра: ID10 = 0 (доминантный)0Бит 3 кадра: ID9 = 0 (доминантный)0Бит 4 кадра: ID8 = 1 (рецессивный)1Бит 5 кадра: ID7 = 0 (доминантный)0Бит 6 кадра: ID6 = 0 (доминантный)0Бит 7 кадра: ID5 = 0 (доминантный)0Бит 8 кадра: ID4 = 1 (рецессивный)1Бит 9 кадра: ID3 = 0 (доминантный)0Бит 10 кадра: ID2 = 0 (доминантный)010Бит 11 кадра: ID1 = 0 (доминантный)0Бит 12 кадра: ID0 = 0 (доминантный)0Бит 13 кадра: RTR = 0 (доминантный)0Бит 14 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 15 кадра: IDE = 0 (доминантный)0Бит 16 кадра: r0 = 0 (доминантный)0Бит 17 кадра: DLC3 = 0 (доминантный)0Бит 18 кадра: DLC2 = 0 (доминантный)0Бит 19 кадра: DLC1 = 1 (рецессивный)1Бит 20 кадра: DLC0 = 0 (доминантный)020Бит 21 кадра: D0.7 = 0 (доминантный)0Бит 22 кадра: D0.6 = 0 (доминантный)0Бит 23 кадра: D0.5 = 0 (доминантный)0Бит 24 кадра: D0.4 = 0 (доминантный)0Бит 25 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 26 кадра: D0.3 = 0 (доминантный)0Бит 27 кадра: D0.2 = 0 (доминантный)0Бит 28 кадра: D0.1 = 0 (доминантный)0Бит 29 кадра: D0.0 = 0 (доминантный)0Бит 30 кадра: D1.7 = 0 (доминантный)030Бит 31 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 32 кадра: D1.6 = 0 (доминантный)0Бит 33 кадра: D1.5 = 0 (доминантный)0Бит 34 кадра: D1.4 = 1 (рецессивный)1Бит 35 кадра: D1.3 = 0 (доминантный)0Бит 36 кадра: D1.2 = 0 (доминантный)0Бит 37 кадра: D1.1 = 0 (доминантный)0Бит 38 кадра: D1.0 = 1 (рецессивный)1Бит 39 кадра: CRC14 = 1 (рецессивный)1Бит 40 кадра: CRC13 = 0 (доминантный)040Бит 41 кадра: CRC12 = 0 (доминантный)0Бит 42 кадра: CRC11 = 1 (рецессивный)1Бит 43 кадра: CRC10 = 1 (рецессивный)1Бит 44 кадра: CRC9 = 0 (доминантный)0Бит 45 кадра: CRC8 = 0 (доминантный)0Бит 46 кадра: CRC7 = 0 (доминантный)0Бит 47 кадра: CRC6 = 0 (доминантный)0Бит 48 кадра: CRC5 = 0 (доминантный)0Бит 49 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 50 кадра: CRC4 = 1 (рецессивный)150Бит 51 кадра: CRC3 = 0 (доминантный)0Бит 52 кадра: CRC2 = 0 (доминантный)0Бит 53 кадра: CRC1 = 1 (рецессивный)1Бит 54 кадра: CRC0 = 0 (доминантный)0Бит 55 кадра: разделитель CRC = 1 (рецессивный)1Бит 56 кадра: ACK = 0 (доминантный)0Бит 57 кадра: разделитель ACK = 1 (рецессивный)1Бит 58 кадра: EOF, бит 1 = 1 (рецессивный)1Бит 59 кадра: EOF, бит 2 = 1 (рецессивный)1Бит 60 кадра: EOF, бит 3 = 1 (рецессивный)160Бит 61 кадра: EOF, бит 4 = 1 (рецессивный)1Бит 62 кадра: EOF, бит 5 = 1 (рецессивный)1Бит 63 кадра: EOF, бит 6 = 1 (рецессивный)1Бит 64 кадра: EOF, бит 7 = 1 (рецессивный)1Межкадровый интервал, бит 1: 1 (рецессивный)1Межкадровый интервал, бит 2: 1 (рецессивный)1Межкадровый интервал, бит 3: 1 (рецессивный)1
  • начало кадра
  • поле арбитража
  • поле управления
  • данные
  • контрольная сумма
  • фиксированная форма, без вставок
  • вставленный бит (stuff bit)
  • IFS — межкадровый интервал, в кадр не входит
ПолеБиты на шинеЗначение
SOF — начало кадра0доминантный
ID — идентификатор001000100000x110 = 272
RTR — запрос удалённой передачи01доминантный, вставлен 1 бит
IDE — признак расширенного формата0доминантный
r0 — резервный бит0доминантный
DLC — код длины данных00102
D0 — данные, байт 00000100000x00 = 0, вставлен 1 бит
D1 — данные, байт 10100100010x11 = 17, вставлен 1 бит
CRC — контрольная сумма10011000001100100x4C12, вставлен 1 бит
DEL — разделитель CRC1рецессивный
ACK — слот подтверждения0доминантный
DEL — разделитель ACK1рецессивный
EOF — конец кадра1111111рецессивный

Расчёт выполнен по формулам и данным из источников, приведённых на этой странице, и не заменяет проверку: параметры компонентов у разных производителей и даже партий различаются. Перед применением сверяйте результат с документацией на конкретные детали.

Кадр классического CAN — это цепочка битов без пауз: начало кадра, идентификатор, служебные биты, до 8 байт данных, 15-битная CRC и хвост фиксированной формы. На шине к ним добавляются вставленные биты, поэтому два кадра с одинаковым числом байтов могут различаться по длине. Конструктор собирает кадр так, как его выдаёт контроллер, и показывает каждый бит: к какому полю он относится и не вставлен ли он передатчиком.

Коротко

  • Стандартный кадр: SOF, идентификатор 11 бит, RTR, IDE, r0, DLC, 0–8 байт данных, CRC 15 бит, разделитель, ACK, разделитель, EOF 7 бит — 44 + 8n бит без вставок.
  • Расширенный кадр: после 11 бит базового идентификатора идут SRR и IDE, 18 бит расширения, RTR, r1 и r0 — 64 + 8n бит без вставок.
  • Битстаффинг: после пяти одинаковых битов подряд передатчик вставляет противоположный; правило действует от SOF до последнего бита CRC, вставленный бит входит в следующую серию.
  • CRC-15: полином 0x4599, начальное значение ноль; считается по битам от SOF до конца данных без вставленных битов.
  • Худший случай: стандартный кадр с 8 байтами — до 132 бит, расширенный — до 157; между кадрами ещё 3 рецессивных бита.
  • CAN FD: до 64 байт данных, CRC-17 или CRC-21 со вставленными битами, счётчик вставок в начале поля CRC и фиксированные вставленные биты; с BRS биты от ESI до разделителя CRC идут на скорости фазы данных.

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

Выберите формат кадра, введите идентификатор в шестнадцатеричном виде и байты данных — от нуля до восьми. DLC подставится сам: в кадре данных он равен числу байтов. Для удалённого кадра данных нет, и DLC выбирается отдельно. Скорость шины нужна только для длительности: на биты она не влияет.

Под панелью расчёта — лента битов в порядке передачи. Поля окрашены так же, как на схеме кадра в статье о шине CAN, вставленные биты выделены и помечены треугольником, под каждым полем подписано значение. Линия над битами повторяет сигнал на выводе RXD или TXD трансивера: вверху рецессивный уровень, внизу доминантный. Ниже та же информация таблицей — её удобнее читать с телефона.

Переключатель «Слот ACK» задаёт, как кадр выглядит на шине. Передатчик выдаёт в этом слоте рецессивный бит, а приёмники заменяют его доминантным, поэтому на работающей шине там ноль. Вариант «Нет ответа» показывает кадр без подтверждения — таким он виден на выводе TXD передатчика или на шине с единственным узлом.

Переключатель «Протокол» собирает кадр CAN FD в формате ISO 11898-1:2015. Данных — от 0 до 64 байт; если их число не совпадает с длиной, которую можно записать в DLC, кадр дополняется байтом-заполнителем до ближайшей допустимой. Две скорости — номинальная и фазы данных — нужны для длительности кадра; без переключения скорости (BRS = 0) весь кадр идёт на номинальной.

Режим «Разобрать биты» работает в обратную сторону: принимает строку из нулей и единиц классического кадра CAN и раскладывает её по полям. Все параметры хранятся в адресе страницы, так что ссылкой на собранный кадр можно поделиться.

Поля кадра CAN

ПолеБитСтандартныйРасширенныйЧто передаётся
SOF1дададоминантный бит начала кадра
ID (ID-A)11ID10–ID0ID28–ID18идентификатор или его базовая часть, старшим битом вперёд
RTR1дапосле ID-B0 — кадр данных, 1 — удалённый кадр
SRR1—дарецессивный бит на месте RTR стандартного кадра
IDE101признак формата: доминантный — стандартный, рецессивный — расширенный
ID-B18—ID17–ID0расширение идентификатора
r11—дарезервный бит, передаётся доминантным
r01дадарезервный бит, передаётся доминантным
DLC4дадачисло байтов данных, 0–8
DATA8nдададанные, каждый байт старшим битом вперёд; в удалённом кадре поля нет
CRC15дадаконтрольная последовательность
DEL1дадаразделитель CRC, рецессивный
ACK1дадаслот подтверждения: передатчик выдаёт рецессивный бит, приёмники — доминантный
DEL1дадаразделитель ACK, рецессивный
EOF7дадаконец кадра, семь рецессивных битов

За кадром следует межкадровый интервал (intermission) — три рецессивных бита. В кадр он не входит, но при подсчёте загрузки шины его прибавляют к каждому кадру: следующий кадр может начаться только после него.

Порядок полей в расширенном кадре выбран не случайно. SRR и IDE стоят там, где у стандартного кадра RTR и IDE, и оба рецессивные. Поэтому при одинаковых первых 11 битах идентификатора стандартный кадр выигрывает арбитраж у расширенного. Полный идентификатор расширенного кадра складывается из двух частей: базовая даёт старшие 11 бит, расширение — младшие 18.

Резервные биты передатчик обязан выдавать доминантными, а приёмник по спецификации Bosch принимает их в любом сочетании. В CAN FD на месте r0 стандартного кадра и r1 расширенного стоит рецессивный бит — признак нового формата. Такие кадры конструктор собирает в режиме CAN FD, а разбор строки битов работает только с классическим CAN.

Спецификация Bosch CAN 2.0 запрещает идентификаторы, у которых семь старших битов рецессивные: в стандартном кадре это 0x7F0–0x7FF. Конструктор соберёт и такой кадр, но предупредит об этом.

Битстаффинг: когда вставляется бит

Приёмники CAN подстраивают свой отсчёт битов по перепадам сигнала, а длинная серия одинаковых битов перепадов не даёт. Поэтому передатчик следит за потоком: после пяти одинаковых битов подряд он вставляет один бит противоположного уровня. Приёмник делает обратное — после пяти одинаковых битов выбрасывает следующий. Если шестой бит оказался таким же, это ошибка заполнения (stuff error).

Правило битстаффинга CAN: после пяти одинаковых битов подряд вставляется противоположныйДве последовательности битов на шине. В первой двенадцать нулей: вставленная единица стоит после каждых пяти нулей. Во второй уровень меняется через четыре бита: вставленный бит сам начинает следующую серию из пяти одинаковых, поэтому вставки идут после каждых четырёх исходных битов.Одинаковые биты: вставка после каждых пяти000001000001005 одинаковых5 одинаковыхХудший случай: уровень меняется через четыре бита — вставка после каждых четырёх1111100000111110000015 одинаковых5 одинаковых5 одинаковых5 одинаковыхвставленный бит: приёмник его удаляет, в расчёт CRC он не входит
Вставленный бит открывает следующую серию. Поэтому в потоке одинаковых битов вставка идёт после каждых пяти, а если уровень меняется через четыре бита — после каждых четырёх.

Три правила, на которых чаще всего ошибаются при ручном разборе:

  • Вставленный бит участвует в счёте. Он первый в следующей серии: после вставленной единицы достаточно ещё четырёх единиц, чтобы появилась новая вставка.
  • Граница действия — последний бит CRC. Правило работает от SOF до конца последовательности CRC. Разделитель CRC, слот ACK, разделитель ACK и EOF имеют фиксированную форму, вставок в них нет.
  • Вставка возможна и после CRC. Если пятый одинаковый бит подряд — последний бит CRC, вставленный бит передаётся сразу за ним, перед разделителем. В записи сети NMEA 2000 из набора тестов sigrok так заканчиваются кадры с CRC 0x0120 и 0x00A0: за пятью нулями идёт вставленная единица и только потом разделитель.

В расчёт CRC вставленные биты не входят: передатчик считает CRC до вставки, приёмник — после удаления.

Как считается CRC-15

CRC кадра CAN — остаток от деления последовательности битов на полином x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1. В шестнадцатеричной записи без старшего члена это 0x4599. В последовательность входят SOF, поле арбитража, поле управления и данные — в том порядке, в каком они передаются, и без вставленных битов.

Спецификация Bosch описывает расчёт как сдвиговый регистр из 15 бит. Перед кадром он обнуляется, а для каждого очередного бита выполняются три действия:

  1. Сложить по модулю 2 очередной бит и старший бит регистра.
  2. Сдвинуть регистр на один бит влево, в младший бит записать ноль.
  3. Если на первом шаге получилась единица, сложить регистр по модулю 2 с 0x4599.

После последнего бита данных в регистре лежит CRC. Она передаётся старшим битом вперёд, все 15 бит. Приёмник выполняет тот же расчёт по принятым битам и сравнивает результат с принятой последовательностью.

В каталоге алгоритмов этот вариант называется CRC-15/CAN: полином 0x4599, начальное значение 0, без отражения и финального XOR. Он есть в калькуляторе CRC, но тот работает с байтами, а в кадре до поля CRC 19 + 8n бит. Выручает нулевое начальное значение: нули перед сообщением результат не меняют. Допишите спереди пять нулевых битов, и заголовок стандартного кадра займёт ровно три байта — число ID · 128 + DLC, для удалённого кадра ещё плюс 64. Байты данных идут за ним без сдвига. У расширенного кадра до CRC 39 + 8n бит, там хватает одного нулевого бита.

Пример: кадр 0x110 с данными 00 11

Соберём вручную стандартный кадр данных с идентификатором 0x110 и двумя байтами 00 11 — он же открыт в конструкторе по умолчанию.

Шаг 1. Поля до CRC. Всего 19 + 16 = 35 бит:

ПолеБитыЗначение
SOF0—
ID001 0001 00000x110
RTR, IDE, r00 0 0кадр данных, стандартный формат
DLC00102 байта
DATA0000 0000 0001 000100 11

Шаг 2. CRC. Первые три бита — нули, регистр остаётся нулевым. Четвёртый бит — единица: после сдвига регистр складывается с полиномом и становится равным 0x4599. Пятый бит — ноль, но старший бит регистра уже единица, поэтому после сдвига снова выполняется сложение: 0x0B32 ⊕ 0x4599 = 0x4EAB. Дальше так же, бит за битом:

ОбработаноБитРегистр
SOF и идентификатор120x69B1
RTR, IDE, r0 и DLC190x0F5E
первый байт данных270x11F4
второй байт данных350x4C12

CRC равна 0x4C12, в двоичном виде — 100 1100 0001 0010. Проверка байтовым калькулятором: пять нулей и 35 бит кадра складываются в байты 00 88 02 00 11, и CRC-15/CAN от них — те же 0x4C12.

Шаг 3. Вставленные биты. Под правило попадают 50 бит: 35 бит до CRC и 15 бит CRC. Серий из пяти одинаковых битов четыре:

  • четыре младших бита идентификатора и RTR — пять нулей, вставка сразу после RTR, на границе полей;
  • DLC0 и четыре старших бита первого байта данных — вставка в середине байта;
  • оставшиеся четыре нуля первого байта и старший бит второго — вставка после первого бита второго байта;
  • пять нулей внутри CRC — вставка после десятого бита CRC.

Между первой и второй вставками стоят четыре нуля подряд — IDE, r0 и два старших бита DLC. Вставки там нет: серию обрывает единица в DLC.

Шаг 4. Хвост. Рецессивный разделитель CRC, слот ACK — на шине он доминантный, — рецессивный разделитель ACK и семь рецессивных битов EOF.

Кадр целиком, вставленные биты — в скобках:

0001000100000[1]0000100000[1]00000[1]00100011001100000[1]100101011111111
Стандартный кадр CAN с идентификатором 0x110 и байтами данных 00 11 по битам: 64 бита от SOF до EOF, четыре вставленных бита — после RTR, в первом и втором байтах данных и в CRC; CRC-15 равна 0x4C12SOFID · идентификатор0x110 = 272RTRIDEr0DLC2D0 · данные, байт 00x00 = 0D1 · данные, байт 10x11 = 17CRC · контрольная сумма0x4C12DELACKDELEOF · конец кадраIFSБит 1 кадра: SOF = 0 (доминантный)01Бит 2 кадра: ID10 = 0 (доминантный)0Бит 3 кадра: ID9 = 0 (доминантный)0Бит 4 кадра: ID8 = 1 (рецессивный)1Бит 5 кадра: ID7 = 0 (доминантный)0Бит 6 кадра: ID6 = 0 (доминантный)0Бит 7 кадра: ID5 = 0 (доминантный)0Бит 8 кадра: ID4 = 1 (рецессивный)1Бит 9 кадра: ID3 = 0 (доминантный)0Бит 10 кадра: ID2 = 0 (доминантный)010Бит 11 кадра: ID1 = 0 (доминантный)0Бит 12 кадра: ID0 = 0 (доминантный)0Бит 13 кадра: RTR = 0 (доминантный)0Бит 14 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 15 кадра: IDE = 0 (доминантный)0Бит 16 кадра: r0 = 0 (доминантный)0Бит 17 кадра: DLC3 = 0 (доминантный)0Бит 18 кадра: DLC2 = 0 (доминантный)0Бит 19 кадра: DLC1 = 1 (рецессивный)1Бит 20 кадра: DLC0 = 0 (доминантный)020Бит 21 кадра: D0.7 = 0 (доминантный)0Бит 22 кадра: D0.6 = 0 (доминантный)0Бит 23 кадра: D0.5 = 0 (доминантный)0Бит 24 кадра: D0.4 = 0 (доминантный)0Бит 25 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 26 кадра: D0.3 = 0 (доминантный)0Бит 27 кадра: D0.2 = 0 (доминантный)0Бит 28 кадра: D0.1 = 0 (доминантный)0Бит 29 кадра: D0.0 = 0 (доминантный)0Бит 30 кадра: D1.7 = 0 (доминантный)030Бит 31 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 32 кадра: D1.6 = 0 (доминантный)0Бит 33 кадра: D1.5 = 0 (доминантный)0Бит 34 кадра: D1.4 = 1 (рецессивный)1Бит 35 кадра: D1.3 = 0 (доминантный)0Бит 36 кадра: D1.2 = 0 (доминантный)0Бит 37 кадра: D1.1 = 0 (доминантный)0Бит 38 кадра: D1.0 = 1 (рецессивный)1Бит 39 кадра: CRC14 = 1 (рецессивный)1Бит 40 кадра: CRC13 = 0 (доминантный)040Бит 41 кадра: CRC12 = 0 (доминантный)0Бит 42 кадра: CRC11 = 1 (рецессивный)1Бит 43 кадра: CRC10 = 1 (рецессивный)1Бит 44 кадра: CRC9 = 0 (доминантный)0Бит 45 кадра: CRC8 = 0 (доминантный)0Бит 46 кадра: CRC7 = 0 (доминантный)0Бит 47 кадра: CRC6 = 0 (доминантный)0Бит 48 кадра: CRC5 = 0 (доминантный)0Бит 49 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 50 кадра: CRC4 = 1 (рецессивный)150Бит 51 кадра: CRC3 = 0 (доминантный)0Бит 52 кадра: CRC2 = 0 (доминантный)0Бит 53 кадра: CRC1 = 1 (рецессивный)1Бит 54 кадра: CRC0 = 0 (доминантный)0Бит 55 кадра: разделитель CRC = 1 (рецессивный)1Бит 56 кадра: ACK = 0 (доминантный)0Бит 57 кадра: разделитель ACK = 1 (рецессивный)1Бит 58 кадра: EOF, бит 1 = 1 (рецессивный)1Бит 59 кадра: EOF, бит 2 = 1 (рецессивный)1Бит 60 кадра: EOF, бит 3 = 1 (рецессивный)160Бит 61 кадра: EOF, бит 4 = 1 (рецессивный)1Бит 62 кадра: EOF, бит 5 = 1 (рецессивный)1Бит 63 кадра: EOF, бит 6 = 1 (рецессивный)1Бит 64 кадра: EOF, бит 7 = 1 (рецессивный)1Межкадровый интервал, бит 1: 1 (рецессивный)1Межкадровый интервал, бит 2: 1 (рецессивный)1Межкадровый интервал, бит 3: 1 (рецессивный)1
Кадр 0x110 с данными 00 11: 60 бит полей и 4 вставленных. Вставленные биты выделены пунктиром и треугольником, под лентой — номера битов.

Получилось 64 бита. На скорости 500 кбит/с бит длится 2 мкс, кадр — 128 мкс, вместе с межкадровым интервалом — 134 мкс. Такой кадр — не учебная абстракция: именно эта последовательность записана на выводе RX контроллера MCP2515 отладочной платы Microchip MCP2515DM-BM и опубликована побитово в тестах декодера sigrok. Тесты конструктора сверяют с этими записями семь кадров, стандартных и расширенных, включая два кадра со вставкой после последнего бита CRC.

Расширенный кадр по битам

Расширенный кадр CAN с идентификатором 0x14611234 и байтами данных 00 01 02 03 по битам: базовый идентификатор, рецессивные SRR и IDE, расширение идентификатора, RTR, r1, r0, DLC, данные и CRC-15 0x3FBF; 104 бита, из них восемь вставленныхSOFID-A · базовый идентификатор0x518SRRIDEID-B · расширение идентификатора0x11234RTRr1r0DLC4D0 · данные, байт 00x00 = 0D1 · данные, байт 10x01 = 1D2 · данные, байт 20x02 = 2D3 · данные, байт 30x03 = 3CRC · контрольная сумма0x3FBFDELACKDELEOF · конец кадраIFSБит 1 кадра: SOF = 0 (доминантный)01Бит 2 кадра: ID28 = 1 (рецессивный)1Бит 3 кадра: ID27 = 0 (доминантный)0Бит 4 кадра: ID26 = 1 (рецессивный)1Бит 5 кадра: ID25 = 0 (доминантный)0Бит 6 кадра: ID24 = 0 (доминантный)0Бит 7 кадра: ID23 = 0 (доминантный)0Бит 8 кадра: ID22 = 1 (рецессивный)1Бит 9 кадра: ID21 = 1 (рецессивный)1Бит 10 кадра: ID20 = 0 (доминантный)010Бит 11 кадра: ID19 = 0 (доминантный)0Бит 12 кадра: ID18 = 0 (доминантный)0Бит 13 кадра: SRR = 1 (рецессивный)1Бит 14 кадра: IDE = 1 (рецессивный)1Бит 15 кадра: ID17 = 0 (доминантный)0Бит 16 кадра: ID16 = 1 (рецессивный)1Бит 17 кадра: ID15 = 0 (доминантный)0Бит 18 кадра: ID14 = 0 (доминантный)0Бит 19 кадра: ID13 = 0 (доминантный)0Бит 20 кадра: ID12 = 1 (рецессивный)120Бит 21 кадра: ID11 = 0 (доминантный)0Бит 22 кадра: ID10 = 0 (доминантный)0Бит 23 кадра: ID9 = 1 (рецессивный)1Бит 24 кадра: ID8 = 0 (доминантный)0Бит 25 кадра: ID7 = 0 (доминантный)0Бит 26 кадра: ID6 = 0 (доминантный)0Бит 27 кадра: ID5 = 1 (рецессивный)1Бит 28 кадра: ID4 = 1 (рецессивный)1Бит 29 кадра: ID3 = 0 (доминантный)0Бит 30 кадра: ID2 = 1 (рецессивный)130Бит 31 кадра: ID1 = 0 (доминантный)0Бит 32 кадра: ID0 = 0 (доминантный)0Бит 33 кадра: RTR = 0 (доминантный)0Бит 34 кадра: r1 = 0 (доминантный)0Бит 35 кадра: r0 = 0 (доминантный)0Бит 36 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 37 кадра: DLC3 = 0 (доминантный)0Бит 38 кадра: DLC2 = 1 (рецессивный)1Бит 39 кадра: DLC1 = 0 (доминантный)0Бит 40 кадра: DLC0 = 0 (доминантный)040Бит 41 кадра: D0.7 = 0 (доминантный)0Бит 42 кадра: D0.6 = 0 (доминантный)0Бит 43 кадра: D0.5 = 0 (доминантный)0Бит 44 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 45 кадра: D0.4 = 0 (доминантный)0Бит 46 кадра: D0.3 = 0 (доминантный)0Бит 47 кадра: D0.2 = 0 (доминантный)0Бит 48 кадра: D0.1 = 0 (доминантный)0Бит 49 кадра: D0.0 = 0 (доминантный)0Бит 50 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых150Бит 51 кадра: D1.7 = 0 (доминантный)0Бит 52 кадра: D1.6 = 0 (доминантный)0Бит 53 кадра: D1.5 = 0 (доминантный)0Бит 54 кадра: D1.4 = 0 (доминантный)0Бит 55 кадра: D1.3 = 0 (доминантный)0Бит 56 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 57 кадра: D1.2 = 0 (доминантный)0Бит 58 кадра: D1.1 = 0 (доминантный)0Бит 59 кадра: D1.0 = 1 (рецессивный)1Бит 60 кадра: D2.7 = 0 (доминантный)060Бит 61 кадра: D2.6 = 0 (доминантный)0Бит 62 кадра: D2.5 = 0 (доминантный)0Бит 63 кадра: D2.4 = 0 (доминантный)0Бит 64 кадра: D2.3 = 0 (доминантный)0Бит 65 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 66 кадра: D2.2 = 0 (доминантный)0Бит 67 кадра: D2.1 = 1 (рецессивный)1Бит 68 кадра: D2.0 = 0 (доминантный)0Бит 69 кадра: D3.7 = 0 (доминантный)0Бит 70 кадра: D3.6 = 0 (доминантный)070Бит 71 кадра: D3.5 = 0 (доминантный)0Бит 72 кадра: D3.4 = 0 (доминантный)0Бит 73 кадра: вставленный бит 1 (рецессивный) после пяти одинаковых1Бит 74 кадра: D3.3 = 0 (доминантный)0Бит 75 кадра: D3.2 = 0 (доминантный)0Бит 76 кадра: D3.1 = 1 (рецессивный)1Бит 77 кадра: D3.0 = 1 (рецессивный)1Бит 78 кадра: CRC14 = 0 (доминантный)0Бит 79 кадра: CRC13 = 1 (рецессивный)1Бит 80 кадра: CRC12 = 1 (рецессивный)180Бит 81 кадра: CRC11 = 1 (рецессивный)1Бит 82 кадра: CRC10 = 1 (рецессивный)1Бит 83 кадра: CRC9 = 1 (рецессивный)1Бит 84 кадра: вставленный бит 0 (доминантный) после пяти одинаковых0Бит 85 кадра: CRC8 = 1 (рецессивный)1Бит 86 кадра: CRC7 = 1 (рецессивный)1Бит 87 кадра: CRC6 = 0 (доминантный)0Бит 88 кадра: CRC5 = 1 (рецессивный)1Бит 89 кадра: CRC4 = 1 (рецессивный)1Бит 90 кадра: CRC3 = 1 (рецессивный)190Бит 91 кадра: CRC2 = 1 (рецессивный)1Бит 92 кадра: CRC1 = 1 (рецессивный)1Бит 93 кадра: вставленный бит 0 (доминантный) после пяти одинаковых0Бит 94 кадра: CRC0 = 1 (рецессивный)1Бит 95 кадра: разделитель CRC = 1 (рецессивный)1Бит 96 кадра: ACK = 0 (доминантный)0Бит 97 кадра: разделитель ACK = 1 (рецессивный)1Бит 98 кадра: EOF, бит 1 = 1 (рецессивный)1Бит 99 кадра: EOF, бит 2 = 1 (рецессивный)1Бит 100 кадра: EOF, бит 3 = 1 (рецессивный)1100Бит 101 кадра: EOF, бит 4 = 1 (рецессивный)1Бит 102 кадра: EOF, бит 5 = 1 (рецессивный)1Бит 103 кадра: EOF, бит 6 = 1 (рецессивный)1Бит 104 кадра: EOF, бит 7 = 1 (рецессивный)1Межкадровый интервал, бит 1: 1 (рецессивный)1Межкадровый интервал, бит 2: 1 (рецессивный)1Межкадровый интервал, бит 3: 1 (рецессивный)1
Расширенный кадр 0x14611234 с данными 00 01 02 03 из той же записи: 96 бит полей и 8 вставленных, CRC 0x3FBF.

Идентификатор 0x14611234 разбит на базовую часть 0x518 и расширение 0x11234; между ними — рецессивные SRR и IDE. В этом кадре вставленный бит снова попал на границу полей: пять нулей заканчиваются на r0, и вставка стоит перед DLC. Из-за нулевых байтов данных вставок восемь, а две последние приходятся на CRC, где подряд идут единицы.

Кадр CAN FD по битам

В кадре CAN FD те же начало и конец, что в классическом, но середина устроена иначе. В базовом формате за 11 битами идентификатора идут:

ПолеБитЗначение
RRS1доминантный: удалённых кадров в CAN FD нет
IDE1доминантный — базовый формат, рецессивный — расширенный
FDF1рецессивный — признак кадра CAN FD
res1резервный, доминантный
BRS1рецессивный — дальше скорость фазы данных
ESI1доминантный — у передатчика активное состояние ошибок, рецессивный — пассивное
DLC40–8 — столько же байтов, 9–15 — 12, 16, 20, 24, 32, 48 и 64 байта

В расширенном формате, как и в классическом, после базового идентификатора стоят рецессивные SRR и IDE и 18 бит расширения, а за ними RRS, FDF, res, BRS, ESI и DLC. Правило пяти одинаковых битов работает от SOF до последнего бита данных. Дальше начинается поле CRC с фиксированными вставленными битами: один перед полем и по одному после каждых четырёх битов, каждый — инверсия предыдущего бита. Если данные закончились пятью одинаковыми битами, обычная вставка не делается: по ISO 11898-1:2015 там стоит только фиксированный бит, и двух вставленных подряд не бывает.

Поле CRC начинается со счётчика: число вставленных битов от SOF до конца данных по модулю 8 в коде Грея и бит чётности. Затем CRC-17, если данных до 16 байт, или CRC-21 для более длинных. Регистр CRC начинает с единицы в старшем разряде, а в расчёт входят все биты от SOF до конца данных вместе со вставленными и четыре бита счётчика; фиксированные вставленные биты в расчёт не входят. Подробнее о том, зачем понадобились счётчик и новое начальное значение, — в статье о CAN FD.

Пример. Кадр с идентификатором 0x42 и байтами 00 01 … 07 с переключением скорости — тот же, что записан на шине в тестах sigrok:

  • до конца данных вставлено 10 битов, счётчик — 10 mod 8 = 2, в коде Грея 011, чётность 0; поле счётчика на шине — 0 011 0 1 вместе с фиксированными битами;
  • CRC-17 равна 0x1B77F; фиксированных вставленных битов в поле CRC шесть;
  • всего 133 бита: 27 на номинальной скорости и 106 — от ESI до разделителя CRC — на скорости фазы данных. При 500 кбит/с и 2 Мбит/с кадр длится 54 + 53 = 107 мкс.

Тот же идентификатор с 64 байтами данных 00 … 3F — 602 бита, CRC-21 0x155D3B, 341,5 мкс на тех же скоростях. Восемь классических кадров по 8 байт с такими данными заняли бы на 500 кбит/с около 2 мс. Тесты конструктора сверяют бит в бит все восемь кадров CAN FD из набора sigrok, а структуру поля CRC — с примерами из технического документа CiA.

Длина и длительность кадра

Без вставленных битов длина кадра от SOF до последнего бита EOF зависит только от формата и числа байтов данных n:

Lстанд=44+8n,Lрасш=64+8n.L_\text{станд} = 44 + 8n, \qquad L_\text{расш} = 64 + 8n.

Число вставленных битов S зависит от содержимого. Оценка сверху следует из правила: первая вставка возможна после пяти бит, каждая следующая — ещё через четыре. Если под правило попадает g + 8n бит, то

S≤⌊g+8n−14⌋,g=34 для стандартного кадра,g=54 для расширенного.S \le \left\lfloor \frac{g + 8n - 1}{4} \right\rfloor, \qquad g = 34 \text{ для стандартного кадра},\quad g = 54 \text{ для расширенного}.

Здесь g — число битов от SOF до конца CRC без данных. Вместе с тремя битами межкадрового интервала самый длинный стандартный кадр занимает 55 + 10n бит, расширенный — 80 + 10n; в таком виде формулу приводят Дэвис, Бернс, Брил и Люккин в работе о расчёте времени отклика сообщений CAN.

Байтов данныхСтандартный, битРасширенный, бит
044–5264–77
152–6272–87
260–7280–97
476–9296–117
8108–132128–157

Диапазон — от кадра без единой вставки до оценки сверху; три бита межкадрового интервала в таблицу не входят. Оценка не всегда достижима: часть битов кадра задана жёстко, а CRC нельзя выбрать. Перебор всех стандартных кадров без данных даёт не больше 6 вставок при оценке 8. Для расчёта времени доставки сообщений берут именно оценку сверху — запас здесь полезен.

Длительность кадра и наибольшая частота следования кадров при скорости шины fбит:

t=L+Sfбит,Nмакс=fбитL+S+3.t = \frac{L + S}{f_\text{бит}}, \qquad N_\text{макс} = \frac{f_\text{бит}}{L + S + 3}.

Для стандартного кадра с 8 байтами на 500 кбит/с это от 216 до 264 мкс на кадр и от 3700 до 4500 кадров в секунду. Спецификация Bosch при этом советует не загружать шину на все 100 %.

Разбор строки битов

В режиме «Разобрать биты» вставьте последовательность, считанную с логического анализатора или осциллографа: 0 — доминантный уровень, 1 — рецессивный. Рецессивные биты перед SOF пропускаются, пробелы и переносы строк не мешают. Инструмент убирает вставленные биты, раскладывает кадр по полям и проверяет то же, что проверяет приёмник:

ПроверкаЧто считается нарушением
Заполнениешестой одинаковый бит подряд между SOF и концом CRC
CRCпринятая последовательность не совпала с расчётом по принятым битам
Формадоминантный бит в разделителе CRC, разделителе ACK или в EOF
Подтверждениерецессивный слот ACK — кадр не подтвердил ни один узел
Длинастрока закончилась раньше, чем кадр

Отдельно отмечаются вещи, которые ошибкой протокола не являются, но заслуживают внимания: DLC больше 8, рецессивные резервные биты, доминантный SRR. DLC от 9 до 15 в CAN 2.0 использовать нельзя; если такой кадр всё же встретился, контроллеры классического CAN читают его как кадр с 8 байтами — так же поступает и разбор.

Место ошибки обведено на ленте, а в сообщении назван номер бита. При ошибке заполнения разбор останавливается: настоящий узел в этот момент тоже бросает приём и передаёт флаг ошибки. Шесть доминантных битов подряд посреди кадра — как раз активный флаг ошибки, выставленный каким-то узлом.

Типичные ошибки при чтении кадра с осциллографа

Перепутана полярность. На выводах RXD и TXD трансивера доминантный бит — логический ноль. На линии CAN_H тот же бит выглядит как импульс вверх, примерно с 2,5 до 3,5 В, на CAN_L — вниз, до 1,5 В. Если разбирать осциллограмму CAN_H как логический сигнал, все биты окажутся инвертированными: кадр «начнётся» с единицы, а в конце вместо семи единиц EOF будут нули. Подробнее об уровнях — в статье о шине CAN.

Вставленные биты приняты за данные. Каждая пропущенная вставка сдвигает все следующие поля на бит: начало кадра читается верно, а всё, что правее, — уже нет. Идите по сигналу слева направо и после пяти одинаковых битов вычёркивайте шестой.

Счёт серии начат заново после вставки. Вставленный бит — первый бит следующей серии. Если после вставленного нуля идут ещё четыре нуля, следующий бит тоже вставленный.

Длинная серия единиц в конце принята за сбой. Разделитель ACK, семь битов EOF и три бита межкадрового интервала — это одиннадцать рецессивных битов подряд, и вставок в них нет. Ошибка заполнения возможна только до конца CRC.

Слот ACK смотрят на выводе TXD. Там он рецессивный всегда: подтверждение ставят другие узлы. Чтобы увидеть подтверждение, смотрите шину или вывод RXD.

Мало выборок на бит. В тестах sigrok шина 125 кбит/с записана с частотой 4 МГц — 32 выборки на бит, и кадры разбираются без ошибок. Сеть 250 кбит/с там же записана с частотой 500 кГц — всего две выборки на бит. В описании тестов эта частота названа низковатой, и в записи действительно есть кадр, который не сходится по CRC.

CRC считают по 16 битам или вместе с вставками. В кадре 15 бит CRC и рецессивный разделитель за ними. Расчёт идёт по битам без вставок и заканчивается на последнем бите данных — у удалённого кадра и кадра без данных на последнем бите DLC.

В удалённом кадре ищут данные. Если RTR рецессивный, за DLC сразу следует CRC, какое бы число ни стояло в DLC.

Декодер CAN в логическом анализаторе делает всё это сам, но ему нужна правильная скорость и уровень, снятый с RXD или TXD, а не с линии. Когда декодер показывает ошибку, строка битов и конструктор помогают понять, в каком именно поле она возникла. Как настроить скорость и точку выборки самого контроллера, рассказано в разделе о битовом тайминге статьи о шине CAN.

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

Сколько бит в кадре CAN?

Стандартный кадр данных от SOF до конца EOF занимает 44 + 8n бит, расширенный — 64 + 8n, где n — число байтов данных от 0 до 8. К этому добавляются вставленные биты: в стандартном кадре с 8 байтами их может быть до 24, в расширенном — до 29. Итого стандартный кадр с 8 байтами — от 108 до 132 бит, расширенный — от 128 до 157. Между кадрами шина ещё три бита остаётся рецессивной.

Чем кадр CAN FD отличается от классического по битам?

На месте RTR стоит доминантный RRS, за IDE идут рецессивный FDF — признак CAN FD, резервный res, BRS — переключение на скорость фазы данных — и ESI. DLC 9–15 означает 12, 16, 20, 24, 32, 48 и 64 байта. Правило пяти одинаковых битов действует только до конца данных, а в поле CRC вставленные биты стоят на фиксированных местах: перед счётчиком вставок и после каждых четырёх битов. CRC — 17 или 21 бит, и в её расчёт входят вставленные биты.

Как посчитать CRC кадра CAN?

CRC-15 считается по битам от SOF до последнего бита данных без вставленных битов: полином 0x4599, начальное значение регистра ноль, биты идут в том порядке, в каком передаются. Проверить можно и байтовым калькулятором CRC: к битам стандартного кадра спереди дописывают пять нулей, тогда заголовок занимает ровно три байта, а байты данных идут следом. Для кадра 0x110 с данными 00 11 это байты 00 88 02 00 11, CRC-15/CAN от них — 0x4C12.

Где в кадре CAN не бывает вставленных битов?

В разделителе CRC, слоте ACK, разделителе ACK и поле EOF: у них фиксированная форма. Правило пяти одинаковых битов действует от SOF до последнего бита CRC включительно. Поэтому в конце каждого кадра законно идут подряд восемь рецессивных битов — разделитель ACK и семь битов EOF, а с межкадровым интервалом — одиннадцать. Если же CRC заканчивается пятью одинаковыми битами, вставленный бит стоит прямо перед разделителем CRC.

Почему осциллограф показывает ноль в слоте ACK, хотя передатчик отправляет единицу?

Передатчик выдаёт в слоте ACK рецессивный бит, а каждый приёмник, у которого сошлась CRC, в этот момент выставляет доминантный. На шине и на выводе RXD любого узла виден доминантный бит — ноль. На выводе TXD передатчика в этом месте остаётся единица. Если единица в слоте ACK видна и на шине, кадр никто не принял — например, на линии нет второго узла в рабочем режиме.

Сколько кадров в секунду проходит по шине CAN?

Скорость шины делят на длину кадра вместе с тремя битами межкадрового интервала. Стандартный кадр с 8 байтами занимает от 111 до 135 бит, поэтому на 500 кбит/с это примерно от 3700 до 4500 кадров в секунду, на 125 кбит/с — от 925 до 1125. Точное число зависит от того, сколько битов вставлено в конкретный кадр; калькулятор считает его для введённых данных и для худшего случая.

Чем удалённый кадр отличается от кадра данных?

В удалённом кадре бит RTR рецессивный и нет поля данных: за DLC сразу идёт CRC. При этом DLC не обязан быть нулём — в него записывают длину кадра данных, который запрашивается. Стандартный удалённый кадр без вставленных битов всегда занимает 44 бита, расширенный — 64. Если кадр данных и удалённый кадр с одним идентификатором начаты одновременно, арбитраж выигрывает кадр данных: его RTR доминантный.

Источники

  1. Robert Bosch GmbH. CAN Specification Version 2.0, 1991 — часть B: разд. 3.2.1 — поля кадра данных и алгоритм CRC, 3.2.2 — удалённый кадр, 3.2.5 — межкадровый интервал, 5 — когда кадр считается принятым, 6 — битстаффинг, 7 — типы ошибок и флаг ошибки
  2. R. I. Davis, A. Burns, R. J. Bril, J. J. Lukkien. Controller Area Network (CAN) schedulability analysis: Refuted, revisited and revised. Real-Time Systems, vol. 35, 2007 — разд. 2.1.3, формулы (1)–(3): наибольшая длина кадра с вставленными битами и межкадровым интервалом
  3. Linux kernel. include/linux/can/length.h — число битов в полях кадра, худший случай битстаффинга, DLC больше 8 в классическом CAN
  4. sigrok project. sigrok-test: decoder/test/can — побитовые расшифровки кадров, записанных на шине: отладочная плата Microchip MCP2515DM-BM и сеть NMEA 2000, а также восемь кадров CAN FD с идентификатором 0x42 (базовый и расширенный формат, 8 и 64 байта, с переключением скорости и без); по ним проверен конструктор
  5. Robert Bosch GmbH. CAN with Flexible Data-Rate, Specification Version 1.0, 17 April 2012 — форматы кадров CAN FD и порядок битов, коды DLC, полиномы CRC-17 и CRC-21, переключение скорости в точках выборки BRS и разделителя CRC
  6. A. Mutter (Robert Bosch GmbH). Summary of the discussion regarding the CAN FD CRC issue, CiA white paper, 21.12.2014 — разд. 6.2 — счётчик вставленных битов: по модулю 8, код Грея, бит чётности; 6.4 — начальное значение CRC «10…0»; 6.5 — порядок битов кадра ISO CAN FD; 6.6 — примеры поля CRC с фиксированными вставленными битами
  7. V. Mailhol. [PATCH v5 1/3] can: length: fix bitstuffing count. Linux kernel mailing list, 2023 — цитаты ISO 11898-1:2015, разд. 10.4.2.6 и 10.5: счётчик вставленных битов в начале поля CRC, фиксированный бит перед ним — единственный, даже если данные закончились пятью одинаковыми битами
  8. Renesas. Introduction to CAN: application note REJ05B0804-0100, Rev. 1.00, 2006 — табл. 3 — уровни CAN_H и CAN_L, разд. 6.2 и 6.3 — поля кадров и диапазон расчёта CRC, разд. 6.8 — действия передатчика и приёмника при битстаффинге
  9. Microchip. AN713: Controller Area Network (CAN) Basics, DS00713A, 1999 — ошибки CRC, формы, заполнения и подтверждения; синхронизация приёмников по перепадам

Где пригодится

Встроить калькулятор на свой сайт

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

<iframe src="https://gaw.ru/embed/can-frame/" title="Конструктор кадра CAN и CAN FD" 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-frame/">Конструктор кадра CAN и CAN FD</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>

Обновлено .

Нашли ошибку в расчёте?