完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我测试了示例 FDCAN_Com_IT。FDCAN 配置复制如下。 当我从另一个 ID 不同于 0x111 的板传输帧时,无论如何都会在“HAL_FDCAN_RxFifo0Callback”函数中接收到消息。我想这个配置应该只接受 ID = 0x111 的帧。 我确实验证了 FDCAN1->GFC = 0x00。当我在'中强制 FDCAN1->GFC = 0x3F HAL_FDCAN_Init '函数,我只能接收 ID = 0x111 的帧。 这是 HAL 中的错误吗?还是这个配置不对? 如何更改扩展 ID = 0x011111111 的配置,并使用掩码仅接收此 ID? 阿里。 hfdcan.Instance = FDCANx; hfdcan.Init.FrameFormat = FDCAN_FRAME_FD_BRS;hfdcan.Init.Mode = FDCAN_MODE_NORMAL;hfdcan.Init.AutoRetransmission = ENABLE;hfdcan.Init.TransmitPause = 禁用;hfdcan.Init.ProtocolException = ENABLE;hfdcan.Init.NominalPrescaler = 0x1; /* tq = 标称预分频器 x (1/fdcan_ker_ck) */hfdcan.Init.NominalSyncJumpWidth = 0x8;hfdcan.Init.NominalTimeSeg1 = 0x1F; /* NominalTimeSeg1 = Propagation_segment + Phase_segment_1 */hfdcan.Init.NominalTimeSeg2 = 0x8;hfdcan.Init.DataPrescaler = 0x1;hfdcan.Init.DataSyncJumpWidth = 0x4;hfdcan.Init.DataTimeSeg1 = 0x5; /* DataTimeSeg1 = Propagation_segment + Phase_segment_1 */hfdcan.Init.DataTimeSeg2 = 0x4;hfdcan.Init.MessageRAMOffset = 0;hfdcan.Init.StdFiltersNbr = 1;hfdcan.Init.ExtFiltersNbr = 0;hfdcan.Init.RxFifo0ElmtsNbr = 2;hfdcan.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;hfdcan.Init.RxFifo1ElmtsNbr = 0;hfdcan.Init.RxBuffersNbr = 0;hfdcan.Init.TxEventsNbr = 0;hfdcan.Init.TxBuffersNbr = 0;hfdcan.Init.TxFifoQueueElmtsNbr = 2;hfdcan.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;hfdcan.Init.TxElmtSize = FDCAN_DATA_BYTES_8;HAL_FDCAN_Init(&hfdcan); /* 配置 Rx 过滤器 */sFilterConfig.IdType = FDCAN_STANDARD_ID;sFilterConfig.FilterIndex = 0;sFilterConfig.FilterType = FDCAN_FILTER_MASK;sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;sFilterConfig.FilterID1 = 0x111;sFilterConfig.FilterID2 = 0x7FF; /* 对于接受,MessageID 和 FilterID1 必须完全匹配 */HAL_FDCAN_ConfigFilter(&hfdcan, &sFilterConfig); /* 将 Rx FIFO 0 水印配置为 2 */ HAL_FDCAN_ConfigFifoWatermark(&hfdcan, FDCAN_CFG_RX_FIFO0, 2); /* 激活 Rx FIFO 0 水印通知 */HAL_FDCAN_ActivateNotification(&hfdcan, FDCAN_IT_RX_FIFO0_WATERMARK, 0); /* 准备 Tx 头 */TxHeader.Identifier = 0x111;TxHeader.IdType = FDCAN_STANDARD_ID;TxHeader.TxFrameType = FDCAN_DATA_FRAME;TxHeader.DataLength = FDCAN_DLC_BYTES_8;TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;TxHeader.BitRateSwitch = FDCAN_BRS_ON;TxHeader.FDFormat = FDCAN_FD_CAN;TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;TxHeader.MessageMarker = 0; /* 启动 FDCAN 模块 */HAL_FDCAN_Start(&hfdcan); |
|
相关推荐
1个回答
|
|
我们确认示例中缺少 HAL_FDCAN_ConfigGlobalFilter。
实际上,默认情况下,如果未配置 GlobalFilter,所有不匹配的帧都会被接受并重定向到 RxFIFO0。在这个例子中,匹配的帧也被重定向到 RxFIFO0。 因此,在启动 FDCAN 模块之前应添加以下调用: /* 配置全局过滤器拒绝所有不匹配的帧 */ HAL_FDCAN_ConfigGlobalFilter(&hfdcan, FDCAN_REJECT, FDCAN_REJECT, FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE); 该修复将在下一版本的 STM32CubeH7 固件包中实现。 要更改扩展 ID = 0x011111111 的配置并使用掩码仅接收此 ID: a/ 进入 FDCAN Init 结构,将扩展 ID 过滤器的数量设置为 1: hfdcan.Init.ExtFiltersNbr = 1; b/ 更改 Rx 过滤器配置如下: /* 配置 Rx 过滤器 */ sFilterConfig.IdType = FDCAN_EXTENDED_ID; sFilterConfig.FilterIndex = 0; sFilterConfig.FilterType = FDCAN_FILTER_MASK; sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; sFilterConfig.FilterID1 = 0x011111111; sFilterConfig.FilterID2 = 0x1FFFFFFF; /* 对于接受,MessageID 和 FilterID1 必须完全匹配 */ HAL_FDCAN_ConfigFilter(&hfdcan, &sFilterConfig); c/ 不要忘记全局过滤器配置(上面的修复) 2/ 事实上,FIFO1 不接收消息不是错误,也不是错误的配置。只是在示例中 FIFO1 未激活(Rx FIFO1 元素数 = 0): hfdcan.Init.RxFifo1ElmtsNbr = 0; (在 FDCAN 初始化结构中) 此外,Rx 过滤器配置为将匹配的帧存储在 FIFO0 中: sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2451 浏览 1 评论
3158 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1725 浏览 1 评论
3543 浏览 6 评论
5903 浏览 21 评论
882浏览 4评论
1260浏览 4评论
在Linux上安装Atollic TRUEStudio的步骤有哪些呢?
526浏览 3评论
使用DMA激活某些外设会以导致外设无法工作的方式生成代码是怎么回事
1243浏览 3评论
1297浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-28 16:33 , Processed in 0.976748 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号