0. Настройка производилась для STM32H743 при частоте работы CPU 480 МГц и частоте FDCAN 120 МГц
1. Для того что бы открыть настройки FDCANx есть следующий путь: "Connectivity" -> "FDCANx" -> "Activated"
2. Описание базовых настроек
-
Frame Format:
Classic Mode - будет использован идентификатор (ID) стандартного размера.
FD mode without BitRate Switching - будет использован расширенный идентификатор без изменения скорости передачи данных.
FD mode with BitRate Switching - будет использован расширенный идентификатор и разрешена разная скорость передачи для байт данных (зеленные шестиугольники) и байт информации (все остальные). (Как я понял, можно настроить скорость передачи байт данных например на скорость 100КБ/с, а всех остальных байт на 500КБ/с или наоборот).
-
Mode:
Normal mode - данные отправляются в шину и читаются из нее.
Restricted operation - принимаются данные из шины, могут отправляться сигналы подтверждения.
Bus monitoring mode - данные только принимаются из шины и ничего в шину не отправляется.
Internal LoopBack mode - данные не отправляются в шину, а отправляются на вход CAN (замыкание производится аппаратно, ничего самому замыкать не надо). Принимаются только отправленные нами данные, чтение из шины не производится.
External LoopBack mode - данные отправляются и в шину, и на вход CAN (замыкание производится аппаратно, ничего самому замыкать не надо). Принимаются только отправленные нами данные, чтение из шины не производится.
Я для себя сделал такую картинку, НО из Reference manual, я так и не смог до конца понять Restricted operation, поэтому картинка может быть не точной (поправьте в комментариях).
Auto Retransmission - разрешает или запрещает повторную отправку сообщений.
Transmit Pause - дополнительная пауза при передаче. Такая пауза необходима для того чтобы дать другим передатчикам доступ к шине в случае, если их приоритет мал.
Protocol Exception - разрешение события Protocol Exception. При нормальной работе за битом FDF должен следовать резервный доминантный (LOW) бит (res). Данное событие генерируется в случаях, когда резервный бит имеет рецессивное значение (HIGH).
Nominal Sync Jump Width - количество временных квантов расширения, определяет допустимое расширение границ битовых сегментов "Nominal Time Seg1(2)".
Data Prescaler - делитель для настройки частоты передачи байт данных (зеленых шестиугольников).
Имеет значение только при Frame Format - FD mode with BitRate SwitchingData Sync Jump Width - количество временных квантов расширения, определяет допустимое расширение границ битовых сегментов "Data Time Seg1(2)"
Имеет значение только при Frame Format - FD mode with BitRate SwitchingData Time Seg1 / Seg2 - количество временных квантов в битовом сегменте 1 / 2
Имеет значение только при Frame Format - FD mode with BitRate SwitchingMassage Ram Offset - Указывает стартовый адрес RAM сообщения.
Std Filters Nbr - разрешенное количество фильтров со стандартным идентификатором.
Ext Filters Nbr - разрешенное количество фильтров с расширенным идентификатором.
Rx Fifo0/1 Elmts Nbr - число входных элементов FIFO0/1 (Место куда сохраняются принятые данные).
Rx Fifo0/1 Elmts Size - размер в байтах входных элементов FIFO0/1.
Rx Buffers Nbr - число входных буферов (Место куда сохраняются принятые данные).
Rx Buffer Size - размер в байтах входных буферов RxBuffer.
Tx Events Nbr - ??? (Сам так и не разобрался, думаю в комментариях подскажут).
Tx Buffers Nbr - число буферов для отправляемых сообщений.
Tx Fifo Queue Elmts Nbr - размер очереди в которой хранятся сообщения готовые к отправке.
-
Tx Fifo Queue Mode - режим работы передающего буфера:
Fifo Mode - Fifo буфер.
Queue Mode - режим очереди.
-
Tx Elmt Size - размер отправляемых сообщений в байтах.
Базовые настройки у меня получились следующие.
3. Калибровка частоты - Disable
4. Параметры таймингов битов - здесь настраивается скорость работы FDCAN
Nominal Prescaler - предделитель входной частоты.
Nominal time quantum - длительность одного кванта.
Nominal Time Seg1(2) - количество временных квантов в битовом сегменте 1(2).
Nominal Time for one Bit - время необходимое для передачи одного бита.
Nominal Baud Rate - итоговая скорость передачи данных для FDCAN.
Для правильной настройки этого блока следует использовать онлайн калькулятор:
http://bittiming.can-wiki.info/
Выбираем ST Microelectronics bxCAN, в Clock Rate указываем входную частоту FDCAN, Sample Point - это точка в которой происходит "захват" бита (у меня это 75%, часто используется 87.5), SJW это "Nominal Sync Jump Width", это значение от 1 до 4 на которое может аппаратно увеличиваться или уменьшаться длительность сегментов Seg1/2 для лучшего захвата бита. Последняя ячейка это скорость на которую мы настраиваем FDCAN.
Результатом будет таблица с рекомендуемыми значениями (желтые строки - наилучшие настройки). Отсюда берем "Prescaler" -> "Nominal Prescaler",
"Seg1" -> "Nominal Time Seg1", "Seg2" -> "Nominal Time Seg2".
5. Включаем прерывание
У меня в прерываниях происходит чтение принимаемых данных.
Это все настройки FDCAN, которые я проводил в CubeMx.
Эта статья изначально была написана для внутреннего форума на предприятии, но я решил, что такая информация может быть полезна и другим. Честно признаюсь, что в статье есть прямые копирования с других статей, (где именно уже не помню), но оставлю ссылки, откуда я точно брал информацию, надеюсь их авторы на меня не обидятся:
https://www.compel.ru/lib/142251
https://istarik.ru/blog/stm32/159.html
И вообще это моя первая статья (туториал), уверен что где-то допустил ошибки, поэтому поправьте в комментариях.