关于CAN调试
在配置CAN通讯过程中 除了在CUBEMX中打开接收中断RX0以外,用户本身也要添加相关函数 包括过滤器配置 打开CAN 打开中断 中断回调等
CAN_TxHeaderTypeDef TxMeg; CAN_RxHeaderTypeDef RxMeg; uint8_t CAN_RX_Data[8]; uint8_t CAN_RX_END=0; void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) //接收回调函数 { HAL_StatusTypeDef HAL_RetVal; HAL_RetVal=HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxMeg, CAN_RX_Data); if ( HAL_OK==HAL_RetVal) { CAN_RX_END=1; for(int i=0;i<8;i++) { printf("%d\r\n", CAN_RX_Data[i]); } } } void User_CAN_Init(CAN_HandleTypeDef* hcan ) //用户初始化函数 { CAN_FilterTypeDef sFilterConfig; HAL_StatusTypeDef HAL_Status; sFilterConfig.FilterActivation = ENABLE;//使能过滤器 sFilterConfig.FilterBank = 1;//指定过滤器为1 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//指定过滤器为标识符屏蔽位模式 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//过滤器位宽为32位 sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;//设定了指向过滤器的FIFO sFilterConfig.FilterIdHigh =0x0000 ;//要过滤的ID高位 sFilterConfig.FilterIdLow = 0x0000;//要过滤的ID低位 sFilterConfig.FilterMaskIdHigh = 0x0000;//过滤器屏蔽标识符的高16位值 sFilterConfig.FilterMaskIdLow = 0x0000; //过滤器屏蔽标识符的低16位值 HAL_CAN_ConfigFilter(hcan,&sFilterConfig); HAL_Status=HAL_CAN_Start(hcan); //开启CAN if(HAL_Status!=HAL_OK){ printf("开启CAN失败\r\n"); } HAL_Status=HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING); if(HAL_Status!=HAL_OK){ printf("开启挂起中断允许失败\r\n"); } } //发送数据函数 /*void CAN_TRANSMIT(void) { TxMeg.DLC=8; TxMeg.StdId=0x0000; TxMeg.ExtId=0x2018; TxMeg.IDE=CAN_ID_STD; TxMeg.RTR=CAN_RTR_DATA; uint8_t TR_BUF[8]={0,1,2,3,4,5,6,7}; HAL_CAN_AddTxMessage(&hcan,&TxMeg,TR_BUF,(uint32_t*)CAN_TX_MAILBOX0); // if(!=HAL_OK) // { // printf("發送失敗"); // } }*/ uint8_t CANx_SendNormalData(CAN_HandleTypeDef* hcan,uint16_t ID,uint8_t *pData,uint16_t Len) { CAN_TxHeaderTypeDef TxMeg1; TxMeg1.IDE=CAN_ID_STD;//CAN_ID_EXT; TxMeg1.RTR=CAN_RTR_DATA; uint32_t USR_USED_MAILBOX = 0; HAL_StatusTypeDef HAL_RetVal; uint16_t SendTimes,SendCNT=0; uint8_t FreeTxNum=0; TxMeg1.StdId=ID; if(!hcan || ! pData ||!Len) return 1; SendTimes=Len/8+(Len%8?1:0); FreeTxNum=HAL_CAN_GetTxMailboxesFreeLevel(hcan); TxMeg1.DLC=8; while(SendTimes--) { if(0==SendTimes){ if(Len%8) TxMeg1.DLC=Len%8; } while(0==FreeTxNum) { FreeTxNum=HAL_CAN_GetTxMailboxesFreeLevel(hcan); } HAL_Delay(1); //没有延时很有可能会发送失败 HAL_RetVal=HAL_CAN_AddTxMessage(hcan,&TxMeg1,pData+SendCNT, &USR_USED_MAILBOX); // *pTxMailbox = (uint32_t)1 << transmitmailbox; 需要注释 if(HAL_RetVal!=HAL_OK) { return 2; printf("凯斯\r\n"); } SendCNT+=8; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步