mirror of
https://gitee.com/dlmu-cone/bf_original_balance_chassis
synced 2026-07-25 03:47:47 +08:00
关节电机measure
This commit is contained in:
@@ -105,6 +105,7 @@ CANInstance *CANRegister(CAN_Init_Config_s *config)
|
||||
instance->can_handle = config->can_handle;
|
||||
instance->tx_id = config->tx_id; // 好像没用,可以删掉
|
||||
instance->rx_id = config->rx_id;
|
||||
instance->rx_id_match_any = config->rx_id_match_any;
|
||||
instance->can_module_callback = config->can_module_callback;
|
||||
instance->id = config->id;
|
||||
|
||||
@@ -141,6 +142,17 @@ uint8_t CANTransmit(CANInstance *_instance, float timeout)
|
||||
return 1; // 发送成功
|
||||
}
|
||||
|
||||
uint8_t CANTryTransmit(CANInstance *_instance)
|
||||
{
|
||||
if (HAL_CAN_GetTxMailboxesFreeLevel(_instance->can_handle) == 0u)
|
||||
return 0u;
|
||||
|
||||
return HAL_CAN_AddTxMessage(_instance->can_handle,
|
||||
&_instance->txconf,
|
||||
_instance->tx_buff,
|
||||
&_instance->tx_mailbox) == HAL_OK;
|
||||
}
|
||||
|
||||
void CANSetDLC(CANInstance *_instance, uint8_t length)
|
||||
{
|
||||
// 发送长度错误!检查调用参数是否出错,或出现野指针/越界访问
|
||||
@@ -168,15 +180,16 @@ static void CANFIFOxCallback(CAN_HandleTypeDef *_hcan, uint32_t fifox)
|
||||
HAL_CAN_GetRxMessage(_hcan, fifox, &rxconf, can_rx_buff); // 从FIFO中获取数据
|
||||
for (size_t i = 0; i < idx; ++i)
|
||||
{ // 两者相等说明这是要找的实例
|
||||
if (_hcan == can_instance[i]->can_handle && rxconf.StdId == can_instance[i]->rx_id)
|
||||
if (_hcan == can_instance[i]->can_handle &&
|
||||
(can_instance[i]->rx_id_match_any || rxconf.StdId == can_instance[i]->rx_id))
|
||||
{
|
||||
if (can_instance[i]->can_module_callback != NULL) // 回调函数不为空就调用
|
||||
{
|
||||
can_instance[i]->rx_std_id = rxconf.StdId;
|
||||
can_instance[i]->rx_len = rxconf.DLC; // 保存接收到的数据长度
|
||||
memcpy(can_instance[i]->rx_buff, can_rx_buff, rxconf.DLC); // 消息拷贝到对应实例
|
||||
can_instance[i]->can_module_callback(can_instance[i]); // 触发回调进行数据解析和处理
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,9 @@ typedef struct _
|
||||
uint8_t tx_buff[8]; // 发送缓存,发送消息长度可以通过CANSetDLC()设定,最大为8
|
||||
uint8_t rx_buff[8]; // 接收缓存,最大消息长度为8
|
||||
uint32_t rx_id; // 接收id
|
||||
uint32_t rx_std_id; // 实际收到的标准帧id
|
||||
uint8_t rx_len; // 接收长度,可能为0-8
|
||||
uint8_t rx_id_match_any; // 软件层接收该CAN总线上的任意标准帧
|
||||
// 接收的回调函数,用于解析接收到的数据
|
||||
void (*can_module_callback)(struct _ *); // callback needs an instance to tell among registered ones
|
||||
void *id; // 使用can外设的模块指针(即id指向的模块拥有此can实例,是父子关系)
|
||||
@@ -34,6 +36,7 @@ typedef struct
|
||||
CAN_HandleTypeDef *can_handle; // can句柄
|
||||
uint32_t tx_id; // 发送id
|
||||
uint32_t rx_id; // 接收id
|
||||
uint8_t rx_id_match_any; // 忽略rx_id,由模块自行解析报文id
|
||||
void (*can_module_callback)(CANInstance *); // 处理接收数据的回调函数
|
||||
void *id; // 拥有can实例的模块地址,用于区分不同的模块(如果有需要的话),如果不需要可以不传入
|
||||
} CAN_Init_Config_s;
|
||||
@@ -65,4 +68,6 @@ void CANSetDLC(CANInstance *_instance, uint8_t length);
|
||||
*/
|
||||
uint8_t CANTransmit(CANInstance *_instance,float timeout);
|
||||
|
||||
uint8_t CANTryTransmit(CANInstance *_instance);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user