В этом руководстве объясняется, как использовать STM32 FDCAN в обычном режиме, с акцентом на конфигурацию оперативной памяти сообщений и настройку фильтра. Если в предыдущем руководстве рассматривался режим обратной связи, то здесь мы настроим два периферийных устройства FDCAN на STM32H7 для взаимодействия друг с другом. Разработчики часто ищут примеры использования stm32 fdcan, hal_fdcan_addmessagetotxfifoq или конфигурацию фильтра fdcan, поэтому мы рассмотрим их с примерами кода.
|
Вы также узнаете о функциях обратного вызова HAL_FDCAN_ActivateNotificationFDCAN HAL_FDCAN_GetRxMessageи FIFO. К концу курса вы будете готовы реализовать надежную связь FDCAN в своих проектах на базе STM32. Как вы уже знаете, для использования обычного режима нам нужно как минимум 2 устройства FDCAN. У меня нет другого устройства FDCAN, но есть мой STM32H7. На плате установлены 2 периферийных устройства FDCAN. Поэтому я собираюсь обеспечить связь между этими двумя устройствами FDCAN. Это подводит нас к очень важному параметру в конфигурации FDCAN — оперативной памяти сообщений . При использовании более одного периферийного устройства FDCAN необходимо назначить оперативную память сообщений каждому периферийному устройству. Это новый параметр, который мы рассмотрим в этом руководстве, в то время как базовая конфигурация останется такой же, как и в режиме обратной связи FDCAN . |
Вы также узнаете о функциях обратного вызова HAL_FDCAN_ActivateNotificationFDCAN HAL_FDCAN_GetRxMessageи FIFO. К концу курса вы будете готовы реализовать надежную связь FDCAN в своих проектах на базе STM32.
Как вы уже знаете, для использования обычного режима нам нужно как минимум 2 устройства FDCAN. У меня нет другого устройства FDCAN, но есть мой STM32H7. На плате установлены 2 периферийных устройства FDCAN. Поэтому я собираюсь обеспечить связь между этими двумя устройствами FDCAN.
Это подводит нас к очень важному параметру в конфигурации FDCAN — оперативной памяти сообщений . При использовании более одного периферийного устройства FDCAN необходимо назначить оперативную память сообщений каждому периферийному устройству. Это новый параметр, который мы рассмотрим в этом руководстве, в то время как базовая конфигурация останется такой же, как и в режиме обратной связи FDCAN .
Видеоурок по работе с STM32 FDCAN в обычном режиме
Хотя данное письменное руководство описывает полную настройку, конфигурацию и код для FDCAN в обычном режиме, демонстрация в реальном времени часто значительно упрощает понимание процесса. Именно поэтому я также подготовил подробный видеоурок, который шаг за шагом покажет вам всю реализацию. Используйте письменные инструкции вместе с видео, чтобы лучше понять материал и заметить важные детали, которые легче увидеть в реальном времени.Введение в технологию FDCAN в STM32
Что такое FDCAN и зачем его использовать?
FDCAN, или Flexible Data-Rate Controller Area Network , — это протокол связи, позволяющий микроконтроллерам быстро и надежно обмениваться данными друг с другом. В отличие от стандартного CAN, FDCAN поддерживает более высокие скорости передачи данных и гибкие размеры сообщений. Микроконтроллеры STM32 используют FDCAN для подключения к датчикам, двигателям и другим устройствам в автомобильной, промышленной и робототехнической отраслях. FDCAN используется, когда необходима быстрая, стабильная и безошибочная связь между несколькими устройствами.
Основные особенности FDCAN в микроконтроллерах STM32
Микроконтроллеры STM32 оснащены встроенным контроллером FDCAN , что упрощает настройку и обмен данными. К основным особенностям относятся:
- Гибкая скорость передачи данных: поддерживает как стандартную, так и высокую скорость передачи данных.
- Обнаружение ошибок: Встроенная проверка ошибок обеспечивает надежность связи.
- Обработка нескольких объектов сообщений: позволяет обрабатывать множество сообщений одновременно.
- Низкая задержка: быстрая передача данных с минимальной задержкой.
- Параметры фильтрации: Позволяет получать только необходимые сообщения.
Эти особенности делают STM32 FDCAN идеальным решением для обмена данными в реальном времени в сложных системах .
Понимание нормального режима в FDCAN
Разница между обычным режимом и другими режимами
FDCAN поддерживает несколько режимов работы, каждый из которых предназначен для определенной цели. Нормальный режим — это стандартный режим, в котором узел активно участвует в сети: он может отправлять и получать сообщения, подтверждать получение кадров и обнаруживать ошибки.
К другим режимам относятся:
- Режим обратной связи: узел проверяет только собственную передачу, не отправляя данные по шине.
- Бесшумный режим: узел прослушивает сообщения, но не передает и не подтверждает их получение.
- Ограниченный режим: сочетает в себе такие функции, как бесшумная и ограниченная связь для диагностики.
В отличие от этих специальных режимов, обычный режим обеспечивает полноценную связь , что делает его пригодным для работы сети в режиме реального времени.
Когда использовать обычный режим FDCAN?
Используйте обычный режим , если ваш STM32 является частью активной сети CAN или CAN-FD и ему необходимо:
- Передавайте сообщения другим узлам.
- Получайте сообщения от датчиков, контроллеров или исполнительных механизмов.
- Выявлять и сообщать об ошибках в шине.
Нормальный режим — это режим работы по умолчанию для большинства реальных приложений, требующих непрерывной связи.
Структура кадра FDCAN
Ниже приведена иллюстрация, демонстрирующая структуру кадра FDCAN :
Понимание структуры FDCAN-фрейма
Структура FDCAN разделена на три основных этапа:
- Первый этап арбитражного разбирательства.
На этом этапе определяется содержание сообщения и его цель:- Начало кадра (SOF): обозначает начало сообщения.
- Биты ID и управления: указывают идентификатор сообщения, тип данных (отправляются или запрашиваются), а также тип протокола (CAN или CAN-FD) и конфигурацию скорости.
- Этап передачи данных.
Здесь отправляется фактическая информация:- Код длины данных (DLC): показывает, сколько байтов данных включено в данные.
- Данные: Фактическое содержимое сообщения, которое вы хотите передать.
- Циклическая избыточная проверка (CRC): проверяет целостность данных.
- Доминирующий бит: Сигналы управляют правильной синхронизацией и временем.
- Второй этап арбитража.
На этом этапе подтверждается успешная доставка сообщения:- Подтверждение получения (ACK): отправляется получателями для подтверждения получения сообщения.
- Конец кадра (EOF): обозначает конец сообщения.
В течение межкадрового промежутка (IFS) передача данных не осуществляется. Эта пауза отделяет один кадр от следующего.
Архитектура фрейма: CAN 2.0 против CAN-FD
Давайте сравним, чем отличаются кадры CAN 2.0 и CAN-FD :
- Тип рамы:
- В стандарте CAN 2.0 бит RTR используется для обозначения кадра данных (доминирующий) или удаленного кадра (рецессивный).
- В протоколе CAN-FD всегда используется основной зарезервированный бит (RRS), поскольку он поддерживает только кадры данных.
- Новые управляющие биты в CAN-FD:
- EDL (Extended Data Length): Рецессивный бит, указывающий на кадр CAN-FD; в CAN 2.0 этот бит называется R0.
- BRS (Bit Rate Switching): указывает, используется ли более высокая скорость передачи данных на этапе передачи.
- ESI (индикатор состояния ошибки): показывает, находится ли узел в активном или пассивном состоянии ошибки.
Основные различия между CAN-FD и CAN 2.0
Вот наглядное представление основных различий:
- CAN-FD поддерживает более крупные полезные нагрузки и более высокую скорость передачи данных .
- Он имеет дополнительные управляющие биты для обеспечения гибкости, обнаружения ошибок и скорости переключения .
- CAN 2.0 проще, он поддерживает только фиксированную длину данных и одну скорость передачи битов.
Аппаратное подключение для связи FDCAN (проводка CANH и CANL)
Как уже упоминалось ранее, я буду использовать оба периферийных устройства FDCAN на одной и той же плате STM32 . Поскольку плата уже имеет два встроенных трансивера , все, что нам нужно сделать, это соединить CANH с CANH и CANL с CANL .
Ниже приведено изображение, демонстрирующее точное расположение соединений:
https://controllerstech.com/wp-content/uploads/2022/09/fdcan2_1-300x223.avif 300w" alt="Соединение STM32 FDCAN между двумя экземплярами" width="934" height="694" decoding="async" />
Конфигурация STM32CubeMX для FDCAN
Конфигурация тактовой частоты STM32
Начнём с настройки часов.
В этом руководстве я выбираю внутреннюю тактовую частоту 64 МГц . Причина этого будет объяснена чуть позже. Также обратите внимание, что тактовая частота FDCAN составляет 50 МГц . Она будет использоваться в последующей части руководства.
Включить STM32 FDCAN
Теперь включите периферийные устройства FDCAN для процессора Cortex M7.
Здесь я включил FDCAN1 и FDCAN2 для Cortex M7. Обратите внимание, что контакты PH13 — это контакт TX, а PH14 — контакт RX в FDCAN1, и аналогично, PB5 и PB13 — это контакты, используемые для FDCAN2.
Используемый мной контроллер, STM32H745 Discovery , имеет встроенный CAN-трансивер . Трансивер MCP2562FDT подключается к выводам PH13 (CANH) и PH14 (CANL) . На плате предусмотрены специальные разъемы для CANH и CANL , как показано на изображении ниже:
Общая конфигурация STM32 FDCAN
Сначала рассмотрим общую конфигурацию для FDCAN1 и FDCAN2. Эта часть включает в себя ширину скачка синхронизации, делитель частоты, временной сегмент и т. д. Для достижения одинаковой частоты дискретизации платы оба периферийных устройства должны быть настроены аналогичным образом.
На изображении ниже показаны настройки параметров CAN-FD.
Для расчета этого набора параметров нам потребуется использовать внешний калькулятор , который можно найти по адресу https://www.kvaser.com/support/calculators/can-fd-bit-timing-calculator/
Первые 3 параметра, которые нам необходимо ввести, это частота тактового сигнала FDCAN, допуск входного тактового сигнала и задержка приемопередающего узла.
- Тактовая частота FDCAN составляет 50 МГц , и мы уже рассматривали это в разделе настройки тактовой частоты .
- Далее следует допуск тактовой частоты . В начале я упоминал, что в этом руководстве использую внутреннюю тактовую частоту, потому что так проще определить допуск тактовой частоты для входного сигнала. Изображение ниже взято из технической документации STM32H745 и показывает характеристики генератора HSI.
- Наконец, у нас есть задержка узла или задержка распространения. Ее можно найти в характеристиках переменного тока используемого вами трансивера. На изображении ниже показана та же характеристика для MCP2562FD , трансивера CAN-FD, используемого в микроконтроллере STM32H7 Discovery.
Далее нам нужно ввести битрейт , который мы хотим установить для CAN-FD. Как я уже упоминал, FDCAN может передавать поле арбитража и поле данных с разным битрейтом. Но я хочу использовать один и тот же битрейт для обоих, а именно 500 Кбит/с. После ввода битрейта нажмите «Пересчитать», чтобы вычислить значения.
После нажатия кнопки «Пересчитать» мы получим значения параметров. Это показано на рисунке ниже.
Эти значения можно ввести в параметры FDCAN. Следует использовать одни и те же значения в обоих экземплярах FDCAN.
Теперь рассмотрим остальные параметры. Стрелками отмечены параметры, которые были изменены.
- На изображении выше смещение оперативной памяти в сообщении установлено на 0. Это используется в нескольких экземплярах FDCAN и будет рассмотрено позже в этом руководстве.
- Std Filters Nbr— это количество используемых нами стандартных (ID) фильтров.
- Мы можем использовать до 128 различных фильтров, настроенных для приема или отклонения сообщений с разными идентификаторами.
- Я использую только один фильтр.
- Ext Filters NbrЗначение установлено на 0, поскольку в этом руководстве мы не используем расширенные идентификаторы.
- Для приема сообщения мы будем использовать RX FIFO 0. Всего мы можем использовать до 64 элементов FIFO, и каждый элемент может хранить до 64 байт данных.
- Здесь я использую всего один элемент для приема 12 байт данных.
- Я не использую буферы приема и передачи, поэтому все эти параметры установлены на 0.
- Блок TX Fifo будет использоваться для отправки данных на шину CAN. Таким образом, здесь я использую один элемент блока TX Fifo для отправки 12 байт данных.
Индивидуальные конфигурации STM32 FDCAN
До сих пор мы рассматривали общую конфигурацию, необходимую для обоих экземпляров. Поскольку мы хотим, чтобы оба экземпляра работали как два отдельных устройства, нам нужно настроить их по отдельности.
Ниже приведены конфигурации для FDCAN1 и FDCAN2.
Помимо оперативной памяти для сообщений, вы можете заметить еще одно изменение: я использую RX Fifo 0 для FDCAN1 и RX Fifo 1 для FDCAN2. Это связано с тем, что оба Fifo доступны, и я хочу написать для них совершенно разные коды.
Обратите внимание, что смещение в оперативной памяти сообщения для FDCAN1 равно 0, а для FDCAN2 — 11 слов.
Почему разделение оперативной памяти на разделы имеет значение в STM32 FDCAN?
При использовании более одного периферийного устройства STM32 FDCAN крайне важно правильно распределить память сообщений .
- STM32H7 предоставляет 2560 слов (~10 КБ) оперативной памяти для сообщений.
- Необходимо выделить смещения для каждого экземпляра FDCAN (например, FDCAN1 — по смещению 0, FDCAN2 — по смещению 11 слов).
- Каждый фильтр, буфер приема (RX FIFO) и буфер передачи (TX buffer) потребляют память сообщения в зависимости от длины данных.
Согласно примечанию к применению AN5348 , размер оперативной памяти сообщений FDCAN составляет 2560 слов , что эквивалентно 10 КБ. Эта оперативная память предназначена для хранения различных фильтров, буферов приема/FIFO, буферов передачи и т. д.
Понимание структуры оперативной памяти сообщений FDCAN
Если используется более одного экземпляра FDCAN, необходимо тщательно разбить оперативную память на разделы таким образом, чтобы общий размер этих разделов не превышал объем оперативной памяти. Ниже приведено изображение, показанное в соответствии с примечанием к приложению.
Обратите внимание, что разные разделы имеют разное количество доступных элементов. Эти элементы, по сути, представляют собой количество разделов, которые мы можем использовать. Например, в стандартном фильтре (11-битном фильтре) доступно 128 элементов, поэтому мы можем использовать 128 различных стандартных фильтров.
Аналогично, в буфере приема (RX) содержится 128 элементов, поэтому мы можем использовать 128 различных буферов для приема данных, и каждый буфер способен хранить до 64 байт данных.
На рисунке ниже показано, какое пространство займет каждый элемент этих секций.
Для большинства разделов расчет довольно прост: (количество доступных слов / количество элементов). Однако это правило не применяется в случае буферов/FIFO для передачи и приема данных . Для этих разделов занимаемое пространство также зависит от размера используемых данных.
В конфигурации FDCAN1 я установил смещение оперативной памяти (RAM offset) равным 0, поэтому выделение памяти начнется с начала ОЗУ.
Я использую 1 стандартный фильтр ( 1 слово ) + 1 элемент RX FIFO с 12 байтами данных ( 5 слов ) + 1 элемент TX FIFO с 12 байтами данных ( 5 слов ). В сумме это составляет 11 слов .
Эти 11 слов потребуются для корректной работы FDCAN1, поэтому смещение для FDCAN2 установлено равным 11. Остальная часть оперативной памяти доступна для FDCAN2, хотя он также будет использовать 11 слов.
Конфигурация фильтра FDCAN
Фильтры в FDCAN позволяют вашему STM32 выборочно получать сообщения из сети. Настроив фильтры, вы можете определить, какие идентификаторы сообщений ваш узел должен обрабатывать , а какие игнорировать. Правильная настройка фильтров повышает эффективность шины и уменьшает ненужную обработку, особенно в загруженных сетях. В этом разделе мы шаг за шагом рассмотрим, как настроить фильтры FDCAN, чтобы ваше приложение обрабатывало только необходимые сообщения.
Настройка фильтра для FDCAN1
FDCAN_FilterTypeDef sFilterConfig;
sFilterConfig.IdType = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex = 0;
sFilterConfig.FilterType = FDCAN_FILTER_MASK;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
sFilterConfig.FilterID1 = 0x22;
sFilterConfig.FilterID2 = 0x22;
sFilterConfig.RxBufferIndex = 0;
if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
{
/* Filter configuration Error */
Error_Handler();
}
- Параметр IdType определяет, используем ли мы стандартные или расширенные идентификаторы.
- Filterindex используется при настройке нескольких фильтров. Поскольку я использую только один фильтр, он установлен на 0.
- FilterType — это тип используемого фильтра. В данном случае я использую фильтр MASK.
- В этом фильтре MASK ID1 ( 0x22 ) будет выступать в качестве идентификатора, а ID2 ( 0x22 ) — в качестве битов маски.
- Если вы хотите узнать больше о том, как это работает, я бы посоветовал вам посмотреть видео по ссылке https://youtu.be/JfWlIY0zAIc
- FilterConfig определяет, что следует делать с сообщениями, проходящими через фильтр. Он настроен на отправку в RX FIFO 0.
- Параметр RxBufferIndex используется, если вы используете буфер приема (RX Buffer) вместо FIFO, поэтому здесь он установлен на 0.
Таким образом, все сообщения, поступающие с идентификатором 0x22, будут проходить через фильтр и сохраняться в RXFIFO0.
Настройка фильтра для FDCAN2
FDCAN_FilterTypeDef sFilterConfig;
sFilterConfig.IdType = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex = 0;
sFilterConfig.FilterType = FDCAN_FILTER_MASK;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
sFilterConfig.FilterID1 = 0x11;
sFilterConfig.FilterID2 = 0x11;
sFilterConfig.RxBufferIndex = 0;
if (HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK)
{
/* Filter configuration Error */
Error_Handler();
}
Здесь все аналогично, за исключением того, что идентификатор установлен на 0x11 , и мы используем RXFIFO1 .
Таким образом, все сообщения, поступающие с идентификатором 0x11, будут проходить через фильтр и сохраняться в RXFIFO1 .
Пошаговое руководство по коду STM32 FDCAN
В этом разделе подробно разбирается основной код, объясняется, как на каждом этапе настройки используется периферийное устройство FDCAN для нормальной работы.
Понимание функций HAL_FDCAN в STM32
Многие поисковые запросы касаются непосредственно функций HAL для STM32. Вот что они делают:
- HAL_FDCAN_AddMessageToTxFifoQ→ Поставляет данные в очередь для передачи.
- HAL_FDCAN_ActivateNotification→ Включает прерывания для событий RX FIFO.
- HAL_FDCAN_GetRxMessage→ Извлекает входящие сообщения из буфера приема (RX FIFO).
- HAL_FDCAN_ConfigFilter→ Определяет идентификаторы фильтров и маршрутизацию.
- HAL_FDCAN_RxFifo0Callback / HAL_FDCAN_RxFifo1Callback→ Вызывается при поступлении новых сообщений.
Давайте перейдём к реализации. Следующий код инициализирует периферийное устройство FDCAN, настраивает оперативную память сообщений и устанавливает фильтры для обработки входящих сообщений.
Определения
Ниже приведены определения, которые мы будем использовать в этом проекте.
// FDCAN1 Defines
FDCAN_TxHeaderTypeDef TxHeader1;
FDCAN_RxHeaderTypeDef RxHeader1;
uint8_t TxData1[12];
uint8_t RxData1[12];
// FDCAN2 Defines
FDCAN_TxHeaderTypeDef TxHeader2;
FDCAN_RxHeaderTypeDef RxHeader2;
uint8_t TxData2[12];
uint8_t RxData2[12];
Как показано выше, заголовки RX и TX определены отдельно для обоих FDCAN. Кроме того, массивы RxData и TxData имеют размер 12 байт.
Запустите периферийное устройство FDCAN.
Процесс запуска периферийного устройства FDCAN мы напишем внутри главной функции.
// STart FDCAN1
if(HAL_FDCAN_Start(&hfdcan1)!= HAL_OK)
{
Error_Handler();
}
// STart FDCAN2
if(HAL_FDCAN_Start(&hfdcan2)!= HAL_OK)
{
Error_Handler();
}
// Activate the notification for new data in FIFO0 for FDCAN1
if (HAL_FDCAN_ActivateNoatification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
{
/* Notification Error */
Error_Handler();
}
// Activate the notification for new data in FIFO1 for FDCAN2
if (HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0) != HAL_OK)
{
/* Notification Error */
Error_Handler();
}
Прежде всего, запустите FDCAN1 и FDCAN2. Затем активируйте уведомления о поступлении новых сообщений в соответствующие FIFO-модули. Это уведомление вызовет прерывание, которое в конечном итоге вызовет функцию обратного вызова, где мы обработаем входящие данные.
Подготовьте заголовок TX.
Далее подготовьте заголовок TX для обоих каналов FDCAN, который будет передаваться вместе с данными по шине CAN. Этот заголовок останется неизменным, а часть с данными можно будет изменить позже в соответствии с требованиями. Я использую максимум 12 байт для данных, поэтому их можно объявить и в самом начале.
// Configure TX Header for FDCAN1
TxHeader1.Identifier = 0x11;
TxHeader1.IdType = FDCAN_STANDARD_ID;
TxHeader1.TxFrameType = FDCAN_DATA_FRAME;
TxHeader1.DataLength = FDCAN_DLC_BYTES_12;
TxHeader1.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
TxHeader1.BitRateSwitch = FDCAN_BRS_OFF;
TxHeader1.FDFormat = FDCAN_FD_CAN;
TxHeader1.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
TxHeader1.MessageMarker = 0;
// Configure TX Header for FDCAN2
TxHeader2.Identifier = 0x22;
TxHeader2.IdType = FDCAN_STANDARD_ID;
TxHeader2.TxFrameType = FDCAN_DATA_FRAME;
TxHeader2.DataLength = FDCAN_DLC_BYTES_12;
TxHeader2.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
TxHeader2.BitRateSwitch = FDCAN_BRS_OFF;
TxHeader2.FDFormat = FDCAN_FD_CAN;
TxHeader2.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
TxHeader2.MessageMarker = 0;
Идентификатор FDCAN1 установлен на 0x11, а идентификатор FDCAN2 — на 0x22. Остальные параметры в обоих случаях одинаковы.
- Идентификатор — это идентификатор передатчика, который будет равен 0x11 для FDCAN1 и 0x22 для FDCAN2.
- В этом руководстве для параметра IdType установлено значение Standard ID, поскольку мы не используем Extended ID.
- Параметр TxFrameType указывает, отправляем ли мы Data Frame или Remote Frame. В этом случае он устанавливается в значение Data Frame.
- Параметр DataLength установлен на 12 байт. Это длина фактических данных, которые мы собираемся отправить.
- Индикатор ErrorStateIndicator активен и уведомит нас в случае возникновения ошибок при передаче данных.
- Функция BitrateSwitch отключена, как я уже упоминал, мы будем использовать один и тот же битрейт как для поля арбитража, так и для поля данных.
- Параметр FDFormat указывает, хотите ли вы использовать стандартный CAN или FD CAN. Он устанавливается в значение FD_CAN.
- Мы не используем TxEvent или MessageMarker.
Бесконечный цикл
Внутри цикла while мы настроим FDCAN1 на передачу данных каждую секунду.
while (1)
{
sprintf ((char *)TxData1, "FDCAN1TX %d", indx++);
if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader1, TxData1)!= HAL_OK)
{
Error_Handler();
}
HAL_Delay (1000);
}
- Параметр TxData содержит строку (указывающую на то, что данные поступают с FDCAN1) вместе с увеличенным значением переменной indx .
- Затем функция HAL_FDCAN_AddMessageToTxFifoQдобавит сообщение в очередь FIFO.
- После добавления сообщения в очередь FIFO оно будет передано в шину CAN.
После отправки сообщения на шину CAN, оно будет получено всеми устройствами, подключенными к этой шине (хотя у нас их всего на одно больше). После прохождения сообщения через фильтр FDCAN2 будет вызвана функция обратного вызова для обработки нового сообщения.
Обратный вызов FDCAN2
Поскольку FDCAN1 передает данные в цикле while, FDCAN2 будет принимать эти данные. После того, как данные пройдут через фильтры FDCAN2, сработает прерывание, и HAL_FDCAN_RxFifo1Callbackбудет вызван соответствующий метод. Обработка полученных данных будет производиться внутри этого коллбэка.
// FDCAN2 Callback
void HAL_FDCAN_RxFifo1Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo1ITs)
{
if((RxFifo1ITs & FDCAN_IT_RX_FIFO1_NEW_MESSAGE) != RESET)
{
/* Retreive Rx messages from RX FIFO0 */
if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO1, &RxHeader2, RxData2) != HAL_OK)
{
/* Reception Error */
Error_Handler();
}
if (HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0) != HAL_OK)
{
/* Notification Error */
Error_Handler();
}
sprintf ((char *)TxData2, "FDCAN2TX %d", indx++);
if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader2, TxData2)!= HAL_OK)
{
Error_Handler();
}
}
}
Функция RxFifo1Callback будет запущена, поскольку мы используем Fifo1 для FDCAN2 .
- Здесь мы сначала скопируем информацию заголовка из RX FIFO1 в RxHeader, а данные — в массив RxData.
- После этого мы снова активируем уведомление о новом сообщении.
- Наконец, мы передадим некоторые данные по шине CAN.
- Эти данные содержат строку (указывающую на то, что данные поступают из FDCAN2) вместе с увеличенным значением переменной indx .
После отправки сообщения на шину CAN оно пройдет через фильтр FDCAN1, и будет вызвана функция обратного вызова для нового сообщения.
Обратный вызов FDCAN1
После получения данных от FDCAN1, FDCAN2 обрабатывает эти данные и отправляет их обратно в шину CAN. После прохождения данных через фильтры FDCAN1 срабатывает прерывание, и HAL_FDCAN_RxFifo0Callbackвызывается функция обратного вызова. Обработка полученных данных будет производиться внутри этой функции обратного вызова.
// FDCAN1 Callback
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
{
/* Retreive Rx messages from RX FIFO0 */
if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader1, RxData1) != HAL_OK)
{
/* Reception Error */
Error_Handler();
}
if (HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
{
/* Notification Error */
Error_Handler();
}
}
}
Функция RxFifo0Callback будет запущена, поскольку мы используем Fifo0 для FDCAN1 .
- Здесь мы сначала скопируем информацию заголовка из RX FIFO0 в RxHeader, а данные — в массив RxData.
- После этого мы снова активируем уведомление о новом сообщении.
В отличие от функции обратного вызова FDCAN2, здесь мы не передаем никаких данных, поскольку данные передаются каждую секунду модулем FDCAN1 в цикле while. Таким образом, FDCAN1 будет продолжать передавать данные каждую секунду, а FDCAN2 всегда будет отправлять на это ответ.
Результат обмена данными по протоколу FDCAN микроконтроллера STM32
На изображениях ниже показаны данные, переданные одним экземпляром и принятые другим экземпляром FDCAN в STM32.
FDCAN1 → FDCAN2
FDCAN2 → FDCAN1
На первом рисунке показаны данные, переданные FDCAN1 (TxData1) , и те же данные, успешно принятые FDCAN2 (RxData2) . На втором рисунке показан другой набор данных, переданный FDCAN2 (TxData2) и корректно принятый FDCAN1 (RxData1) .
Это демонстрирует корректную связь между обоими периферийными устройствами FDCAN, подтверждая нормальную работу системы передачи и приема . Также это подтверждает правильную настройку соединений CANH и CANL и сохранение целостности данных в сети.
Этот тест важен, поскольку он подтверждает надежную двустороннюю связь между узлами, что крайне необходимо в реальных приложениях, таких как автомобильные системы, промышленная автоматизация и робототехника, где данные должны передаваться и приниматься точно и без ошибок.
В этом руководстве мы рассмотрели, как настроить и использовать FDCAN в обычном режиме на STM32. Мы научились настраивать аппаратные соединения, устанавливать периферийные устройства FDCAN, передавать и принимать данные между двумя узлами, а также проверять связь с помощью простых тестовых сообщений. Мы также изучили структуру кадра FDCAN, фильтры и различия между кадрами CAN 2.0 и CAN-FD. Выполнив эти шаги, вы получите прочную основу для реализации надежной связи CAN в ваших проектах на STM32.























