can шина на stm32

работа can шины на stm32 для обмена данными между двумя платами

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
Аватара пользователя
slavas
Лейтенант
Сообщения: 596
Зарегистрирован: 14.09.2015{, 22:29}
Репутация: 1
Откуда: Санкт-Петербург

can шина на stm32

#1

Сообщение slavas » 02.05.2024{, 21:32}

Уважаемые знатоки возникла необходимость обмениваться данными разных типов между двумя stm32, can шина вроде подходит идеально но как реализовать не знаю, может кто подскажет.

Отправлено спустя 9 минут 39 секунд:
// Библиотека для работы с CAN на STM32
#include "stm32f1xx.h"

// Структура для хранения параметров CAN
CAN_HandleTypeDef hcan;

// Инициализация CAN
void CAN_Init(void)
{
// Установка параметров CAN
hcan.Instance = CAN1;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg1 = CAN_BS1_12TQ;
hcan.Init.TimeSeg2 = CAN_BS2_3TQ;
hcan.Init.BS1 = CAN_BS1_14TQ;
hcan.Init.BS2 = CAN_BS2_6TQ;
hcan.Init.Prescaler = 45;

// Инициализация CAN
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
Error_Handler();
}

// Настройка фильтра
CAN_FilterTypeDef can_filter;
can_filter.FilterBank = 0;
// Остальные параметры фильтра
// ...

// Конфигурация фильтра
if (HAL_CAN_ConfigFilter(&hcan, &can_filter) != HAL_OK)
{
Error_Handler();
}
}

// Отправка сообщения по CAN
void CAN_Transmit(uint32_t id, uint8_t* data, uint8_t len)
{
CAN_TxHeaderTypeDef tx_header;
// Заполнение заголовка сообщения
// ...

uint32_t mailbox;

// Добавление сообщения в очередь на отправку
if (HAL_CAN_AddTxMessage(&hcan, &tx_header, data, &mailbox) != HAL_OK)
{
Error_Handler();
}
}

// Прием сообщения по CAN
void CAN_Receive(void)
{
CAN_RxHeaderTypeDef rx_header;
uint8_t rx_data[8];

if (HAL_CAN_GetRxFifoFillLevel(&hcan, CAN_RX_FIFO0) > 0)
{
if (HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &rx_header, rx_data) != HAL_OK)
{
Error_Handler();
}

// Обработка принятых данных
}
}

// Основная программа
int main(void)
{
// Инициализация устройств
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_CAN1_Init();

// Инициализация CAN
CAN_Init();

// Отправка данных
uint8_t tx_data[] = {0x01, 0x02, 0x03};
CAN_Transmit(0x123, tx_data, sizeof(tx_data));

while (1)
{
// Прием данных
CAN_Receive();

// Другие действия
}
}

ecoins
Полковник
Сообщения: 2973
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 455
Откуда: Шатура
Имя: Энвер

can шина на stm32

#2

Сообщение ecoins » 03.05.2024{, 12:05}

slavas писал(а):
02.05.2024{, 21:41}
Уважаемые знатоки возникла необходимость обмениваться данными разных типов между двумя stm32, can шина вроде подходит идеально но как реализовать не знаю, может кто подскажет.
Давно хочется поднять... И ПЛК уже такой развели...
Но пока не получается подобрать и адаптировать библиотеку...

Ответить

Вернуться в «Спросить у знатоков»