Пролог

Попробуем разузнать что-нибудь про CAN FD. Однако сначала вспомним как работает классический CAN. Образно выражаясь CAN - это труба для чисел. Можно метафорично сказать, что CAN - это нервная система автомобиля. Именно по САN передаются сигналы от датчиков и к исполнительным механизмам.

Физический уровень.

Физика CAN проста. Есть 2 скрученных провода с именами CAN_H и CAN_L. Скрутка позволяет преодолевать электромагнитные помехи. Классический CAN позволяет подключить до 127 устройств. По концам шины нужны терминирующие резисторы. В режиме IDLE пины подтянуты одновременно и к земле и к питанию. Поэтому там как правило 2.5V

ТТак выгладят классические пакет.

500 kBit/s
500 kBit/s

Канальный уровень

Биты образуют массив, который формирует пакет CAN. Пакет содержит идентификаторы данные и служебные биты (подтверждение, длина поля данных). CAN пакет передает массив с цифрами (пакет). В пакете самое важное это 8 байт (64 бит) полезных данных. Мы это называем сообщением. Внутри сообщения есть параметры (они же сигналы). У каждого параметра есть номер. Параметры могут быть как вдавлены друг в друга так и размазаны по битам поля данных. Максимум в одном сообщении может быть 64 параметра (сигнала) (по одному биту на параметр в предельном случае). В идеологии CAN классического запрос-ответ нет, как в modbus. Обычно ноды просто непрерывно флудят в шину и тот, кому надо выхватывает то, что ему надо.

Транспортный уровень

Для классического CAN нужен транспортный протокол. Обычно им является протокол ISO-TP

Уровень приложения

В сетях на основе CAN на уровне приложения обычно гоняют UDS или J1939.

Бинарная структура пакета CAN Classic

Бинарную структуру CAN пакета можно изучить тут

Пояснения битовых полей представлены в этой таблице.

Битовое поле

Расшифровка

bits

Пояснение

1

SOF

Start of Frame

1

сообщающий о начале фрейма и позволяющий синхронизировать узлы после фазы ожидания;

2

ID

Identifier

11

Может иметь 11- или 29-битный размер. Устройство с меньшим ID выигрывает арбитраж. Соответственно, чем меньше ID, тем выше приоритет у устройства;

3

RTR

Remote Transmission Request

1

Если устройство передает данные, то бит RTR принимает рецессивное состояние. Если устройство запрашивает сообщение от другого узла – бит RTR принимает доминантное состояние;

4

IDE

бит-указатель на расширенный ID

1

Если IDE принимает доминантное состояние – это значит, что используется стандартный 11-битный идентификатор. Если IDE принимает рецессивное состояние, то принимающий контроллер должен быть готов к приему оставшейся части расширенного 29-битного идентификатора;

5

r0

1

резервный бит

6

DLC

Data Length Code

4

4-битное поле длины данных , которое кодирует, сколько байтов данных будет передано в сообщении. В классическом CAN DLC может принимать значение в диапазоне 0…8.

7

DATA

DATA

64

В классическом CAN фрейм может содержать 0…8 байтов данных

8

CRC

CRC

15

15-битный контрольный CRC-код для переданных данных

9

CRC D

Delimiter

1

бит-ограничитель для поля CRC

10

ACK

1

бит подтверждения сообщения. В исходном фрейме передатчик использует рецессивное состояние этого бита. В свою очередь приемники при отсутствии ошибок должны установить в этом бите доминантное состояние. Другими словами, если на шине есть хотя бы один активный приемник, то в этом бите будет установлено доминантное состояние;

11

ACK D

1

бит-ограничитель (Delimiter) для ACK

12

EOF

End-of-Frame

7

7-битное поле окончания фрейма

13

IFS

Interframe Space

any

меж фреймовый интервал, необходимый для того, чтобы приемник успел поместить сообщение в буфер.

Если трансивер передатчика не увидит бит подтверждения ACK, то передатчик будет снова и снова непрерывно передавать этот же CAN пакет, до тех пор пока его кто-нибудь не примет. Таким образом, шина будет занята на 100 %. Однако некоторые микроконтроллеры всё же позволяют настроить MAC на одиночную отправку.

А это структуру пакета с расширенным идентификатором.

Недостатки CAN classic

--Слишком много метаданных. Даже при 11-битных идентификаторах и максимальной длине данных. В лучшем случае на 64 бита полезных данных приходится 47 бит служебной информации, т.е. эффективность менее 58%.

--Объем данных в кадре относительно небольшой - 8 байт. В ранних системах этого было достаточно, но сегодня объем данных значительно увеличился. Узлы должны передавать несколько кадров.

На первый взгляд кажется, что эти две проблемы можно решить, увеличив длину поля данных, но тогда шина будет постоянно перегружена, и устройства с более низким приоритетом могут оказаться недоступными. Кадр с 8 байтами данных (длина кадра 111 бит) обменивается со скоростью 250 кбит/с. Можно подсчитать, что кадр с 8 байтами данных (длина кадра 111 бит) занимает шину в течение 0,4 мс при скорости 250 кбит/с. Если размер данных составляет 64 байта (длина кадра 559 бит или более), то шина будет занята за 5,6 мс. Это означает, что за это время ни одно устройство не сможет ничего передать. Это не очень то вяжется для управления real time процессами для которых и был создан CAN.

Ограничения классического CAN были учтены при разработке его следующей версии CAN FD.

Что такое CAN FD?

Шина CAN-FD – это следующий этап развития классической шины CAN. CAN с гибкой скоростью передачи данных (CAN FD) является расширением исходного протокола шины CAN, предназначенного для предоставления более точных данных в реальном времени с увеличенной пропускной способностью для удовлетворения требований сетей транспортных средств следующего поколения.

CAN-FD обеспечивает более высокую скорость передачи данных и больший объем передаваемых данных в одном кадре.

Основные отличия CAN-FD от классической шины CAN:

--CAN-FD работает одновременно на двух скоростях. Поле арбитража или заголовок кадра передается со скоростью такой же как и в классическом варианте, например 500 кбит/с.
А поле данных передается на скорости кратно превышающую скорость передачи заголовка,
и может иметь значение вплоть до 12 Мбит/с. В CAN FD скорость обмена данными на участке передачи байт данных увеличина, между фазой арбитража, куда входит поле ID и DLC, и фазой ожидания подтверждения.

--CAN-FD может передать до 64 байт данных в одном пакете. А классический CAN максимум 8 байт. То есть пакет в 8 раз больше!

--Совместимость с сетями CAN 2.0A и CAN2.0B. CAN-FD контроллер способен принимать классические CAN пакеты, а классический CAN контроллер не способен принимать пакеты формата CAN-FD.

--Для шины CAN-FD необходимо применять специальные микросхемы-трансиверы с повышенным быстродействием, например PIC18Q84, TJA1145T/FD, TCAN4550-Q1 и прочие.

В кадр CAN-FD, в контрольное поле добавлены биты:

Битовое поле

Пояснение

FDF

признак того, что кадр есть кадр CAN-FD

BRS

признак того, что используется переключение битрейта

ESI

флаг того, что счетчик ошибок узла полон

Таким образом на шине CAN FD существуют следующие варианты передачи пакетов:

--11-битный ID, В классическом CAN формате с количеством байт данных до 8.

--11-битный ID, В формате CAN-FD с переключением скоростей и количеством байт данных до 64.

--11-битный ID, В формате CAN-FD без переключения скоростей и количеством байт данных до 64 .

--29-битный ID, В классическом CAN формате с количеством байт данных до 8.

--29-битный ID, В формате CAN-FD с переключением скоростей и количеством байт данных до 64.

--29-битный ID, В формате CAN-FD без переключения скоростей и количеством байт данных до 64 .

 Таким образом из-за различий в базовом формате кадра между CAN-FD и CAN отсутствует совместимость снизу вверх. Таким образом модуль CAN не может принимать кадры CAN-FD. При этом CAN-FD может принимать пакеты классического CAN

Структура пакета CAN FD

Для увеличения максимальной длины данных потребовалось скорректировать формат фрейма CAN FD.

Пояснение

Битовое поле

bit

1

Start-of-frame

SOF

1

2

Identifier

ID

11

3

Stuff bit

SB

1

4

Remote Request Substitution

RRS

1

5

Identifier extension bit

IDE

1

6

FD Format Indicator

FDF

1

7

Reserved bit in FD frames

res

1

8

Bit Rate Switch

BRS

1

9

Error State Indicator

ESI

1

10

Data length code

DLC

4

11

Data field

DATA

0...512

12

CRC

CRC

15

13

CRC delimiter

CRC_D

1

14

ACK slot

ACK_S

1

15

ACK delimiter

ACK_D

1

16

End-of-frame

EOF

7

17

Inter-frame spacing

IFS

4

Формат фрейма CAN FD имеет несколько важных отличий от формата фрейма классического CAN:

--после передачи ID вместо бита RTR передается бит RRS, который всегда имеет доминантное состояние. Таким образом, в CAN FD поддерживаются только фреймы данных;

--вместо зарезервированного бита R0, который всегда является доминантным в классическом CAN, передается рецессивный бит EDL (Extend Data Length), сообщающий о том, что это фрейм CAN FD;

--бит BRS (Bit Rate Switching) сообщает приемнику о переключении частоты передачи при передаче данных (подробнее о переключении частот будет рассказано далее);

--бит ESI (Error State Indicator) сообщает, что узел находится в режиме Error-active или Error-passive;

--поле DLC осталось 4-битным и кодирует длину поля данных;

--поле данных может иметь длину до 64 байт;

--защита от потери данных кодируется кодом CRC, который сопровождается полем счетчика бит-стаффинга (поле STC)

Практическая часть.

Настало время попробовать CAN-FD на практике. Надо найти какое-нибудь электронное устройство с поддержкой CAN-FD. Таким устройством является учебно-тренировочная электронная плата под названием YTM32B1M-EVB-0144 Rev.B. Вот такая в ней электронная начинка.

Что касается физики CAN, то там есть трансивер TJA1044GT/3Z. Это чисто аналоговая микросхема. Сам MAC контроллер обитает внутри SoCa YTM32B1ME05G0MLQ.

Для самой минималистической отладки CAN-FD надо на своём верстаке собрать такой комплект.

Программная часть

Все исходные коды для запуска CAN-FD присутствуют в свободно распространяемой SDK от производителя микроконтроллеров. YTM32B1ME0_1_3_1\YTM32Bx_SDK\platform\drivers\src\flexcan\flexcan_driver.c

вот буквально ключевые функции.

Имя функции

Пояснение

FLEXCAN_DRV_Init

Инициализация CAN трансивера структурой

FLEXCAN_DRV_ConfigTxMb

Настроить передатчик

FLEXCAN_DRV_ConfigRxMb

Настроить приёмник

FLEXCAN_DRV_GetTransferStatus

Для проверки завершен ли предыдущий приём пакета

FLEXCAN_DRV_Receive

Начать приём согласно конфигу в настойках приёмника

FLEXCAN_DRV_Send

Отправить CAN пакет.

По ключевому имени этих функций утилитой grep вы найдете даже пример настройки CAN-FD в папке
YTM32B1ME0_1_3_1\YTM32Bx_SDK\YCT_Demos\YTM32B1ME0\Flexcan\YCT\Flexcan_Canfd_Demo\app\main.c

Драйвер позволяет настраивать следующие основные параметры

Название параметра

Количество

вариантов

Пояснение

1

Режим работы трансивера

4

Нормальный режим, LoopBack, только слушать и проч.

2

Размер поля данных

64

Количество байт в поле данных

3

FD режим

2

4

Шина тактирования CAN трансивера

2

Кварц или PLL

5

битовая скорость стандартного CAN

Это скорость начала пакета.

6

битовая скорость для поля данных в FD режиме

Это скорость середины пакета

7

Способ сигнализирования о событиях

2

DMA или прерывания

8

и прочее

Помимо запуска самого драйвера CAN надо также настроить PIN MUX значения внутренних мультиплексоров для GPIO, чтобы подключить к пинам именно CAN периферию, а не что-либо другое.

Значения PIN MUX можно найти в спеке на микроконтроллер под названием YTM32B1ME0x Reference Manual. Искать надо по имени GPIO пина, например пин PTD2 в спеке будет находится по имени PTD_2. То есть через нижнее подчеркивание.

И так для всех остальных пинов, которые вы хотите задействовать в своём микроконтроллере. 

Как настраивать остальной ToolChain для разработки под YTM32x можно почитать в предыдущем тексте.

Отладка

Вот я запрограммировал драйвер CAN-FD, накатил прошивку, как же проверить, что CAN-FD в самом деле работает? Как водится, первым делом смотрим лог начальной загрузки (ЛНЗ).

Видно что API от SDK везде отработали отлично.

Типичная ситуация. Есть устройство с CAN. Как проверить, что оно готово к работе? Я подключился к CAN шине щупами осциллографа к проводам CAN_L и CAN_H. В режиме IDLE там будет по 2.5V на каждом пине. Разность CAN_L -CAN_H составит 0V. Когда ничего не передается на проводах CAN_H=2.3….2.5V, CAN_L=2,3….2.5V и разность напряжений 0V. Если передается бит, то возникает разность напряжений CAN_H - CAN_L и MAC контроллер CAN это интерпретирует, как сырые биты с данными.

Осциллографом можно убедиться, что битовая скорость в самом деле как и было установлено в конфиге составляет 2M Bit/s

По хорошему надо конечно же использовать переходник с USB на CAN-FD, соединить электронную плату и LapTop PC через этот переходник и при помощи специализированного DeskTop ПО на PC анализировать испускаемые гаджетом пакеты. Однако трудность в том, что у меня нет ни переходника ни специализированного ПО. В связи с этим надо как-то импровизировать. Как можно заметить, на плате заложено аж 4 порта для физики CAN трансивера. Надо как-то этим воспользоваться.

Можно просто соединить CAN порты между собой самыми обыкновенными проводами-перемычками. Вот по такому правилу.

A

B

CAN MAC

PHY ASIC

CAN MAC

PHY ASIC

CAN0

U5

CAN5

U13

CAN2

U14

CAN3

U7

CAN3

U7

CAN2

U14

CAN5

U13

CAN0

U5

Эта техника называется словом LoopBack (петля). Микроконтроллер сам отправляет и сам же принимает свои же CAN пакеты. Как говорят в народе: "клин клином вышибают". Одновременно с этим в прошивке реализована UART-CLI, где можно своими глазами увидеть через утилиту TeraTerm вот такой лог.

Как можно заметить, CAN-FD пакеты благополучно отправляются и принимаются со всех четырех доступных портов. Получился своего рода импровизированный WireShark только на MCU и с доступом через UART-CLI.

Итоги

Удалось научиться пользоваться CAN-FD на микроконтроллере YTM32. Примерно понятно, как отправлять и как принимать пакеты.

Словарь

Акроним

Расшифровка

MAC

Medium access control

CAN

Controller Area Network

CAN-FD

Controller Area Network Flexible Data-Rate

CHI

Controller Host Interface

BIU

Bus Interface Unit

PHY

physical layer

PE

Protocol Engine

Ссылки

#

Название

URL

1

CAN FD

https://en.wikipedia.org/wiki/CAN_FD

2

CAN FD

https://canhacker.ru/what-is-can-fd/

3

19 Атрибутов Хорошего Канального Протокола Передачи Данных

https://habr.com/ru/articles/682292/

4

Обзор Протокола ISO-TP [ISO 15765-2]

https://habr.com/ru/articles/798489/

5

Обзор Переходника USB-CAN (SYS TEC USB-CANmodul1)

https://habr.com/ru/articles/794310/

6

CAN bus

https://en.wikipedia.org/wiki/CAN_bus

7

Что такое CAN FD

https://trekberry.ru/can-fd

8

Что такое CAN FD

https://ru.wikipedia.org/wiki/Controller_Area_Network

9

Настройка ToolChain-нa для Разработки на Микроконтроллерах YTM32x

https://habr.com/ru/articles/875274/

 Вопросы:

--Каким переходником с USB на CAN-FD можно отлаживать интерфейс CAN-FD? Какое для этоно нужно ПО?

--Как взламывать CAN трафик в иномарках? Какой пакет CAN шины отвечает за скорость автомобиля?

--Как найти в CAN трафике легкового автомобиля пакет, который показывает количество пассажиров в автомобиле?

--Как измерить процент загрузки CAN шины трафиком в реальном времени?

Комментарии (5)


  1. ednersky
    07.02.2025 17:02

    Хорошая шина для построения устройств со слабой зависимостью между отдельными элементами.

    Каждая часть - просто транслирует в шину свой стейт, а дальше, прослушивая "эфир" шины, ты знаешь обо всём, что происходит в системе.


    1. aabzel Автор
      07.02.2025 17:02

      Да. Я лично видел как интерфейс CAN используют в автомобилях, в RFID считывателях для шахтёров, в грузовозах, в автобусах, в нано спутниках CubeSat(ах) и даже космических зондах!


  1. rsashka
    07.02.2025 17:02

    Можно метафорично сказать, что CAN - это нервная система автомобиля.

    Вот не нужно так говорить.

    CAN - это стандарт передачи данных, который применяется много где (в том числе и в автомобилях) и физическая среда передачи данных у CAN может быть не только витая пара, но и любая другая, например оптика или даже радиоканал.

    В пакете самое важное это 8 байт (64 бит) полезных данных. Мы это называем сообщением.

    Кстати, CAN сообщение может быть и без данных, но от этого оно не перестанет быть CAN сообщеним.


  1. x89377
    07.02.2025 17:02

    GD32C103CB два канала CAN-FD. Цена - копейки.
    Запускаем портированный CANact и больше ничего не надо (кроме компьютера/телефона/планшета конечно)


  1. VBKesha
    07.02.2025 17:02

    --Каким переходником с USB на CAN-FD можно отлаживать интерфейс CAN-FD? Какое для этоно нужно ПО?

    Peak Can FD

    Как взламывать CAN трафик в иномарках? Какой пакет CAN шины отвечает за скорость автомобиля?

    Захватываем трафик анализируем долго думаем. Тем более обычно есть два способа, из порта ODB, и напрямую с шины которая может её в RAW передавать. Надо только знать что она может передаваться и в оборотах колеса в минуту.

    Как найти в CAN трафике легкового автомобиля пакет, который показывает количество пассажиров в автомобиле?

    Также как и скорость хватаем травик, садимся встаем, повторяем много раз ищём где. Ну или расковыриваем какой нибудь ODIS и смотрим откуда он вычитывает.

    Как измерить процент загрузки CAN шины трафиком в реальном времени?

    Peak Can FD показывает и график рисует.