本篇实测三项外设:CAN-FD、USB 主机、SD 卡槽,另附 USB 带宽归因与存储测速口径两条通用结论。全程串口 COM25(115200)下发命令,板端跑 Buildroot + Linux 6.1.141,验证靠预编译 C 工具和 BusyBox 命令。MIPI-CSI 摄像头没有 sensor 模块、USB gadget 本轮不做。
一、CAN-FD:软件全通,收发器损坏中断
控制器与驱动先验证到位:设备树使能 can@21d40000,引脚复用选 M1 组(RX=引脚 22,TX=引脚 29),重编后只需重烧 boot 分区。
用户态第一个坑:板端 ip 是 BusyBox 精简版,不支持 type can 语法,位时序设不进去,Rockchip 官方文档(RK-KF-YF-C44)的示例命令同样跑不了。解法是自制 rtnetlink 工具 canset/canset2,直接设 IFLA_CAN_BITTIMING:
/usr/share/model/canset2 can0 500000 2000000 up
/usr/share/model/canset can0 show
回读:brp=6、tseg1=85、tseg2=13,297 MHz ÷ (6×99) = **精确 500 kbps**,采样点 86.9%(文档引用的 CiA 推荐为 87.5%),接口 UP、mtu 72、error-active,与 CANalyst-II 出厂时序(16 tq、87.5%)匹配。环回模式自发自收也正常——但这是控制器内部自 ACK 的假象,证明不了总线上有信号。
物理层接 MAX3051 收发器(3.3V,TXD→引脚 29、RXD→引脚 22)和 CANalyst-II 分析仪联调(500 kbps 标准帧、120 Ω 终端开启),双向不通:板端发帧,TEC 几秒冲到 256(无 ACK),分析仪零帧;分析仪发帧,板端 candump 同样零帧,REC 恒 0——总线始终是干净隐性电平,排除了波特率不匹配和 CANH/CANL 反接。重焊连接线、修复收发器与板子未共地、逐脚核对接线后复测依旧。软件层可查项全部排除后,故障定位到收发器本体:MAX3051 芯片损坏,总线无任何差分信号输出。手头没有备用收发器,CAN 实测到此中断。
cansend can0 123#11223344
/usr/share/model/canset can0 show | grep -E 'berr|state'
# berr counters: TEC=256 REC=0
# state: 1 (error-warning)

二、USB 主机:四类设备全通
1×USB 3.0 + 3×USB 2.0/1.1,挂 xHCI/EHCI/OHCI 三控制器。四类设备枚举、挂载、读写全部通过:
| 设备 |
链路 |
结果 |
| PL2731 读卡器 + SD 卡 |
USB 2.0 → sda |
真实口径写26.4 MB/s、冷读29.5 MB/s |
| vivo 手机 |
USB 2.0 → sr0 |
ISO9660 虚拟光驱(内装 vivo 助手),MTP 缺 libmtp,访问不了主存储 |
| USB 摄像头 |
UVC → video52 |
MJPG 1920×1080 抓帧有效,实测28.34 fps |
| Kingston U 盘 |
USB 3.0 →5 Gbps |
读66.7 MB/s、写7.0 MB/s |
lsusb; lsblk
v4l2-ctl -d /dev/video52 --set-fmt-video=width=1920,height=1080,pixelformat=MJPG \
--stream-mmap --stream-count=1 --stream-to=/data/cam_frame.jpg
两个坑:UVC 摄像头反复开关会触发驱动锁流(VIDIOC_REQBUFS busy,只能重启恢复),测试全程只开 2 次流;手机"存储"是固件模拟的光驱,不是真实主存储。

三、USB 2.0 带宽归因
读卡器链路三级瓶颈叠加:USB 2.0 协议硬顶 40~50 MB/s → PL2731(BOT 无 UASP)30~40 MB/s → SD 卡本体约 38 MB/s。实测 26.4/29.5 MB/s 已摸到读卡器水位;要更快就换 USB 3.0 读卡器或直插板载卡槽。
四、USB 3.0 对照
同一介质换口对比:裸设备冷读 29.5 → 66.7 MB/s(2.3 倍),证明瓶颈在前两级不在板端 xHCI;写速反而 26.4 → 7.0 MB/s,被 U 盘闪存本体卡死。链路走的是 BOT 不是 UASP,想吃满 5 Gbps 需换 UASP SSD。
五、存储测速口径
本轮踩坑后定的规矩,后续存储测速照此执行:
- 写必须
conv=fsync,否则是页缓存速度(本轮 228 MB/s 假写速)
- 读先
sync && echo 3 > /proc/sys/vm/drop_caches,否则读的是内存(1.3 GB/s 假读速)
- 刚写完的文件即使清缓存仍可能命中盘控内部缓存(90.5 MB/s 假高),持续读以裸设备或盘内大文件冷读为准
- 口径不同的数字不能横向对比
六、SD 卡槽
两张卡均协商 SDR104 [url=/u/198]@198[/url] MHz,热插拔正常、无需重启:
| 卡 |
识别 |
裸设备读 |
fsync 写 |
| 16 GB Class 10 SDHC |
SDR104 |
38.6 MB/s |
37.3 MB/s(vfat) |
| 64 GB A1 SDXC |
SDR104 |
84.8 MB/s(理论上限的 86%) |
14.1 MB/s(FUSE exFAT) |
64 GB 卡裸读逼近 UHS-I 上限,证明板端 SDIO 控制器能跑满带宽;16 GB 卡瓶颈在卡本身。14.1 MB/s 是 FUSE 用户态开销下的下限,不代表卡真实写速。持续写入场景建议 V30 以上高速卡 + ext4 分区。
七、小结
USB 主机与 SD 卡槽全通:四类 USB 设备即插即用、链路速率自动协商,SDIO 控制器能跑满 UHS-I 带宽。CAN-FD 是唯一未通项:设备树、驱动、位时序全部验证通过,物理层联调定位为 MAX3051 收发器芯片损坏,实测中断;工具已固化板端持久区 /usr/share/model/,换收发器后再补多档速率、FD 报文(canfdtest)和总线负载实测。