
如题,我是想用CAN1,CAN2,CAN3分别独立收发数据,但现在只有CAN1能正常收发,CAN2,CAN3只能发,不能中断接收,代码配置如下,求大神们帮我看看: int CAN_Config(void) { CAN_FilterConfTypeDef sFilterConfig; static CanTxMsgTypeDef TxMessage2; static CanRxMsgTypeDef RxMessage2; static CanTxMsgTypeDef TxMessage1; static CanRxMsgTypeDef RxMessage1; static CanTxMsgTypeDef TxMessage; static CanRxMsgTypeDef RxMessage; //CAN1 初始化 25MHz 125kbps CanHandleToBMS1.Instance = CAN1; CanHandleToBMS1.pTxMsg = &TxMessage1; CanHandleToBMS1.pRxMsg = &RxMessage1; //CAN1工作模式及波特率配置 CanHandleToBMS1.Init.TTCM = DISABLE; CanHandleToBMS1.Init.ABOM = ENABLE; CanHandleToBMS1.Init.AWUM = DISABLE; CanHandleToBMS1.Init.NART = DISABLE; CanHandleToBMS1.Init.RFLM = ENABLE; CanHandleToBMS1.Init.TXFP = DISABLE; CanHandleToBMS1.Init.Mode = CAN_MODE_NORMAL; CanHandleToBMS1.Init.SJW = CAN_SJW_1TQ; CanHandleToBMS1.Init.BS1 = CAN_BS1_4TQ; CanHandleToBMS1.Init.BS2 = CAN_BS2_5TQ; CanHandleToBMS1.Init.Prescaler = 20; if(HAL_CAN_Init(&CanHandleToBMS1)!=HAL_OK) return 1; //CAN1过滤器 使能FIFO0 sFilterConfig.FilterNumber = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x0000; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000; sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_FIFO0; sFilterConfig.FilterActivation = ENABLE; sFilterConfig.BankNumber = 14; if(HAL_CAN_ConfigFilter(&CanHandleToBMS1, &sFilterConfig)!=HAL_OK) return 2; //CAN2 初始化 25MHz 125kbps CanHandleToBMS2.Instance = CAN2; CanHandleToBMS2.pTxMsg = &TxMessage; CanHandleToBMS2.pRxMsg = &RxMessage; //CAN2工作模式及波特率配置 CanHandleToBMS2.Init.TTCM = DISABLE; CanHandleToBMS2.Init.ABOM = ENABLE; CanHandleToBMS2.Init.AWUM = DISABLE; CanHandleToBMS2.Init.NART = DISABLE; CanHandleToBMS2.Init.RFLM = ENABLE; CanHandleToBMS2.Init.TXFP = DISABLE; CanHandleToBMS2.Init.Mode = CAN_MODE_NORMAL; CanHandleToBMS2.Init.SJW = CAN_SJW_1TQ; CanHandleToBMS2.Init.BS1 = CAN_BS1_4TQ; CanHandleToBMS2.Init.BS2 = CAN_BS2_5TQ; CanHandleToBMS2.Init.Prescaler =20; if(HAL_CAN_Init(&CanHandleToBMS2)!=HAL_OK) return 3; //CAN2过滤器 使能FIFO1 sFilterConfig.FilterNumber = 14;//14; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x0000; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000; sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_FIFO1; sFilterConfig.FilterActivation = ENABLE; sFilterConfig.BankNumber = 14; if(HAL_CAN_ConfigFilter(&CanHandleToBMS2, &sFilterConfig)!=HAL_OK) return 4; // /*##-CAN3初始化 #######################################*/ CanHandleToDC.Instance = CAN3; CanHandleToDC.pTxMsg = &TxMessage2; CanHandleToDC.pRxMsg = &RxMessage2; //CAN3 初始化 25MHz 125kbps CanHandleToDC.Init.TTCM = DISABLE; CanHandleToDC.Init.ABOM = ENABLE; CanHandleToDC.Init.AWUM = DISABLE; CanHandleToDC.Init.NART = DISABLE; CanHandleToDC.Init.RFLM = ENABLE; CanHandleToDC.Init.TXFP = DISABLE; CanHandleToDC.Init.Mode = CAN_MODE_NORMAL; CanHandleToDC.Init.SJW = CAN_SJW_1TQ; CanHandleToDC.Init.BS1 = CAN_BS1_4TQ; CanHandleToDC.Init.BS2 = CAN_BS2_5TQ; CanHandleToDC.Init.Prescaler = 20; HAL_CAN_Init(&CanHandleToDC); //CAN3过滤器 使能FIFO0 sFilterConfig.FilterNumber = 14; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x0000; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000;//0xFFFF; sFilterConfig.FilterMaskIdLow = 0x0000;//0xFF00; sFilterConfig.FilterFIFOAssignment = CAN_FIFO0 sFilterConfig.FilterActivation = ENABLE; sFilterConfig.BankNumber = 14; HAL_CAN_ConfigFilter(&CanHandleToDC, &sFilterConfig); return 0; } 回调函数如下: void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *CanHandle) { uint8_t i; if(CanHandle->pRxMsg->IDE == CAN_ID_EXT) { if(CanHandle->Instance == CAN1) { CANBMS.IDE = CanHandle->pRxMsg->ExtId; CANBMS.DLC = CanHandle->pRxMsg->DLC; for(i=0;i<8;i++) { CANBMS.Data[i] = CanHandle->pRxMsg->Data[i]; } LeftCANqueue_push(CANBMS); HAL_CAN_Receive_IT(CanHandle, CAN_FIFO0); __HAL_CAN_ENABLE_IT(&CanHandleToBMS1,CAN_IT_FMP0);//重新开启FIF00消息挂号中断 } if(CanHandle->Instance == CAN2) { CANBMS.IDE = CanHandle->pRxMsg->ExtId; CANBMS.DLC = CanHandle->pRxMsg->DLC; for(i=0;i<8;i++) { CANBMS.Data[i] = CanHandle->pRxMsg->Data[i]; } RightCANqueue_push(CANBMS); HAL_CAN_Receive_IT(CanHandle, CAN_FIFO1); __HAL_CAN_ENABLE_IT(&CanHandleToBMS2,CAN_IT_FMP1); } if(CanHandle->Instance == CAN3) { CANBMS.IDE = CanHandle->pRxMsg->ExtId; CANBMS.DLC = CanHandle->pRxMsg->DLC; for(i=0;i<8;i++) { CANBMS.Data[i] = CanHandle->pRxMsg->Data[i]; } HAL_CAN_Receive_IT(CanHandle, CAN_FIFO0); __HAL_CAN_ENABLE_IT(&CanHandleToDC,CAN_IT_FMP0); } } } |
ST的hal库有问题手头有STM32L4或STM32F7的帮忙测试DMA SD卡
STM32F756 DCMI +GC0308 Camera图片不正常
STM32F722RET6无法被JLINK/STLIN和IAR/KEIL识别
STM32F767以太网换PIN脚无数据
STM32F7 DSP库使用
没有人分享一下STM32F767 硬JPEG 编码解码吗
求STM32F777与FPGA通过FMC通信的参考设计
求STM32F7 1.15版本 固件库
STM32F746使用HAL库串口无法中断收数据
STM32F7xx AXIM & ITCM
是的,找不到问题出在哪,急死了!
其实就是数据手册看少了,数据手册看明白了,然后库里面直接看寄存器。。。啥都OK。。。