Embedded HandbookПриложения
Все разделы › III. Периферия
STM32G474, STM32G431 · уровень средний · 9 мин чтения
Открыть в интерактивном справочнике

19а. CAN FD на FDCAN: 64 байта, две скорости, память сообщений

Классический CAN из раздела 19 передаёт не больше 8 байт за кадр и не быстрее 1 Мбит/с. CAN FD снимает оба ограничения: до 64 байт в кадре и вторая, быстрая скорость на время передачи данных. Арбитраж (кто главнее на шине) идёт на прежней медленной скорости — поэтому провода и трансиверы остаются почти теми же.

У STM32 новой серии (G4, H7, L5, U5) вместо bxCAN стоит модуль FDCAN. Раздел — о нём на примере G4: коды длины, две скорости и как их считать, компенсация задержки трансивера, память сообщений и режимы работы.

Описание модуля — по справочному руководству на G4, раскладка памяти сверена ещё и с константами драйвера HAL из того же пакета. Всё, что считается, посчитано программой _verify/can19a/canfd.c (gcc на компьютере). Сверяет _verify/can19a_check.py.

Как это называется в документации

Оригинал Перевод
FDF (FD format) признак кадра CAN FD
BRS (bit rate switch) переключение скорости внутри кадра
ESI (error state indicator) признак «передатчик в пассивной ошибке»
nominal / data bit timing битовый интервал фазы арбитража и фазы данных
time quantum (tq) квант времени
sample point точка выборки
transmitter delay compensation (TDC), secondary sample point (SSP) компенсация задержки и вторая точка выборки
message RAM память сообщений
restricted operation mode ограниченный режим: только приём и подтверждение

19а.1 Что изменилось в кадре

DLC 0…8 9 10 11 12 13 14 15
байт 0…8 12 16 20 24 32 48 64

Произвольную длину не передать: 9 байт уйдут кадром на 12 (DLC 9), 33 байта — на 48 (DLC 14), лишнее дополняют. Программа подбирает наименьший подходящий код:

Нужно байт DLC Уйдёт Лишних
9 9 12 3
13 10 16 3
33 14 48 15
49 15 64 15

Включают CAN FD битом FDOE, переключение скорости — BRSE (оба в CCCR, менять — только при INIT = 1 и CCE = 1). Классические кадры модуль принимает и передаёт всегда.

Эти биты только разрешают. Каким уйдёт кадр, решает заголовок элемента передачи: биты FDF (кадр FD) и BRS (быстрая фаза) во втором слове, рядом с DLC. В HAL это поля заголовка FDFormat = FDCAN_FD_CAN и BitRateSwitch = FDCAN_BRS_ON. Забыли — и при FDOE = 1 уходит классический кадр, не длиннее 8 байт.


19а.2 Две скорости: как считать

Битовый интервал — целое число квантов: 1 квант синхронизации + сегмент до точки выборки + сегмент после. Для фазы арбитража — поля регистра NBTP, для фазы данных — DBTP; каждое хранится «минус один»:

Поле Диапазон в регистре Смысл
NBRP / DBRP 0…511 / 0…31 делитель частоты ядра CAN → квант
NTSEG1 / DTSEG1 0…255 / 0…31 до точки выборки
NTSEG2 / DTSEG2 0…127 / 0…15 после точки выборки
NSJW / DSJW 0…127 / 0…15 предел подстройки; DSJW меньше DTSEG2

Бит арбитража 500 кбит/с и четыре бита данных 2 Мбит/с в одном масштабе: кванты и точки выборки

Программа ищет делители для частоты ядра CAN 80 МГц и точки выборки 80 %:

Фаза Скорость Делитель Квантов в бите До точки После Точка В регистр
арбитраж 500 кбит/с 1 160 127 32 80 % NBRP 0, NTSEG1 126, NTSEG2 31
данные 2 Мбит/с 1 40 31 8 80 % DBRP 0, DTSEG1 30, DTSEG2 7
данные 5 Мбит/с 1 16 12 3 81,2 % —
данные 8 Мбит/с 1 10 7 2 80 % —

Бит не может быть короче 4 квантов; пример руководства — ядро 20 МГц и бит из 4 квантов дают 5 Мбит/с в фазе данных. Чем быстрее ядро CAN, тем больше квантов на бит и тем точнее ставится точка выборки.

Откуда взять 80 МГц. Такт ядра CAN у G4 выбирают полем FDCANSEL в RCC_CCIPR: кварц HSE (так после сброса), выход Q ФАПЧ или PCLK1; дальше его делит общий для всех модулей делитель в FDCAN_CKDIV. Выход Q даёт 80 МГц при SYSCLK 160 МГц: ФАПЧ на 320 МГц, делители R = 2 и Q = 4. При 170 МГц ФАПЧ работает на 340 МГц, и выход Q даёт 85 МГц: на 2 Мбит/с это 42,5 кванта, нацело не делится. Тогда берут PCLK1 = 170 МГц — делитель 5 и 17 квантов на бит. Источник в любом случае — кварц: частота внутреннего HSI16 уходит по температуре на 1…2 %, а узлам CAN FD на мегабитах допустимо расходиться лишь на десятые доли процента.

Подвох в документации. В общем описании главы сегменты названы «от 1 до 16» и «от 1 до 8 квантов» — так было у старого bxCAN. Поля регистров FDCAN шире (до 256 и 128 в фазе арбитража); считать по описанию полей.

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


19а.3 Задержка трансивера

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

Компенсация (TDC) включается битом TDC в DBTP. Модуль сам измеряет задержку на каждом кадре FD — от спада между FDF и res до того же спада на входе RX — и сравнивает биты во второй точке выборки: измеренная задержка плюс смещение TDCO. Его обычно ставят равным положению точки выборки фазы данных в тактах ядра CAN: при 80 МГц и 2 Мбит/с — около 32 тактов, 80 % бита. Ограничения:

Компенсация задержки на 5 Мбит/с: RX запаздывает на 175 нс, обычная точка выборки 162,5 нс видит прежний бит, вторая точка 175 + 100 = 275 нс приходится на середину вернувшегося

В фазе арбитража компенсация всегда выключена — там задержку покрывает длинный бит.


19а.4 Память сообщений

Память сообщений FDCAN на G4: шесть разделов, 212 слов на модуль, три модуля подряд

Кадры FDCAN хранит не в регистрах, а в отдельной памяти сообщений. На G4 её раскладка фиксирована: до 212 слов по 32 бита на модуль, и разделы всегда одни и те же. Программа посчитала их по размерам элементов:

Раздел Элементов Слов на элемент Начало
фильтры 11-битных идентификаторов 28 1 0x000
фильтры 29-битных 8 2 0x070
Rx FIFO 0 3 18 0x0B0
Rx FIFO 1 3 18 0x188
события передачи 3 2 0x260
буферы передачи 3 18 0x278
всего 0x350 = 848 байт = 212 слов

Элемент приёма и передачи — 18 слов: 2 слова заголовка (идентификатор, DLC, флаги, метка времени) и 16 слов = 64 байта данных — место под самый длинный кадр есть всегда.

Модули идут подряд: FDCAN1 с 0x000, FDCAN2 с 0x350, FDCAN3 с 0x6A0 от начала общей области. Так считает и драйвер HAL: адрес модуля — база плюс 0x350 × номер. В примере руководства для двух модулей второй начинается с 0x0354 — на слово дальше; работающему коду тут стоит верить больше, чем примеру.

Три элемента на FIFO — мало. Прошивка должна забирать кадры быстро (в прерывании), иначе FIFO переполнится. Что тогда — выбирают битами F0OM и F1OM в RXGFC: блокировка (по умолчанию — новые кадры теряются) или перезапись (новые затирают старые).


19а.5 Режимы, которые пригодятся

Режим Как включить Зачем
ограниченный (Restricted) CCCR.ASM только принимать и подтверждать; подбор скорости сети — пробовать скорости, пока не придёт правильный кадр
наблюдение (Bus monitoring) CCCR.MON слушать шину, ничего на неё не выдавая: анализатор
внешняя петля TEST.LBCK свои кадры принимаются обратно; на выводе TX их видно
внутренняя петля TEST.LBCK + CCCR.MON самопроверка без влияния на работающую шину
без повторов (DAR) CCCR.DAR кадр не передаётся повторно после проигрыша арбитража или ошибки

Для режимов проверки сначала CCCR.TEST = 1. Ограниченный режим включается и сам, если модуль не успел прочитать кадр из памяти сообщений вовремя, — выйти из него можно, только сбросив ASM.

Метка времени — 16-битный счётчик в битах CAN (делитель 1…16); захватывается в начале каждого принятого и переданного кадра.


19а.6 Классические и FD-узлы на одной шине

Узел, который CAN FD не понимает (или у которого он выключен), принимая кадр FD, выдаёт кадр ошибки — и рушит его. Поэтому смешивать нельзя. Руководство описывает, как сети переходят на FD:


19а.7 Грабли

Узел выдаёт ошибки на каждый кадр FD. У него FDOE = 0 или он классический — он и должен рушить такие кадры.

FD включён, а уходят классические кадры по 8 байт. В заголовке передачи не выставлены FDF и BRS (FDFormat, BitRateSwitch в HAL): FDOE и BRSE только разрешают.

Скорость данных «не берётся» на 5 Мбит/с. Не включена компенсация задержки трансивера — сравнение бита приходится на задержку.

Точка выборки «гуляет». Частота ядра CAN такая, что на бит приходится мало квантов: при 80 МГц на 8 Мбит/с — всего 10.

Настройки битового интервала не записываются. NBTP и DBTP пишутся только при INIT = 1 и CCE = 1.

Отправили 9 байт — приняли 12. Длина кадра FD — только из ряда 12, 16, 20, 24, 32, 48, 64. Длину полезных данных передают сами данные.

Кадры теряются. В каждом Rx FIFO только 3 элемента.

Второй FDCAN «портит» кадры первого. Адрес его памяти посчитан вручную с ошибкой — FDCAN2 начинается с 0x350, а не с 0x354.

Вышел в ограниченный режим и «молчит». Не успел прочитать память сообщений; выход — сбросить ASM.


19а.8 Итоги

Дальше: раздел 19б «CANopen: словарь объектов, NMT, PDO и SDO».

Открыть в интерактивном справочнике