CubeMX STM32H7 FDCAN

📅2026/7/15 6:12:32 👁️次浏览
CubeMX STM32H7 FDCAN
1. 引言在现代汽车电子、工业控制和嵌入式系统中控制器局域网Controller Area Network, CAN总线是应用最广泛的通信协议之一。随着技术发展对通信带宽、可靠性和功能安全的要求不断提高传统的CAN协议在某些高性能场景下逐渐显现出局限性。为此博世公司Bosch推出了CAN FDCAN with Flexible Data-Rate协议而基于此协议的控制器则被称为FDCANFlexible Data-Rate CAN Controller。经典CAN通常指遵循ISO 11898-1标准的CAN 2.0协议。它定义了两种帧格式标准帧11位标识符数据场最大8字节。扩展帧29位标识符数据场最大8字节。其通信速率在仲裁阶段和数据阶段是固定的最高可达1 Mbps实际应用中常见125 kbps, 250 kbps, 500 kbps, 1 Mbps。FDCAN是支持CAN FD协议的控制器。CAN FD协议在兼容经典CAN帧格式的基础上引入了“灵活数据速率”模式主要特点包括可变数据速率仲裁阶段使用标准速率与经典CAN相同数据阶段可使用更高的速率最高可达5 Mbps或更高取决于物理层。更大的数据场数据场长度从经典的8字节扩展到最多64字节。增强的CRC校验为更长的数据场提供了更强大的错误检测能力。FDCAN与经典CAN的主要区别特性维度经典CAN (CAN 2.0)FDCAN (CAN FD)协议标准ISO 11898-1 (CAN 2.0 A/B)ISO 11898-1:2015 (包含CAN FD)最大数据长度8 字节64 字节通信速率固定速率最高1 Mbps双速率仲裁阶段标准速率数据阶段可提速理论最高8-12 Mbps常用5 Mbps帧格式标准帧(11位ID)、扩展帧(29位ID)兼容经典帧新增FD帧带FDF位标识CRC校验15位CRC标准/扩展帧17位或21位CRC根据数据长度错误检测能力更强带宽效率较低数据场小固定速率显著提高数据场更大数据阶段速率更高硬件要求传统CAN控制器/收发器需支持CAN FD的控制器(FDCAN)和收发器向后兼容性-可配置为经典CAN模式与现有CAN网络通信典型应用车身控制、舒适系统、中低速网络自动驾驶域控制器、车载诊断(OBD)、高带宽ECU通信、新能源车电池管理1.1 帧结构差异经典CAN帧的数据场长度由DLC数据长度码的0-8表示。而CAN FD帧的DLC编码更为复杂可以表示0-8、12、16、20、24、32、48、64字节的数据长度。帧中新增的FDF (FD Frame)位、BRS (Bit Rate Switch)位和ESI (Error State Indicator)位是识别FD帧的关键。1.2 位时序与采样点由于CAN FD在数据阶段速率更高对物理层电缆、连接器和收发器的要求更严格。更高的速率意味着更短的位时间需要更精确的位时序配置和更稳定的采样点以应对信号反射和振铃的影响。1.3 错误处理与状态FDCAN控制器通常集成了更强大的错误管理和日志功能例如提供更详细的错误代码和状态寄存器便于系统诊断和功能安全如ISO 26262相关的需求。2 CubeMX STM32H7 FDCAN的使用2.1 CubeMX配置FDCAN2.1.1 基础参数设置数据帧的采样率计算如下 传输速率的计算公式如下CANFD时钟频率/[(Prescaler1)*(Time_Seg1Time_Seg23)]仲裁帧的参数设置如下使用中断接收数据配置如下2.1.2 代码编写初始化部分发送代码//FDCAN的延迟时间校准HAL_FDCAN_ConfigTxDelayCompensation(hfdcan1,hfdcan1.Init.DataPrescaler*hfdcan1.Init.DataTimeSeg1,0);HAL_FDCAN_EnableTxDelayCompensation(hfdcan1);if(HAL_FDCAN_Start(hfdcan1)HAL_OK){printf(FDCAN Start OK\n\r);}else{printf(FDCAN Start ERROR\n\r);}//准备仲裁信息FDCAN_TxHeaderTypeDef Txheader;Txheader.IdTypeFDCAN_STANDARD_ID;Txheader.Identifier0x123;Txheader.BitRateSwitchFDCAN_BRS_ON;Txheader.DataLengthFDCAN_DLC_BYTES_8;Txheader.ErrorStateIndicatorFDCAN_ESI_PASSIVE;Txheader.FDFormatFDCAN_FD_CAN;Txheader.TxEventFifoControlFDCAN_NO_TX_EVENTS;Txheader.MessageMarker0x00;Txheader.TxFrameTypeFDCAN_DATA_FRAME;//准备发送数据uint8_tbuf[8]{0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};//发送数据if(HAL_FDCAN_AddMessageToTxFifoQ(hfdcan1,Txheader,buf)!HAL_OK){printf(FDCAN Send Error!\n);}else{printf(FDCAN Send OK!\n\r);}使用中断接收代码//延迟时间校准HAL_FDCAN_ConfigTxDelayCompensation(hfdcan2,hfdcan2.Init.DataPrescaler*hfdcan2.Init.DataTimeSeg1,0);HAL_FDCAN_EnableTxDelayCompensation(hfdcan2);//设置ID过滤器FDCAN_FilterTypeDef sFilterConfig;sFilterConfig.IdTypeFDCAN_STANDARD_ID;sFilterConfig.FilterIndex0;sFilterConfig.FilterTypeFDCAN_FILTER_MASK;sFilterConfig.FilterConfigFDCAN_FILTER_TO_RXFIFO0;sFilterConfig.FilterID10x0000;sFilterConfig.FilterID20x0000;// 掩码全为0表示不检查任何ID位if(HAL_FDCAN_ConfigFilter(hfdcan2,sFilterConfig)!HAL_OK){printf(FDCAN Config Error!\n);};HAL_FDCAN_ConfigGlobalFilter(hfdcan2,FDCAN_REJECT,FDCAN_REJECT,DISABLE,DISABLE);//开启FDCAN 使能中断HAL_FDCAN_Start(hfdcan2);if(HAL_FDCAN_ActivateNotification(hfdcan2,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0)!HAL_OK){printf(FDCAN ActivateNotify ERROR!\n\r);};//在中断服务函数中接收数据FDCAN_RxHeaderTypeDef rx_header;uint8_trx_data[8];// FDCAN最大支持64字节数据uint8_tfdcan_flag0;voidHAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef*hfdcan,uint32_tRxFifo0ITs){if(hfdcan-InstanceFDCAN1){// 处理 CAN1 接收数据}elseif(hfdcan-InstanceFDCAN2){// 处理 CAN2 接收数据if((RxFifo0ITsFDCAN_IT_RX_FIFO0_NEW_MESSAGE)!RESET){if(HAL_FDCAN_GetRxFifoFillLevel(hfdcan,FDCAN_RX_FIFO0)){if(HAL_FDCAN_GetRxMessage(hfdcan,FDCAN_RX_FIFO0,rx_header,rx_data)HAL_OK){fdcan_flag1;}else{HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);}}}}}2.1.3 注意事项传输速度配置总线上的设备全都一致发送端使用FIFO发送时FIFO的大小不能为0FIFO1用来发送FIFO2用来接收不同的FDCAN的RAM偏移地址不能相同在中断处理函数中不能使用printf会卡死了