Кадр классического 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
| Поле | Бит | Стандартный | Расширенный | Что передаётся |
|---|---|---|---|---|
| SOF | 1 | да | да | доминантный бит начала кадра |
| ID (ID-A) | 11 | ID10–ID0 | ID28–ID18 | идентификатор или его базовая часть, старшим битом вперёд |
| RTR | 1 | да | после ID-B | 0 — кадр данных, 1 — удалённый кадр |
| SRR | 1 | — | да | рецессивный бит на месте RTR стандартного кадра |
| IDE | 1 | 0 | 1 | признак формата: доминантный — стандартный, рецессивный — расширенный |
| ID-B | 18 | — | ID17–ID0 | расширение идентификатора |
| r1 | 1 | — | да | резервный бит, передаётся доминантным |
| r0 | 1 | да | да | резервный бит, передаётся доминантным |
| DLC | 4 | да | да | число байтов данных, 0–8 |
| DATA | 8n | да | да | данные, каждый байт старшим битом вперёд; в удалённом кадре поля нет |
| CRC | 15 | да | да | контрольная последовательность |
| DEL | 1 | да | да | разделитель CRC, рецессивный |
| ACK | 1 | да | да | слот подтверждения: передатчик выдаёт рецессивный бит, приёмники — доминантный |
| DEL | 1 | да | да | разделитель ACK, рецессивный |
| EOF | 7 | да | да | конец кадра, семь рецессивных битов |
За кадром следует межкадровый интервал (intermission) — три рецессивных бита. В кадр он не входит, но при подсчёте загрузки шины его прибавляют к каждому кадру: следующий кадр может начаться только после него.
Порядок полей в расширенном кадре выбран не случайно. SRR и IDE стоят там, где у стандартного кадра RTR и IDE, и оба рецессивные. Поэтому при одинаковых первых 11 битах идентификатора стандартный кадр выигрывает арбитраж у расширенного. Полный идентификатор расширенного кадра складывается из двух частей: базовая даёт старшие 11 бит, расширение — младшие 18.
Резервные биты передатчик обязан выдавать доминантными, а приёмник по спецификации Bosch принимает их в любом сочетании. В CAN FD на месте r0 стандартного кадра и r1 расширенного стоит рецессивный бит — признак нового формата; такие кадры конструктор не строит и не разбирает.
Спецификация Bosch CAN 2.0 запрещает идентификаторы, у которых семь старших битов рецессивные: в стандартном кадре это 0x7F0–0x7FF. Конструктор соберёт и такой кадр, но предупредит об этом.
Битстаффинг: когда вставляется бит
Приёмники CAN подстраивают свой отсчёт битов по перепадам сигнала, а длинная серия одинаковых битов перепадов не даёт. Поэтому передатчик следит за потоком: после пяти одинаковых битов подряд он вставляет один бит противоположного уровня. Приёмник делает обратное — после пяти одинаковых битов выбрасывает следующий. Если шестой бит оказался таким же, это ошибка заполнения (stuff error).
Три правила, на которых чаще всего ошибаются при ручном разборе:
- Вставленный бит участвует в счёте. Он первый в следующей серии: после вставленной единицы достаточно ещё четырёх единиц, чтобы появилась новая вставка.
- Граница действия — последний бит CRC. Правило работает от SOF до конца последовательности CRC. Разделитель CRC, слот ACK, разделитель ACK и EOF имеют фиксированную форму, вставок в них нет.
- Вставка возможна и после CRC. Если пятый одинаковый бит подряд — последний бит CRC, вставленный бит передаётся сразу за ним, перед разделителем. В записи сети NMEA 2000 из набора тестов sigrok так заканчиваются кадры с CRC 0x0120 и 0x00A0: за пятью нулями идёт вставленная единица и только потом разделитель.
В расчёт CRC вставленные биты не входят: передатчик считает CRC до вставки, приёмник — после удаления.
Как считается CRC-15
CRC кадра CAN — остаток от деления последовательности битов на полином . В шестнадцатеричной записи без старшего члена это 0x4599. В последовательность входят SOF, поле арбитража, поле управления и данные — в том порядке, в каком они передаются, и без вставленных битов.
Спецификация Bosch описывает расчёт как сдвиговый регистр из 15 бит. Перед кадром он обнуляется, а для каждого очередного бита выполняются три действия:
- Сложить по модулю 2 очередной бит и старший бит регистра.
- Сдвинуть регистр на один бит влево, в младший бит записать ноль.
- Если на первом шаге получилась единица, сложить регистр по модулю 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 бит:
| Поле | Биты | Значение |
|---|---|---|
| SOF | 0 | — |
| ID | 001 0001 0000 | 0x110 |
| RTR, IDE, r0 | 0 0 0 | кадр данных, стандартный формат |
| DLC | 0010 | 2 байта |
| DATA | 0000 0000 0001 0001 | 00 11 |
Шаг 2. CRC. Первые три бита — нули, регистр остаётся нулевым. Четвёртый бит — единица: после сдвига регистр складывается с полиномом и становится равным 0x4599. Пятый бит — ноль, но старший бит регистра уже единица, поэтому после сдвига снова выполняется сложение: 0x0B32 ⊕ 0x4599 = 0x4EAB. Дальше так же, бит за битом:
| Обработано | Бит | Регистр |
|---|---|---|
| SOF и идентификатор | 12 | 0x69B1 |
| RTR, IDE, r0 и DLC | 19 | 0x0F5E |
| первый байт данных | 27 | 0x11F4 |
| второй байт данных | 35 | 0x4C12 |
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
Получилось 64 бита. На скорости 500 кбит/с бит длится 2 мкс, кадр — 128 мкс, вместе с межкадровым интервалом — 134 мкс. Такой кадр — не учебная абстракция: именно эта последовательность записана на выводе RX контроллера MCP2515 отладочной платы Microchip MCP2515DM-BM и опубликована побитово в тестах декодера sigrok. Тесты конструктора сверяют с этими записями семь кадров, стандартных и расширенных, включая два кадра со вставкой после последнего бита CRC.
Расширенный кадр по битам
Идентификатор 0x14611234 разбит на базовую часть 0x518 и расширение 0x11234; между ними — рецессивные SRR и IDE. В этом кадре вставленный бит снова попал на границу полей: пять нулей заканчиваются на r0, и вставка стоит перед DLC. Из-за нулевых байтов данных вставок восемь, а две последние приходятся на CRC, где подряд идут единицы.
Длина и длительность кадра
Без вставленных битов длина кадра от SOF до последнего бита EOF зависит только от формата и числа байтов данных n:
Число вставленных битов S зависит от содержимого. Оценка сверху следует из правила: первая вставка возможна после пяти бит, каждая следующая — ещё через четыре. Если под правило попадает g + 8n бит, то
Здесь g — число битов от SOF до конца CRC без данных. Вместе с тремя битами межкадрового интервала самый длинный стандартный кадр занимает 55 + 10n бит, расширенный — 80 + 10n; в таком виде формулу приводят Дэвис, Бернс, Брил и Люккин в работе о расчёте времени отклика сообщений CAN.
| Байтов данных | Стандартный, бит | Расширенный, бит |
|---|---|---|
| 0 | 44–52 | 64–77 |
| 1 | 52–62 | 72–87 |
| 2 | 60–72 | 80–97 |
| 4 | 76–92 | 96–117 |
| 8 | 108–132 | 128–157 |
Диапазон — от кадра без единой вставки до оценки сверху; три бита межкадрового интервала в таблицу не входят. Оценка не всегда достижима: часть битов кадра задана жёстко, а CRC нельзя выбрать. Перебор всех стандартных кадров без данных даёт не больше 6 вставок при оценке 8. Для расчёта времени доставки сообщений берут именно оценку сверху — запас здесь полезен.
Длительность кадра и наибольшая частота следования кадров при скорости шины :
Для стандартного кадра с 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 доминантный.
Источники
- Robert Bosch GmbH. CAN Specification Version 2.0, 1991 — часть B: разд. 3.2.1 — поля кадра данных и алгоритм CRC, 3.2.2 — удалённый кадр, 3.2.5 — межкадровый интервал, 5 — когда кадр считается принятым, 6 — битстаффинг, 7 — типы ошибок и флаг ошибки
- 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): наибольшая длина кадра с вставленными битами и межкадровым интервалом
- Linux kernel. include/linux/can/length.h — число битов в полях кадра, худший случай битстаффинга, DLC больше 8 в классическом CAN
- sigrok project. sigrok-test: decoder/test/can — побитовые расшифровки кадров, записанных на шине: отладочная плата Microchip MCP2515DM-BM и сеть NMEA 2000; по ним проверен конструктор
- Renesas. Introduction to CAN: application note REJ05B0804-0100, Rev. 1.00, 2006 — табл. 3 — уровни CAN_H и CAN_L, разд. 6.2 и 6.3 — поля кадров и диапазон расчёта CRC, разд. 6.8 — действия передатчика и приёмника при битстаффинге
- 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>Обновлено . Нашли ошибку в расчёте? Напишите нам.