EG64X (RK3506) CAN 通信使用例程 —— 操作命令
=============================================================

【例程简介】
   EG64X 提供 2 路带隔离 CAN（CAN FD）：can0 / can1，均为 2 针凤凰端子。
   本例程演示 socketcan 接口的配置与启用、周期发送测试帧、
   非阻塞接收并分类打印总线上所有帧（区分 标准/扩展帧、经典/FD 帧），
   通过源码宏开关支持经典 CAN 与 CAN FD 两种模式。
   登录：ssh root@192.168.5.1（默认密码 123456，以设备实际 IP 为准，下同）

一、上传文件到设备
   在 PC 上执行（以 /userdata 为例）：
       scp can_test.c root@192.168.5.1:/userdata/
   Windows 下若无 scp，可用 pscp：
       pscp -pw 123456 can_test.c root@192.168.5.1:/userdata/

二、C 版（板上编译，设备预装 gcc 11.4.0）
   登录设备后：
       cd /userdata
       gcc can_test.c -o can_test -Wall
       ./can_test                  # 默认：经典 CAN 500k，can0
   运行后：每 1 秒发送一帧 ID=0x123（DE AD BE EF），
   同时非阻塞接收并打印总线上所有帧（区分 标准/扩展帧、经典/FD 帧）。
   Ctrl+C 安全退出。

   切换为 CAN FD / can1（编辑源码宏后重新编译）：
       # 用编辑器修改 can_test.c 顶部宏开关，然后重新编译
       #define CAN_IF_NAME "can1"   # 目标接口：can0 / can1
       #define USE_CANFD   1        # 1=启用 CAN FD（500k/2M, fd on），发送 64 字节长帧
       gcc can_test.c -o can_test -Wall
       ./can_test
       # 注意：不要在命令行加 -DUSE_CANFD=1（会与源码中的 #define 重复定义冲突），
       #       直接修改源码里的宏再编译即可。

三、快速 shell 测试（免编译，can-utils 已预装）
   1) 经典 CAN 500k（注意：必须加 fd off）：
          ip link set can0 down
          sleep 2
          ip link set can0 up type can bitrate 500000 fd off
      开启后台监听：
          candump can0 &
      发送标准帧（8 字节内）：
          cansend can0 123#DEADBEEF
      发送扩展帧（29 bit ID）：
          cansend can0 00000123#11.22.33.44.55.66.77.88
      查看接口状态：
          ip -details -statistics link show can0

   2) CAN FD 500k/2M（fd on，dbitrate 设数据段波特率）：
          ip link set can0 down
          sleep 2
          ip link set can0 up type can bitrate 500000 dbitrate 2000000 fd on
          candump can0 &
      发送 FD 长帧（64 字节）：`##` 后第 1 个字符是 flags（0~F，flags=0 写 0），
      **flags 之后直接跟 128 个十六进制字符（64 字节），不要用点分隔，也不要多加字符**：
          cansend can0 123##0000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F

   3) 测试结束断开接口：
          ip link set can0 down

四、回环测试
   1) 单接口自发自收：socketcan 默认开启回环（CAN_RAW_LOOPBACK=1），
      本机会收到自己发出的帧，可用来验证协议栈收发；
      但无对端时总线上没有 ACK，会触发重发与错误计数上升，
      不能验证总线物理收发。推荐用下面 can0↔can1 对接方式。
   2) 推荐：用本机 can0 与 can1 对接验证（两路 CAN 都在设备上）：
       - can0 的 A 接 can1 的 A、can0 的 B 接 can1 的 B（必要时共地）；
       - 终端电阻拨码保持默认关闭（短接调试时须保持全部关闭，
         只开一端会造成单向不通）。
       - 终端 1：配置 can1 并监听
            ip link set can1 down; sleep 2
            ip link set can1 up type can bitrate 500000 fd off
            candump can1
       - 终端 2：配置 can0 并运行例程（或 cansend 发送）
            ./can_test            # 会配置 can0 经典 500k 并周期发送 0x123
            # 或手动：ip link set can0 down; sleep 2; ip link set can0 up type can bitrate 500000 fd off
            #        cansend can0 123#DEADBEEF
       - candump 终端应能收到对端发来的帧；反过来用 cansend can1 456#11223344，
         can_test 终端应能打印收到的帧。
   3) 或两台设备总线对接：A 设备 can0 接 B 设备 can0（A-A、B-B、共地），
      A 发送、B candump 监听。
   4) 测试结束断开接口：
       ip link set can0 down
       ip link set can1 down
      （can_test 退出时不会自动 down 接口，需要手动执行）

五、注意事项
   1. 重要提示：出厂默认 fd on。使用经典 CAN 时必须加 "fd off"，
      否则配置位速率报 Invalid argument。
   2. 速率切换必须慢：先 down，等约 2 秒再 up 设置新速率，
      高速 -> 低速切换存在竞态，过快会假丢帧。
   3. 终端电阻：2P 琴键拨码开关控制，出厂默认关闭；
      长线缆应用时在总线两端各开启 120Ω 终端电阻，短接调试保持全部关闭。
   4. 波特率范围：
      经典 CAN：10k / 20k / 50k / 100k / 125k / 250k / 500k / 800k / 1M
      CAN FD：仲裁段最高 1M，数据段最高 8M（BRS）
   5. 帧格式：标准帧（11 bit）+ 扩展帧（29 bit）；经典数据 0~8 字节，
      FD 数据 0~64 字节（BRS 变速）。
