新增了CAN变长度数据帧的基本支持

This commit is contained in:
NeoZeng 2022-11-27 23:06:45 +08:00
parent 36df442214
commit cb3f5d92d1
4 changed files with 24 additions and 7 deletions

View File

@ -86,6 +86,14 @@ void CANTransmit(can_instance *_instance)
HAL_CAN_AddTxMessage(_instance->can_handle, &_instance->txconf, _instance->tx_buff, &_instance->tx_mailbox);
}
void CANSetDLC(can_instance *_instance, uint8_t length)
{
if (length > 8)
while (1)
;
_instance->txconf.DLC = length;
}
/* -----------------------belows are callback definitions--------------------------*/
/**
@ -102,11 +110,12 @@ static void CANFIFOxCallback(CAN_HandleTypeDef *_hcan, uint32_t fifox)
HAL_CAN_GetRxMessage(_hcan, fifox, &rxconf, can_rx_buff);
for (size_t i = 0; i < DEVICE_CAN_CNT; i++)
{
if(instance[i]!=NULL)
if (instance[i] != NULL)
{
if (_hcan == instance[i]->can_handle && rxconf.StdId == instance[i]->rx_id)
{
memcpy(instance[i]->rx_buff, can_rx_buff, 8);
instance[i]->rx_len=rxconf.DLC;
memcpy(instance[i]->rx_buff, can_rx_buff, rxconf.DLC);
instance[i]->can_module_callback(instance[i]);
break;
}

View File

@ -19,6 +19,7 @@ typedef struct _
uint8_t tx_buff[8];
uint8_t rx_buff[8];
uint32_t rx_id;
uint8_t rx_len;
void (*can_module_callback)(struct _ *); // callback needs an instance to tell among registered ones
} can_instance;
@ -49,4 +50,12 @@ void CANTransmit(can_instance *_instance);
*/
void CANRegister(can_instance *instance, can_instance_config_s config);
/**
* @brief CAN发送报文的数据帧长度;8,,8
*
* @param _instance can实例
* @param length
*/
void CANSetDLC(can_instance *_instance,uint8_t length);
#endif

View File

@ -11,10 +11,6 @@
若你希望新增一个基于CAN的module首先在该模块下应该有一个包含`can_instance`指针的module结构体或当功能简单的时候可以是单独存在的`can_instance`,但不推荐这样做)。
## 代码结构
.h文件内包括了外部接口和类型定义,以及模块对应的宏。c文件内为私有函数和外部接口的定义。

View File

@ -2,7 +2,10 @@
<p align='right'>neozng1@hnu.edu.cn</p>
双板CAN通信模块
> TODO:
>
> 1. 增加数据长度可变的协议支持
> 2. 简化接收流程
## 总览和封装说明