|
|
发表于 2026-1-29 19:25:41
|
显示全部楼层
本帖最后由 walk 于 2026-1-29 23:22 编辑
stm32h7 canfd配置如下,调用函数HAL_FDCAN_ConfigGlobalFilter就收不到can信息,注释就可以,过滤器是范围过来,共4个范围端,分别映射到FIFO0和FIFO1,好像默认消息是到FIFO0
void MX_FDCAN1_Init(void)
{
/* USER CODE BEGIN FDCAN1_Init 0 */
/* USER CODE END FDCAN1_Init 0 */
/* USER CODE BEGIN FDCAN1_Init 1 */
/* 第1步:基础配置 ==================================================================================*/
/* USER CODE END FDCAN1_Init 1 */
hfdcan1.Instance = FDCAN1; /* 配置FDCAN1 */
hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;/* 配置使用FDCAN可变波特率 */
hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; /* 配置使用正常模式 */
hfdcan1.Init.AutoRetransmission = ENABLE; /* 使能自动重传!传统模式下一定要关闭!!! */
hfdcan1.Init.TransmitPause = DISABLE; /* 配置禁止传输暂停特性 */
hfdcan1.Init.ProtocolException = ENABLE; /* 协议异常处理使能 */
/* 第2步:波特率配置 ==================================================================================*/
/* FDCAN中仲裁段位速率最高1Mbit/s, 数据段位速率最高8Mbit/s */
/* 仲裁段通信速率(FDCAN与传统CAN均需配置) = Fpclk1 / ((ntsg1 + ntsg2 + 1) * presc)= 70M / ((1 + 59 + 10)*1) = 1Mbit/s */
hfdcan1.Init.NominalPrescaler = 1;
hfdcan1.Init.NominalSyncJumpWidth = 10;
hfdcan1.Init.NominalTimeSeg1 = 59;
hfdcan1.Init.NominalTimeSeg2 = 10;
/* 数据段通信速率(仅FDCAN模式需配置) = Fpclk1 / ((ntsg1 + ntsg2 + 1) * presc) = 70M / ((7 + 6 + 1)*1) = 5 Mbit/s */
hfdcan1.Init.DataPrescaler = 1;
hfdcan1.Init.DataSyncJumpWidth = 6;
hfdcan1.Init.DataTimeSeg1 = 7;
hfdcan1.Init.DataTimeSeg2 = 6;
/* 第3步:RAM管理器配置 ==================================================================================*/
hfdcan1.Init.MessageRAMOffset = 0; /* CAN1和CAN2共享2560个字, 这里CAN1分配前1280字 */
hfdcan1.Init.StdFiltersNbr = 1; /* 设置标准ID过滤器个数,范围0-128 */
hfdcan1.Init.ExtFiltersNbr = 1; /* 设置扩展ID过滤器个数,范围0-64 */
hfdcan1.Init.RxFifo0ElmtsNbr = 16; /* 设置Rx FIFO0的元素个数,范围0-64 */
hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64; /* 设置Rx FIFO0中每个元素大小,支持8,12,16,20,24,32,48或者64字节 */
hfdcan1.Init.RxFifo1ElmtsNbr = 4; /* 设置Rx FIFO1的元素个数,范围0-64 */
hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_64; /* 设置Rx FIFO1中每个元素大小,支持8,12,16,20,24,32,48或者64字节 */
hfdcan1.Init.RxBuffersNbr = 4; /* 设置Rx Buffer个数,范围0-64 */
hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_64; /* 设置Rx Buffer中每个元素大小,支持8,12,16,20,24,32,48或者64字节 */
hfdcan1.Init.TxEventsNbr = 8; /* 设置Tx Event FIFO中元素个数,范围0-32 */
hfdcan1.Init.TxBuffersNbr = 8; /* 设置Tx Buffer中元素个数,范围0-32 */
hfdcan1.Init.TxFifoQueueElmtsNbr = 8; /* 设置用于Tx FIFO/Queue的Tx Buffers个数。范围0到32 */
hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; /* 设置FIFO模式或者QUEUE队列模式 */
hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_64; /* 设置Tx Element中的数据域大小,支持8,12,16,20,24,32,48或者64字节 */
if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
{
Error_Handler();
}
/* 第4步:扩展ID过滤设置 ==================================================================================*/
sFilterConfig1.IdType = FDCAN_EXTENDED_ID; /* 扩展ID */
sFilterConfig1.FilterIndex = 0; /* 用于过滤索引,扩展ID,范围0到64 */
sFilterConfig1.FilterType = FDCAN_FILTER_RANGE; /* 范围过滤 -----------------*/
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO1; /* 如果过滤匹配,将数据保存到Rx FIFO 1 */
sFilterConfig1.FilterID1 = 0x00000000; /* 屏蔽位模式下,FilterID1是消息ID */
sFilterConfig1.FilterID2 = 0x1FFFFFFF; /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
/* 第5步:标准ID过滤设置 ==================================================================================*/
sFilterConfig1.IdType = FDCAN_STANDARD_ID; /* 设置标准ID或者扩展ID */
sFilterConfig1.FilterIndex = 0; /* 用于过滤索引,标准ID,范围0到127 */
sFilterConfig1.FilterType = FDCAN_FILTER_RANGE; /* 范围过滤 -----------------*/
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
sFilterConfig1.FilterID1 = 0x420; /* 屏蔽位模式下,FilterID1是消息ID */
sFilterConfig1.FilterID2 = 0x43F; /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
sFilterConfig1.IdType = FDCAN_STANDARD_ID; /* 设置标准ID或者扩展ID */
sFilterConfig1.FilterIndex = 1; /* 用于过滤索引,标准ID,范围0到127 */
sFilterConfig1.FilterType = FDCAN_FILTER_RANGE; /* 范围过滤 -----------------*/
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO1; /* 如果过滤匹配,将数据保存到Rx FIFO 1 */
sFilterConfig1.FilterID1 = 0x460; /* 屏蔽位模式下,FilterID1是消息ID */
sFilterConfig1.FilterID2 = 0x47F; /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
sFilterConfig1.IdType = FDCAN_STANDARD_ID; /* 设置标准ID或者扩展ID */
sFilterConfig1.FilterIndex = 2; /* 用于过滤索引,标准ID,范围0到127 */
sFilterConfig1.FilterType = FDCAN_FILTER_RANGE; /* 范围过滤 -----------------*/
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
sFilterConfig1.FilterID1 = 0x4A0; /* 屏蔽位模式下,FilterID1是消息ID */
sFilterConfig1.FilterID2 = 0x4BF; /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
sFilterConfig1.IdType = FDCAN_STANDARD_ID; /* 设置标准ID或者扩展ID */
sFilterConfig1.FilterIndex = 3; /* 用于过滤索引,标准ID,范围0到127 */
sFilterConfig1.FilterType = FDCAN_FILTER_RANGE; /* 范围过滤 -----------------*/
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO1; /* 如果过滤匹配,将数据保存到Rx FIFO 1 */
sFilterConfig1.FilterID1 = 0x4E0; /* 屏蔽位模式下,FilterID1是消息ID */
sFilterConfig1.FilterID2 = 0x4FF; /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, /* 全局过滤设置 */
FDCAN_REJECT, /* 接收到消息ID与标准ID过滤不匹配,不接受 */
FDCAN_REJECT, /* 接收到消息ID与扩展ID过滤不匹配,不接受 */
FDCAN_FILTER_REMOTE, /* 过滤标准ID远程帧 */
FDCAN_REJECT_REMOTE); /* 拒绝扩展ID远程帧 */
/* 第5步:Rx FIFO0中断配置 ===================================================================*/
/* 设置Rx FIFO0的阈值为1 ---------------------------------------*/
HAL_FDCAN_ConfigFifoWatermark(&hfdcan1, FDCAN_CFG_RX_FIFO0, 1);
/* 开启RX FIFO0的阈值中断 */
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_WATERMARK, 0);
/* 第6步:Rx FIFO1中断配置 ===================================================================*/
/* 开启RX FIFO1的新数据中断 */
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);
// /* 第7步:Rx Buffer中断配置 ==================================================================*/
// /* Rx Buffer接收到新消息就触发中断 */
// HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_BUFFER_NEW_MESSAGE, 0);
/* 第8步:Tx Delay配置 ==================================================================*/
HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan1, hfdcan1.Init.DataPrescaler * hfdcan1.Init.DataTimeSeg1, 2);
/* 第9步:Tx Delays使能 ==================================================================*/
HAL_FDCAN_EnableTxDelayCompensation(&hfdcan1);
/*第10步:启动FDCAN */
HAL_FDCAN_Start(&hfdcan1);
/* USER CODE END FDCAN1_Init 2 */
}
|
|