项目场景:can通信控制大疆M3508电机
提示:这里简述项目相关背景:用stm32f405rgt6的can通信接收大疆电机通过can发送过来的信息
问题描述
can通信写了中断接收函数和过滤器依然没有接收到信号
原因分析:
提示:这里填写问题的分析:过滤器配置有问题,can中断不能进入
解决方案:
提示:这里填写该问题的具体解决方案:对过滤器进行修改
一下是我的过滤器配置:
这个过滤器可以放在main函数前面,这样子虽然难看,但是可以避免一下解释不清的BUG和报错出现
CanTx是自己定义的句柄
static CAN_TxHeaderTypeDef CanTx;
HAL_StatusTypeDef Can_Config(void)//配置过滤器
{
CAN_FilterTypeDef sFilterConfig;
CanTx.DLC = 8; //数据长度
CanTx.ExtId = 0x0200; //(uint32_t)0x1314
CanTx.IDE = CAN_ID_EXT; //扩展帧模式
CanTx.RTR = CAN_RTR_DATA; //数据帧
CanTx.StdId = 0x0200; //使用扩展帧时需置零
CanTx.TransmitGlobalTime = DISABLE;//时间戳
sFilterConfig.FilterActivation = CAN_FILTER_ENABLE; //筛选器使能
sFilterConfig.FilterBank = 0; //筛选器0
sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;//指定将分配给过滤器的FIFO(0或1U)
sFilterConfig.FilterIdHigh = 0x0000;//(((CAN_ID<<3) | CAN_ID_EXT | CAN_RTR_DATA)&0xFFFF0000)>>16; //ID的高16位
sFilterConfig.FilterIdLow = 0x0000;//((CAN_ID<<3) | CAN_ID_EXT | CAN_RTR_DATA) & 0xFFFF; //ID的低16位,只接收扩展帧模式、数据帧
sFilterConfig.FilterMaskIdHigh = 0x0000;//0xFFFF;//FilterMask高低字节数据中位为1时代表必须与ID该位一致,0xFFFFFFFF代表接收筛选必须与ID一致才通过
sFilterConfig.FilterMaskIdLow = 0x0000;//0xFFFF;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//掩码模式
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//32位
sFilterConfig.SlaveStartFilterBank = 0;
if(HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
{
return HAL_ERROR;
}
if(HAL_CAN_Start(&hcan1) != HAL_OK) //启动CAN
{
return HAL_ERROR;
}
if(HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)//激活CAN_IT_RX_FIFO0_MSG_PENDING中断
{
return HAL_ERROR;
}
return HAL_OK;
}
主要后面三个if语句的&hcan1是can句柄如果你使用的是f1芯片那么可以把&hcan1改成&hcan,
用的是f4的can2端口那么就把&hcan1改成&hcan2