Уважаемые знатоки возникла необходимость обмениваться данными разных типов между двумя 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();
// Другие действия
}
}