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

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

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

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

Режим
Формат кадра
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
  • начало кадра
  • поле арбитража
  • поле управления
  • данные
  • CRC-15
  • фиксированная форма, без вставок
  • вставленный бит (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 рецессивных бита.

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

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

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

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

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

Поля кадра 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 расширенного стоит рецессивный бит — признак нового формата; такие кадры конструктор не строит и не разбирает.

Спецификация 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+1x^{15} + x^{14} + x^{10} + x^8 + x^7 + x^4 + x^3 + 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, где подряд идут единицы.

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

Без вставленных битов длина кадра от 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битf_\text{бит}:

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. Между кадрами шина ещё три бита остаётся рецессивной.

Как посчитать 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; по ним проверен конструктор
  5. Renesas. Introduction to CAN: application note REJ05B0804-0100, Rev. 1.00, 2006 — табл. 3 — уровни CAN_H и CAN_L, разд. 6.2 и 6.3 — поля кадров и диапазон расчёта CRC, разд. 6.8 — действия передатчика и приёмника при битстаффинге
  6. Microchip. AN713: Controller Area Network (CAN) Basics, DS00713A, 1999 — ошибки CRC, формы, заполнения и подтверждения; синхронизация приёмников по перепадам
Встроить калькулятор на свой сайт

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

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

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