bsp: add CAN-FD and loopback support#11579
Conversation
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
📌 Code Review Assignment🏷️ Tag: bsp_mcxaReviewers: @hywing Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2026-07-07 07:59 CST)
📝 Review Instructions
|
- Extend flexcan driver with CAN-FD TX/RX and FD frame parsing - Add loopback and loopback+listen-only mode handling - Fix mailbox layout, clock init, and safe controller deinit - Add debug assert handlers for frdm-mcxa366 board
3544929 to
3994359
Compare
|
@waldenice 麻烦把引脚和时钟的初始化提交上来,然后最好能提供一下验证能正常收发的截图,谢谢! |
已增加,请审阅! |
是不是没有推送上了,应该需要有pin_mux.c\h,clock_config.c\h |
pin_mux / clock_config 已经在 FRDM-MCXA366 板级 BSP 基线。 CAN FD 和经典 CAN 共用 FlexCAN0 和同一组 TX/RX 引脚;引脚复用与复位释放与是否 FD 无关,基线里配好 CAN0 即可。
所以本次提交不涉及改这两个文件。 |
拉取/合并请求描述:(PR description)
为什么提交这份PR (why to submit this PR)
MCXA BSP 的 FlexCAN 驱动原先仅支持经典 CAN 的基本收发,缺少 CAN-FD、回环(loopback)和只听(listen-only)模式支持,无法满足 CAN-FD 应用及驱动自测需求。同时
frdm-mcxa366在 Debug 构建下缺少标准 assert 处理函数,断言失败时无法输出有效调试信息。你的解决方案是什么 (what is your solution)
增强
drv_can.cFlexCAN 驱动:RT_CAN_CMD_SET_CANFD/RT_CAN_CMD_SET_BAUD_FD控制命令RT_CAN_MODE_LOOPBACK)和回环+只听模式(RT_CAN_MODE_LOOPBACKANLISTEN),回环模式下通过轮询完成 TX/RX 自测RT_CAN_MODE_LISTEN)支持TX_MB_IDX=0,RX_MB_IDX=1),完善时钟初始化与控制器复位流程在
frdm-mcxa366/board/board.c中增加 Debug 断言处理函数(__assert_func/__aeabi_assert),断言失败时通过rt_kprintf输出信息并触发断点,便于调试。请提供验证的bsp和config (provide the config and bsp)
BSP:
bsp/nxp/mcx/mcxa/frdm-mcxa366.config:
验证方式:
can设备上设置 loopback 模式,执行can_sample或 MSH 命令收发,确认 TX/RX 正常CONFIG_RT_CAN_USING_CANFD,设置 FD 波特率(默认 2 Mbps),在 loopback 模式下收发 FD 帧,确认数据长度与内容正确action:
https://github.com/<your-username>/rt-thread/actions/workflows/manual_dist.yml)CAN0 引脚复用
FlexCAN 外设时钟(驱动层)
入口:
rt_hw_can_init()(板级组件自动导出)_can_config()也会调用文件:
Libraries/drivers/drv_can.cCAN0 静态配置
{ .name = "can0", .base = CAN0, .instance = 0, .irqn = CAN0_IRQn, .clock_div_name = kCLOCK_DivFLEXCAN0, .clock_attach_id = kFRO_HF_DIV_to_FLEXCAN0, },_can_enable_periph_clock()做了什么CLOCK_EnableClock(kCLOCK_GateFLEXCAN0)CLOCK_SetClockDiv(kCLOCK_DivFLEXCAN0, 2)CLOCK_AttachClk(kFRO_HF_DIV_to_FLEXCAN0)频率估算:
Boot 后 FRO HF = 180 MHz,FRO_HF_DIV 通常也为 180 MHz(÷1),再经 FlexCAN 分频 ÷2 → FlexCAN 模块时钟约 90 MHz。
配置/发送前会调用
CLOCK_GetFlexcanClkFreq(0)读实际频率,用于 500 kbps 位时序计算;若为 0 则报错退出。验证截图
截图为 CAN FD 内部环回测试验证
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up