赞
踩
CAN收发器是外接器件,(例如:TJA1050)作用:把差分信号转换为MCU能能识别的TTL信号。
CAN_TxHeaderTypeDef TxHeader; //发送 CAN_RxHeaderTypeDef RXHeader; uint8_t TXmessage[8] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77}; uint8_t RXmessage[8]; uint32_t pTxMailbox = 0; uint8_t CAN1_Send_Msg(uint8_t* msg,uint8_t len) { uint8_t i=0; uint32_t TxMailbox; uint8_t message[8]; TxHeader.StdId=0X12; //标准标识符 TxHeader.ExtId=0x12; //扩展标识符(29位) TxHeader.IDE=CAN_ID_STD; //使用标准帧 TxHeader.RTR=CAN_RTR_DATA; //数据帧 TxHeader.DLC=len; for(i=0;i<len;i++) { message[i]=msg[i]; } if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, message, &TxMailbox) != HAL_OK)//发送 { return 1; } while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) != 3) {} return 0; } void MX_CAN1_Init(void) { hcan.Instance = CAN1; hcan.Init.Prescaler = 9; hcan.Init.Mode = CAN_MODE_NORMAL; hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; hcan.Init.TimeSeg1 = CAN_BS1_5TQ; hcan.Init.TimeSeg2 = CAN_BS2_2TQ; hcan.Init.TimeTriggeredMode = DISABLE; hcan.Init.AutoBusOff = ENABLE; hcan.Init.AutoWakeUp = ENABLE; hcan.Init.AutoRetransmission = DISABLE; hcan.Init.ReceiveFifoLocked = DISABLE; hcan.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan) != HAL_OK) { Error_Handler(); } CAN_FilterTypeDef sFilterConfig; sFilterConfig.FilterActivation = ENABLE;//打开过滤器 sFilterConfig.FilterBank = 0;//过滤器0 这里可设0-13 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//采用掩码模式 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//采用32位掩码模式 sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;//采用FIFO0 sFilterConfig.FilterIdHigh = 0x0000; //设置过滤器ID高16位 sFilterConfig.FilterIdLow = 0x0000;//设置过滤器ID低16位 sFilterConfig.FilterMaskIdHigh = 0x0000;//设置过滤器掩码高16位 sFilterConfig.FilterMaskIdLow = 0x0000;//设置过滤器掩码低16位 if(HAL_CAN_ConfigFilter(&hcan,&sFilterConfig) != HAL_OK)//初始化过滤器 { Error_Handler(); } if(HAL_CAN_Start(&hcan) != HAL_OK)//打开can { Error_Handler(); } if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)//开启接受邮箱0挂起中断 { Error_Handler(); } } void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)//接受邮箱0挂起中断回调函数 { if(hcan->Instance==CAN1) { HAL_CAN_GetRxMessage(hcan,CAN_FILTER_FIFO0,&RXHeader,RXmessage);//获取数据 } }
把CAN接受到的数据通过串口打印出来
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了stm32 CAN的使用,而stm32 CAN提供了大量能使我们快速便捷地处理数据的函数和方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。