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 Что изменилось в кадре
- Бит, который в классическом кадре был резервным, стал FDF: рецессивный — кадр CAN FD, доминантный — классический.
- За ним res и BRS: при BRS рецессивном скорость внутри кадра переключается на быструю.
- ESI — передатчик сообщает, не в пассивном ли он состоянии ошибок.
- DLC 0…8 значит то же, что раньше; коды 9…15 — длины сверх 8:
| 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 |
Программа ищет делители для частоты ядра 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 % бита. Ограничения:
- задержка плюс
TDCO— меньше 6 битов фазы данных; - и не больше 127 минимальных квантов (тактов ядра CAN); больше — берётся 127;
TDCFзадаёт окно, которое не даёт короткой помехе оборвать измерение раньше времени.
В фазе арбитража компенсация всегда выключена — там задержку покрывает длинный бит.
19а.4 Память сообщений
Кадры 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:
- при старте все узлы говорят классическим CAN, пока не убедятся, что 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 Итоги
- CAN FD: до 64 байт; FDF — признак кадра, BRS — переключение скорости, ESI — пассивная ошибка передатчика. DLC 9…15 → 12, 16, 20, 24, 32, 48, 64.
- Две скорости — два набора полей (
NBTP,DBTP), каждое «минус один». При 80 МГц: 500 кбит/с — 160 квантов, 2 Мбит/с — 40, точка выборки 80 %. - Бит — не меньше 4 квантов: 20 МГц → до 5 Мбит/с.
- Быстрая фаза данных требует компенсации задержки трансивера (
TDC,TDCO). - Память сообщений G4: 212 слов на модуль, раскладка фиксирована; модули — с 0x000, 0x350, 0x6A0.
- Узлы без FD на той же шине рушат кадры FD.
Дальше: раздел 19б «CANopen: словарь объектов, NMT, PDO и SDO».