0. Настройка производилась для STM32H743 при частоте работы CPU 480 МГц и частоте FDCAN 120 МГц
![Частота CPU Частота CPU](https://habrastorage.org/getpro/habr/upload_files/831/0fb/0ee/8310fb0ee35b2dc34e41dd9dbae2a397.png)
![Частота FDCAN Частота FDCAN](https://habrastorage.org/getpro/habr/upload_files/2b4/bb1/d5e/2b4bb1d5e53db58e7567100fac4b3ac3.png)
1. Для того что бы открыть настройки FDCANx есть следующий путь: "Connectivity" -> "FDCANx" -> "Activated"
![](https://habrastorage.org/getpro/habr/upload_files/ca1/653/989/ca1653989fb82b18b1f958f79e613d30.png)
2. Описание базовых настроек
-
Frame Format:
Classic Mode - будет использован идентификатор (ID) стандартного размера.
FD mode without BitRate Switching - будет использован расширенный идентификатор без изменения скорости передачи данных.
FD mode with BitRate Switching - будет использован расширенный идентификатор и разрешена разная скорость передачи для байт данных (зеленные шестиугольники) и байт информации (все остальные). (Как я понял, можно настроить скорость передачи байт данных например на скорость 100КБ/с, а всех остальных байт на 500КБ/с или наоборот).
![Картинка с логического анализатора, сделана в приложении DSView Картинка с логического анализатора, сделана в приложении DSView](https://habrastorage.org/getpro/habr/upload_files/d6c/4cd/219/d6c4cd2192f123be166b0049d79285b7.png)
-
Mode:
Normal mode - данные отправляются в шину и читаются из нее.
Restricted operation - принимаются данные из шины, могут отправляться сигналы подтверждения.
Bus monitoring mode - данные только принимаются из шины и ничего в шину не отправляется.
Internal LoopBack mode - данные не отправляются в шину, а отправляются на вход CAN (замыкание производится аппаратно, ничего самому замыкать не надо). Принимаются только отправленные нами данные, чтение из шины не производится.
External LoopBack mode - данные отправляются и в шину, и на вход CAN (замыкание производится аппаратно, ничего самому замыкать не надо). Принимаются только отправленные нами данные, чтение из шины не производится.
Я для себя сделал такую картинку, НО из Reference manual, я так и не смог до конца понять Restricted operation, поэтому картинка может быть не точной (поправьте в комментариях).
![Режимы работы Режимы работы](https://habrastorage.org/getpro/habr/upload_files/e5b/4c5/8d6/e5b4c58d6f6cbfa179efda7087208820.png)
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 - размер отправляемых сообщений в байтах.
Базовые настройки у меня получились следующие.
![](https://habrastorage.org/getpro/habr/upload_files/a50/2c5/674/a502c567445b8ac4ab41350bc79981ba.png)
3. Калибровка частоты - Disable
4. Параметры таймингов битов - здесь настраивается скорость работы FDCAN
Nominal Prescaler - предделитель входной частоты.
Nominal time quantum - длительность одного кванта.
Nominal Time Seg1(2) - количество временных квантов в битовом сегменте 1(2).
Nominal Time for one Bit - время необходимое для передачи одного бита.
Nominal Baud Rate - итоговая скорость передачи данных для FDCAN.
![](https://habrastorage.org/getpro/habr/upload_files/5c8/de5/a33/5c8de5a332e7cdf5877a90676fdcf5c6.png)
Для правильной настройки этого блока следует использовать онлайн калькулятор:
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.
![Калькулятор Калькулятор](https://habrastorage.org/getpro/habr/upload_files/17a/864/04c/17a86404c10ce1700640ec4ff773fbf2.png)
Результатом будет таблица с рекомендуемыми значениями (желтые строки - наилучшие настройки). Отсюда берем "Prescaler" -> "Nominal Prescaler",
"Seg1" -> "Nominal Time Seg1", "Seg2" -> "Nominal Time Seg2".
![Результат Результат](https://habrastorage.org/getpro/habr/upload_files/0ae/fd9/024/0aefd9024f9a5e10f528dd8826e1326f.png)
5. Включаем прерывание
У меня в прерываниях происходит чтение принимаемых данных.
![](https://habrastorage.org/getpro/habr/upload_files/ef9/336/d87/ef9336d875e3e2da4890260f57fec5b1.png)
Это все настройки FDCAN, которые я проводил в CubeMx.
Эта статья изначально была написана для внутреннего форума на предприятии, но я решил, что такая информация может быть полезна и другим. Честно признаюсь, что в статье есть прямые копирования с других статей, (где именно уже не помню), но оставлю ссылки, откуда я точно брал информацию, надеюсь их авторы на меня не обидятся:
https://www.compel.ru/lib/142251
https://istarik.ru/blog/stm32/159.html
И вообще это моя первая статья (туториал), уверен что где-то допустил ошибки, поэтому поправьте в комментариях.