NS800RT7P65D 上基于 RT-Thread 的CAN/CAN-FD 驱动测试应用| 技术集结

来源:RT-Thread操作系统 嵌入式开发 4 次阅读
摘要:目录 引言与背景 硬件环境 软件配置 驱动架构概述 环回模式测试 真实设备对测 测试结果与日志 常见问题与总结 免费试用报名 1 引言与背景 1.1 概述 NS800RT7P65 是 纳芯微(NOVOSENSE)推出的 NSSine™系列 MCU,片内集成了 FLEXCAN 控制器,支持 CAN 2.0B 和 CAN-FD (ISO 11898-1:2015) 协议。 本文档基于 RT-Thre

目录

引言与背景

硬件环境

软件配置

驱动架构概述

环回模式测试

真实设备对测

测试结果与日志

常见问题与总结

免费试用报名

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 设备进行互操作调试。

相关推荐
评论区

登录后即可参与讨论

立即登录