目录

引言与背景
硬件环境
软件配置
驱动架构概述
环回模式测试
真实设备对测
测试结果与日志
常见问题与总结
免费试用报名
1 引言与背景
1.1 概述
NS800RT7P65 是 纳芯微(NOVOSENSE)推出的 NSSine™系列 MCU,片内集成了 FLEXCAN 控制器,支持 CAN 2.0B 和 CAN-FD (ISO 11898-1:2015) 协议。
本文档基于 RT-Thread 设备驱动框架,介绍如何对 NS800RT7P65 BSP 中的 CAN/CAN-FD 驱动进行系统化测试。整套测试代码位于 applications/test_can.c,涵盖:
-
13 个经典 CAN 环回测试 — 覆盖设备打开/关闭、多波特率、DLC 变化、数据完整性、模式切换、扩展帧、稳定性、压力、非阻塞发送、错误处理
-
10 个 CAN-FD 环回测试 — 覆盖 FD 使能/禁用、扩展 DLC (12~64 字节)、64 字节数据完整性、帧元数据验证、FD↔Classic 模式切换、独立数据段波特率、混合帧、FD 稳定性、FD 压力、FD 非阻塞发送
-
6 个真实设备 MSH 命令 — 经典 CAN 和 CAN-FD 的 TX / RX / Monitor 三种工作模式
所有环回测试不需要外部 CAN 硬件即可运行;真实设备测试需要配合 USB-CAN 分析仪或另一个 CAN 节点。
1.2 测试目标

2 硬件环境
2.1 开发平台

2.2 CAN 引脚接线
NS800 CAN-FD 接口 (canfd1) 与 USB-CAN 分析仪的连接方式如下:
NS800 开发板 USB-CAN 分析仪
注意:如果 USB-CAN 分析仪是 TTL 电平接口(如 CANable、USB2CAN),可直接连 PA4/PA10;如果是标准 CAN 总线接口(DB9),需要外接 CAN 收发器(如 TJA1050/SN65HVD230)。
2.3 串口连接
调试信息和测试输出通过串口打印:
NS800 开发板 USB-TTL 模块
波特率: 115200, 数据位: 8, 校验: 无, 停止位: 1.
3 软件配置
3.1 menuconfig 配置
在 BSP 目录下执行 menuconfig,确认以下配置项已启用:
RT-Thread Kernel
上下、左右滑动查看
3.2 关键宏定义
启用上述配置后,rtconfig.h 中应包含:
#define RT_USING_CAN
3.3 测试代码集成
将 test_can.c 放入 applications/ 目录,并在 SConscript 或 IDE 工程中添加编译。测试代码通过 MSH 命令导出,无需修改 main.c。
4 驱动架构概述
4.1 配置RT-Thread CAN 设备框架
RT-Thread 的 CAN 驱动遵循标准设备模型,应用程序通过以下 5 个接口与 CAN 设备交互:
rt_device_t dev = rt_device_find("canfd1"); // 1. 查找设备
4.2 核心数据结构
structrt_can_msg
上下、左右滑动查看
4.3 测试代码架构
test_can.c 分为五个层次:
┌─────────────────────────────────────────────┐
上下、左右滑动查看
5 环回模式测试
环回模式 (Loopback Mode) 下,CAN 控制器内部将 TX 信号直接回送到 RX,无需外部接线即可完成自发自收验证。
5.1 核心测试辅助函数
以下两个函数是所有测试用例的基础:
打开 CAN 设备(经典 CAN 模式)
staticrt_err_tcan_test_open(rt_uint32_t baud, rt_uint32_t mode)
上下、左右滑动查看
打开 CAN 设备(CAN-FD 模式)
staticrt_err_tcan_test_open_fd(rt_uint32_t baud, rt_uint32_t baud_fd,
上下、左右滑动查看
*重要**:与经典 CAN 的 can_test_open() 不同,FD 版本在 rt_device_open() 之后不调用 SET_MODE / SET_BAUD,因为 _can_config 已在 CONFIG 阶段完成控制器初始化;重复调用会在中断已开启的情况下触发软复位,导致 TX 失败。*
发送并接收(环回核心原语)
staticrt_err_tcan_test_send_and_recv(struct rt_can_msg *tx_msg,
上下、左右滑动查看
RX 回调通过信号量与主线程同步:
staticrt_err_tcan_test_rx_callback(rt_device_t dev, rt_size_t size)
5.2 经典 CAN 环回测试 (Test 1-13)

数据完整性测试示例
测试 5 使用函数指针表实现 10 种数据模式,避免每种模式重复写循环:
staticconstcan_data_pattern_t s_patterns[] = {
上下、左右滑动查看
稳定性测试统计输出
测试 10 运行 1000 包后会打印详细统计:
--- Stability Statistics ---
5.3 CAN-FD 环回测试 (Test 14-23)

CAN-FD DLC 转换
CAN-FD 的 DLC 码与字节数的对应关系遵循 ISO 11898-1 标准,测试代码中实现了本地转换函数:
// DLC 码 → 实际字节数
上下、左右滑动查看
FD 帧元数据验证
测试 17 验证 4 种元数据组合:
// 组合 1: FD=1, BRS=1 (标准 ID)
上下、左右滑动查看
6 真实设备对测
真实设备测试需要将 CAN 模式切换为 NORMAL,并连接外部 CAN 节点(PC 端 USB-CAN 分析仪或另一个 MCU 节点)。
6.1 经典 CAN — MSH 命令
6.1.1 can_test_tx — 发送帧
msh /> can_test_tx <count> <can_id> [baud] [dlc]

ID 大于 0x7FF 时自动识别为扩展帧 (29-bit)。
使用示例:
# 发送 10 帧标准帧,ID=0x123, 500Kbps, 8 字节
输出示例:
=== CAN TX Test ===
6.1.2 can_test_rx — 接收帧
msh /> can_test_rx <expected_count> [timeout_sec] [baud]

行为特性:
-
打开后先显示倒计时,每秒刷新一次
-
收到第一帧时停止倒计时,打印该帧详情
-
后续帧静默收集(不逐帧打印,避免串口 IO 影响实时性)
-
收满或超时后打印统计摘要
使用示例:
# 等待接收 20 帧,超时 30 秒,波特率 500K
输出示例:
=== CAN RX Test ===
上下、左右滑动查看
6.1.3 can_test_monitor — 总线监听
msh /> can_test_monitor [duration_sec] [baud]
以 LISTEN 模式(只收不发)静默统计总线上的所有帧,每 5 秒输出一次状态行。
输出示例:
=== CAN Bus Monitor ===
上下、左右滑动查看
6.2 CAN-FD — MSH 命令
6.2.1 can_test_fd_tx — 发送 CAN-FD 帧
msh /> can_test_fd_tx <count> <id> [baud] [baud_fd] [dlc] [text]

使用示例:
# 发送 10 帧 FD,ID=0x123,仲裁 500K,数据段 2M,64 字节
输出示例:
=== CAN-FD TX Test ===
6.2.2 can_test_fd_rx — 接收 CAN-FD 帧
msh /> can_test_fd_rx <expected_count> [timeout_sec] [baud] [baud_fd]
行为与 can_test_rx 一致,额外统计 FD 帧和非 FD 帧的数量。
输出示例:
=== CAN-FD RX Test ===
上下、左右滑动查看
6.2.3 can_test_fd_monitor — CAN-FD 总线监听
msh /> can_test_fd_monitor [duration_sec] [baud] [baud_fd]
在 can_test_monitor 的基础上增加了 FD 帧和 BRS 帧的分类统计:
[5s/30] 22 frames (FD:18 BRS:18), 25s left
6.3 真实设备对测流程建议
经典 CAN 收发对测:
[PC 端 USB-CAN 分析仪] [NS800 开发板]
CAN-FD 收发对测:
[PC 端 USB-CAN 分析仪] [NS800 开发板]
7 测试结果与日志
7.1 环回测试完整输出示例
运行 can_test 后的典型输出(截取关键部分):
**********************************************
上下、左右滑动查看
7.2 真实设备测试 — 经典 CAN 验证结果

7.3 真实设备测试 — CAN-FD 验证结果

*关于 FD 接收的波特率配置**:CAN 位同步是边沿驱动的,接收方跟随发送方的信号沿采样。baud_fd 配置主要决定本机 TX 的数据段速率,对 RX 影响有限——即使本地配置 500K,只要收发器硬件支持 2M,也能正确接收 PC 发来的 2M FD 数据段。*
8 常见问题与总结
8.1 常见问题
Q1: 环回测试部分失败,但不是全部失败?
NS800 FLEXCAN 控制器的内部环回模式可能存在硬件限制,尤其在连续快速收发场景下。不影响 NORMAL 模式的真实总线通信。建议以 NORMAL 模式下的真实设备对测结果为最终判定依据。
Q2: TX 发送成功但 PC 端收不到?
检查以下几点:
-
CAN 收发器:确保 PA4/PA10 外接了 CAN 收发器芯片,仅靠 GPIO 电平无法驱动 CAN 总线
-
终端电阻:CAN 总线两端需要 120Ω 终端电阻
-
波特率匹配:分析仪和开发板波特率必须一致
-
共地:开发板和 CAN 分析仪需要共地
Q3: 扩展帧 (29-bit ID) 接收不到?
NS800 FLEXCAN 控制器中,IDE 位比较是不可屏蔽的——标准帧 RX Mailbox 只匹配标准帧,扩展帧 RX Mailbox 只匹配扩展帧。本驱动已配置两个 RX Mailbox:

如果两个 MB 都被占用或配置错误,某些帧类型将无法接收。
Q4: 发送时 TX ID 始终是 0x78?
这是原始驱动中的一个已知缺陷:FLEXCANDRV_SetTxMsg() 只拷贝数据到 mailbox 的数据区,不更新 ID 字和 CS 字。修复方式是在每次发送前显式调用:
FLEXCANDRV_SetMsgId(msgBufPtr, msg_id, is_ext_id);
当前版本的 drv_can.c 已包含此修复。
8.2 驱动已知限制

8.3 测试命令速查表

8.4 总结
本文档描述的测试方案覆盖了 NS800RT7P65 CAN/CAN-FD 驱动的全部功能路径:
-
23 个环回测试 验证了设备开/关、多波特率、DLC 变化、数据完整性、模式切换、过滤器、扩展 ID、稳定性、压力、非阻塞发送等核心功能
-
6 个 MSH 交互命令 提供了真实总线环境下的收发和监听能力
-
所有经典 CAN 和 CAN-FD 的 标准帧/扩展帧 TX/RX 在真实设备对测中均已验证通过
开发者可通过 can_test_quick 快速确认驱动基本功能,通过 can_test / can_test_fd 进行完整回归测试,通过 can_test_tx / can_test_rx 系列命令与外部 CAN 设备进行互操作调试。
评论区
登录后即可参与讨论
立即登录