初始提交
This commit is contained in:
77
Core/Src/can2.c
Normal file
77
Core/Src/can2.c
Normal file
@@ -0,0 +1,77 @@
|
||||
#include "main.h"
|
||||
#include "can.h"
|
||||
#include "gpio.h"
|
||||
#include "can2.h"
|
||||
// 打包函数
|
||||
void pack_rc_to_can(const rc_info_t *rc, can_packet_t *packet1, can_packet_t *packet2)
|
||||
{
|
||||
// 第一个包:ch0-ch3 (共8字节)
|
||||
packet1->data[0] = (uint8_t)(rc->ch0 & 0xFF);
|
||||
packet1->data[1] = (uint8_t)((rc->ch0 >> 8) & 0xFF);
|
||||
packet1->data[2] = (uint8_t)(rc->ch1 & 0xFF);
|
||||
packet1->data[3] = (uint8_t)((rc->ch1 >> 8) & 0xFF);
|
||||
packet1->data[4] = (uint8_t)(rc->ch2 & 0xFF);
|
||||
packet1->data[5] = (uint8_t)((rc->ch2 >> 8) & 0xFF);
|
||||
packet1->data[6] = (uint8_t)(rc->ch3 & 0xFF);
|
||||
packet1->data[7] = (uint8_t)((rc->ch3 >> 8) & 0xFF);
|
||||
|
||||
// 第二个包:roll + sw1 + sw2 (共4字节)
|
||||
packet2->data[0] = (uint8_t)(rc->roll & 0xFF);
|
||||
packet2->data[1] = (uint8_t)((rc->roll >> 8) & 0xFF);
|
||||
packet2->data[2] = rc->sw1;
|
||||
packet2->data[3] = rc->sw2;
|
||||
|
||||
// 填充剩余字节(可以添加校验、计数器等)
|
||||
static uint8_t counter = 0;
|
||||
packet2->data[4] = counter++; // 帧计数器
|
||||
packet2->data[5] = 0xAA; // 校验标记
|
||||
packet2->data[6] = 0x55;
|
||||
packet2->data[7] = 0x00;
|
||||
}
|
||||
|
||||
// CAN发送函数
|
||||
static uint8_t send_can_frame(uint32_t id, uint8_t *data, uint8_t len)
|
||||
{
|
||||
CAN_TxHeaderTypeDef tx_header;
|
||||
uint32_t tx_mailbox;
|
||||
|
||||
// 配置CAN帧头
|
||||
tx_header.StdId = id;
|
||||
tx_header.ExtId = 0x00;
|
||||
tx_header.IDE = CAN_ID_STD;
|
||||
tx_header.RTR = CAN_RTR_DATA;
|
||||
tx_header.DLC = len;
|
||||
tx_header.TransmitGlobalTime = DISABLE;
|
||||
|
||||
// 发送CAN帧
|
||||
if (HAL_CAN_AddTxMessage(&hcan2, &tx_header, data, &tx_mailbox) == HAL_OK)
|
||||
{
|
||||
return 1; // 发送成功
|
||||
}
|
||||
|
||||
return 0; // 发送失败
|
||||
}
|
||||
|
||||
// 发送遥控器数据
|
||||
void send_rc_data(const rc_info_t *rc)
|
||||
{
|
||||
can_packet_t packet1, packet2;
|
||||
|
||||
// 打包数据
|
||||
pack_rc_to_can(rc, &packet1, &packet2);
|
||||
|
||||
// 发送两个CAN帧
|
||||
if (!send_can_frame(0x100, packet1.data, 8))
|
||||
{
|
||||
// 发送失败处理
|
||||
// 可以重试或记录错误
|
||||
}
|
||||
|
||||
// 延时一下,避免总线拥堵
|
||||
HAL_Delay(1);
|
||||
|
||||
if (!send_can_frame(0x101, packet2.data, 8))
|
||||
{
|
||||
// 发送失败处理
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user