mirror of
https://gitee.com/dlmu-cone/bf_original_balance_chassis
synced 2026-07-24 11:37:45 +08:00
能动了!(小板凳)但是还是很抖
This commit is contained in:
@@ -11,6 +11,11 @@
|
||||
static CANInstance *can_instance[CAN_MX_REGISTER_CNT] = {NULL};
|
||||
static uint8_t idx; // 全局CAN实例索引,每次有新的模块注册会自增
|
||||
|
||||
static uint8_t CANBusIndex(CAN_HandleTypeDef *hcan)
|
||||
{
|
||||
return hcan == &hcan1 ? 0u : 1u;
|
||||
}
|
||||
|
||||
/* ----------------two static function called by CANRegister()-------------------- */
|
||||
|
||||
/**
|
||||
@@ -28,18 +33,26 @@ static uint8_t idx; // 全局CAN实例索引,每次有新的模块注册会自
|
||||
*/
|
||||
static void CANAddFilter(CANInstance *_instance)
|
||||
{
|
||||
CAN_FilterTypeDef can_filter_conf;
|
||||
static uint8_t can1_filter_idx = 0, can2_filter_idx = 14; // 0-13给can1用,14-27给can2用
|
||||
static uint8_t all_pass_filter_configured[DEVICE_CAN_CNT] = {0};
|
||||
uint8_t bus = CANBusIndex(_instance->can_handle);
|
||||
|
||||
can_filter_conf.FilterMode = CAN_FILTERMODE_IDLIST; // 使用id list模式,即只有将rxid添加到过滤器中才会接收到,其他报文会被过滤
|
||||
can_filter_conf.FilterScale = CAN_FILTERSCALE_16BIT; // 使用16位id模式,即只有低16位有效
|
||||
can_filter_conf.FilterFIFOAssignment = (_instance->tx_id & 1) ? CAN_RX_FIFO0 : CAN_RX_FIFO1; // 奇数id的模块会被分配到FIFO0,偶数id的模块会被分配到FIFO1
|
||||
can_filter_conf.SlaveStartFilterBank = 14; // 从第14个过滤器开始配置从机过滤器(在STM32的BxCAN控制器中CAN2是CAN1的从机)
|
||||
can_filter_conf.FilterIdLow = _instance->rx_id << 5; // 过滤器寄存器的低16位,因为使用STDID,所以只有低11位有效,高5位要填0
|
||||
can_filter_conf.FilterBank = _instance->can_handle == &hcan1 ? (can1_filter_idx++) : (can2_filter_idx++); // 根据can_handle判断是CAN1还是CAN2,然后自增
|
||||
can_filter_conf.FilterActivation = CAN_FILTER_ENABLE; // 启用过滤器
|
||||
if (all_pass_filter_configured[bus])
|
||||
return;
|
||||
|
||||
HAL_CAN_ConfigFilter(_instance->can_handle, &can_filter_conf);
|
||||
CAN_FilterTypeDef accept_all_filter = {0};
|
||||
accept_all_filter.FilterActivation = CAN_FILTER_ENABLE;
|
||||
accept_all_filter.FilterMode = CAN_FILTERMODE_IDMASK;
|
||||
accept_all_filter.FilterScale = CAN_FILTERSCALE_32BIT;
|
||||
accept_all_filter.FilterIdHigh = 0x0000;
|
||||
accept_all_filter.FilterIdLow = 0x0000;
|
||||
accept_all_filter.FilterMaskIdHigh = 0x0000;
|
||||
accept_all_filter.FilterMaskIdLow = 0x0000;
|
||||
accept_all_filter.FilterBank = _instance->can_handle == &hcan1 ? 0 : 14;
|
||||
accept_all_filter.FilterFIFOAssignment = CAN_RX_FIFO0;
|
||||
accept_all_filter.SlaveStartFilterBank = 14;
|
||||
HAL_CAN_ConfigFilter(_instance->can_handle, &accept_all_filter);
|
||||
all_pass_filter_configured[bus] = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -163,7 +176,7 @@ static void CANFIFOxCallback(CAN_HandleTypeDef *_hcan, uint32_t fifox)
|
||||
memcpy(can_instance[i]->rx_buff, can_rx_buff, rxconf.DLC); // 消息拷贝到对应实例
|
||||
can_instance[i]->can_module_callback(can_instance[i]); // 触发回调进行数据解析和处理
|
||||
}
|
||||
return;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user