前阵子折腾 Orange Pi 5 Plus发现网上关于这块 RK3588 板子的资料虽然不少但要把 UART、I2C、SPI、PWM、CAN 这几个接口一次性全部开起来的内容基本是碎片化的。有人只讲串口有人只讲 I2C还有人贴的代码和当前内核版本根本对不上。我自己踩了好几次坑把从硬件准备到系统配置、再到逐个验证接口的完整流程整理了一遍。这篇文章不会跟你扯太多理论重点是可复现的操作步骤和一份可以直接抄的配置清单。不管你是想外接传感器、驱动屏幕、控制舵机风扇还是要在机器人上玩 CAN 总线这套流程都能帮你省下大量翻文档的时间。1. 动手之前先搞清这五个接口是干嘛的1.1 从协议层面给初学者做个速成扫盲在操作之前我建议你先花十分钟理解这五个接口各自是什么否则后面出了问题根本不知道从哪里排查。UART通用异步收发器两根线 TX 和 RX加上共地全双工异步通信。通信双方要约定波特率常见的有 9600、115200。典型设备是 GPS 模块、蓝牙模块、TTL 摄像头、调试串口。你在示波器或逻辑分析仪上看到的 UART 波形就是一条高低电平按起始位、数据位、停止位顺序排列的脉冲串。I2C集成电路总线两根线 SDA 和 SCL都是开漏输出所以总线上必须接上拉电阻。很多人不理解为什么 I2C 一定要开漏加上拉核心原因是多设备挂在同一根线上时任何一个设备都可以主动把线拉低从而实现线与逻辑避免总线冲突。上拉电阻选 4.7k 最常见但电阻值不是随便定的选小了拉不低选大了信号沿太慢都会导致通信失败。SPI串行外设接口四根线 MOSI、MISO、SCLK、CS主机主动控制时序传输速度可以拉到几十兆。CS 片选有硬件片选和软件片选两种玩法硬件片选由控制器自动拉低软件片选就是你手动控制一个 GPIO 去拉低 CS 引脚。SPI 的模式CPOL/CPHA 组合有四种接不同芯片时经常要试。PWM脉宽调制严格说它不是通信协议而是调整方波占空比的手段。固定频率下通过调节高电平的时间比例来控制输出等效电压典型应用是舵机角度控制、电机调速、LED 调光、四针风扇调速。CAN控制器局域网络双线差分信号 CANH 和 CANL抗干扰能力强适合工业控制、车辆和机器人场景。跟前面几个接口不一样CAN 不能只接线就能玩必须外接 CAN 收发器芯片并且总线两端要接 120 欧姆终端电阻。1.2 RK3588 的家底与 40pin 引脚资源Orange Pi 5 Plus 用的是 RK3588这颗芯片在接口资源上相当大方可用的 UART 十几路I2C、SPI、PWM 也各有好几组还带两个 CANFD 控制器。但芯片有这个资源不代表板子上都引出来了实际能用哪些取决于 40pin 排针的引脚定义。以官方 wiki 和常见的设备树 overlay 为例我整理了下面这张常用映射表功能引脚对应接口资源典型用途UART0 TX8uart0外接串口模块、GPSUART0 RX10uart0同上I2C2 SDA3i2c2OLED、传感器I2C2 SCL5i2c2同上SPI0 MOSI19spi0TFT 屏、FlashSPI0 MISO21spi0同上SPI0 SCLK23spi0同上SPI0 CS024spi0同上PWM811pwm8舵机、风扇、调光PWM913pwm9同上CAN1 TX19can1与 SPI0 复用CAN1 RX21can1与 SPI0 复用注意这块板子的引脚复用关系比较绕一个物理引脚往往被三四种功能争抢。比如 19 脚和 21 脚白天是 SPI0 的 MOSI/MISO切换到 CAN 功能后就是 CAN1 的收发引脚。所以不要盲目照抄别人的配置先对着官方原理图或 wiki 核对一遍自己手里的版本。1.3 影响范围开完这些口你能做什么很多人问我折腾这些接口到底图什么说白了接口全开意味着这块板子的扩展能力被彻底释放外接 BNO055、MPU6050、SHT30 这类传感器做环境监测或姿态解算驱动 0.96 寸 OLED 屏、SPI 接口 TFT 屏做低成本显示终端用 PWM 控制 MG996R 舵机、直流电机驱动器和四针风扇搭机器人或散热系统通过 CAN 总线把多块开发板、电机驱动器、IMU 接在一条总线上做分布式控制系统配合 PLC、仪表做工业现场的数据采集原型验证。这些场景加起来基本覆盖了嵌入式爱好者拿到这块板子后百分之八十的玩法。2. 准备工作硬件、系统和接线2.1 硬件清单和避坑我实际操作时用的这套东西你基本都能买到Orange Pi 5 Plus4G 或 8G 版本都可以区别不大USB-C 电源适配器建议 5V/5A 以上至少也要 4ATF 卡16G 以上或者 NVMe 固态硬盘杜邦线若干公对母、母对母都备一点USB 转 TTL 串口模块CH340、CP2102、FT232R 都行Linux 内核一般自带驱动插上就能识别FT232R 如果系统没识别再单独装驱动逻辑分析仪或者示波器验证波形时会省很多事。新手最容易忽略的是电源。RK3588 全速跑的时候电流不低供电不稳最典型的表现就是外设一吃电流板子就重启或者接口时好时坏。所以电源这块别省劣质适配器会让你怀疑是配置问题其实是供电问题。实测下来我遇到过不止一次换个电源就好了的情况。2.2 系统镜像选择与基础环境接口配置虽然也可以手动做但不同系统的处理方式差异很大。我的建议是直接上 Armbian原因很现实armbian-config 这个工具能省下大量手工改设备树的时间而且社区用户多资料好找。Orange Pi 官方系统和 Debian 桌面版也能用但配置路径会不一样下面教程还是以 Armbian 为主。烧录系统这一步就不细说了用常规的写卡工具把 Armbian 镜像写到 TF 卡第一次开机按提示设置 root 密码和普通用户。进入系统后先把软件源缓存刷新一下sudo apt update sudo apt install -y i2c-tools can-utilsi2c-tools 是后面扫描 I2C 设备必须的can-utils 是测试 CAN 接口必须的提前装上。2.3 接线三大纪律不管接哪个接口下面这三条是绝对不能违反的违反任何一条都可能烧引脚甚至烧芯片电平必须匹配Orange Pi 5 Plus 的 GPIO 是 3.3V 电平不能直接接 5V 逻辑的设备。如果对方是 5V 逻辑需要加电平转换模块。交叉接线UART 接线必须 TX 接对方的 RXRX 接对方的 TX直连是收不到数据的。I2C 和 SPI 则是对应引脚直连。必须共地两个设备之间的 GND 一定接上否则通信会时好时坏波形乱七八糟。我见过很多人明明接线顺序全对就是忘了共地然后浪费一下午排查。如果你要接四针 PWM 风扇顺便提醒一句四针风扇的线序一般是红色正极、黑色负极、黄色测速信号、蓝色 PWM 控制信号。PWM 调速风扇的蓝色线是开漏输出需要加上拉电阻才能被主板识别常见做法是接一个 4.7k 上拉到 5V。3. 保姆级实操用 armbian-config 开启全部接口3.1 打开配置菜单armbian-config 是 Armbian 自带的图形化配置工具用方向键和空格操作。终端里执行sudo armbian-config然后按下面的路径进入硬件配置System - Hardware有的新版本菜单里可能叫 System - Peripherals名字略有差异但逻辑一样。进入之后你会看到一个可以打勾的列表里面列出了这个内核版本支持的所有设备树 overlay。这就是所谓的一键开启实际原理是帮你把 overlay 加载项写进启动配置不需要你自己编辑设备树。3.2 逐个勾选并附上配置清单在 Hardware 菜单里用方向键上下选择空格键打勾。针对这五个接口我的推荐勾选是uart0 i2c2 spi0 pwm8 pwm9 can1这里有个选择逻辑如果你暂时用不上 CAN可以先不勾 can1因为它和 spi0 抢引脚。后面要用 CAN 时再把 spi0 关掉重启用 CAN或者反过来。一次全部勾上不是不行但前提是你确实不需要在 SPI0 和 CAN1 之间切换。勾选完成后按保存退出然后重启sudo reboot重启完成后你可以看到一份等效的配置清单方便以后对照接口overlay 配置名对应设备节点主要用途UARTuart0/dev/ttyS0串口通信I2Ci2c2/dev/i2c-2传感器、OLEDSPIspi0/dev/spidev2.0 或 spidevX.0屏幕、FlashPWMpwm8 / pwm9/sys/class/pwm/pwmchipX舵机、风扇、调光CANcan1网络接口 can0/can1分布式控制3.3 看看它到底改了什么armbian-config 做的事情并不神秘本质是修改了 /boot/armbianEnv.txt 这个文件。重启后你可以自己打开看cat /boot/armbianEnv.txt你会看到类似这样的内容verbosity1 bootlogofalse overlay_prefixrockchip overlaysuart0 i2c2 spi0 pwm8 pwm9 can1 rootdevUUIDxxx其中最关键的就是overlays这一行。启动时 U-Boot 会根据这行内容从 /boot/dtb/rockchip/overlay/ 目录加载对应的 .dtbo 文件把它们叠加到设备树上去。所以即使你不想用 armbian-config手动编辑这个文件加同样的内容也能达到效果这就是下一节要说的进阶路线。4. 进阶手工修改设备树 overlay4.1 设备树和 overlay 到底是什么先打个比方。设备树Device Tree就是告诉 Linux 内核这块板子上有什么硬件、引脚怎么分配的一张接线图说明书。编译产物是 DTB 文件放在启动分区里。overlay 则是这张大图上的补丁片用来覆盖或新增某个硬件节点的配置比如把某个引脚从默认的 GPIO 功能切换成 I2C 功能。每块 RK3588 板子的基础 DTB 文件是固定的但不同用户想要的外设组合不一样。官方不可能为每种组合都编一个完整的 DTB于是就有了 overlay 机制基础 DTB 保持不动你要什么功能就叠加对应的 .dtbo 补丁文件。这样既灵活又不会把基础配置搞乱。4.2 手动编辑 armbianEnv.txt如果你想完全绕开 armbian-config或者 armbian-config 列表里没有你要的接口可以手动编辑配置文件sudo nano /boot/armbianEnv.txt把 overlays 行改成overlaysuart0 i2c2 spi0 pwm8 pwm9保存后重启即可。这里要注意的是overlay 名字必须和 /boot/dtb/rockchip/overlay/ 目录下的文件名对得上。先查看一下当前有哪些可用ls -l /boot/dtb/rockchip/overlay/ | grep -E rk3588-(uart|i2c|spi|pwm|can)不同内核版本的 overlay 数量差异很大有的内核只有 uart0 和 i2c2有的把大量外设 overlay 都补齐了。如果目录里没有 can1说明你这个内核版本的 Armbian 还没包含这个补丁后面我再说怎么办。4.3 查看 an overlay 支持哪些参数有些 overlay 还带可调参数典型的比如 SPI 的 spidev 是否启用param_spidev_spi0_enabletrue那么问题来了怎么知道一个 overlay 支持哪些参数两种办法。一是用 strings 直接查看编译好的 .dtbo 文件strings /boot/dtb/rockchip/overlay/rk3588-spi0.dtbo | less看到类似param_spidev_spi0_enable和它后面的描述文字就是这个补丁支持的参数。二是直接查内核源码里的 rk3588-*.dts 文件这个更直观能看到完整的引脚配置和 pinctrl 定义。我建议初学者至少会用第一种方法因为很多问题就是参数名写错了导致接口不生效。5. CAN 接口不是勾选就行后面还有三步5.1 CAN 为什么和其他接口不一样前面说过CAN 是差分信号必须外接收发器芯片才能通信。RK3588 内部集成的是 CANFD 控制器它输出的不是 CANH/CANL 电平而是普通的 TTL 电平的 CAN_TX 和 CAN_RX 信号。要把这两个信号转成差分对需要接一个三块五块的收发器模块常见的有 SN65HVD230、MCP2551、TJA1050 这些。另外 CAN 总线的两端必须接 120 欧姆终端电阻这是为了消除信号反射。很多收发器模块上面自带终端电阻和跳线开关接两个节点时两头各使能一个就行如果买的是不带电阻的裸板就需要自己在总线上并联。5.2 开启并把 CAN 口拉起来假设你在 overlay 里已经启用了 can1重启后系统里大概率会出现一个网络接口叫 can0 或 can1。先确认一下dmesg | grep -i can ip link | grep can ls /sys/class/net/ | grep can能看到 can 网络接口后把它配置成需要的波特率并启用sudo ip link set can0 up type can bitrate 500000 ip -details link show can0这个 bitrate 参数要和你总线上所有节点一致常见的选择是 125k、250k、500k、1M。总线长度越短速率可以拉得越高几十米的总线老老实实用 125k 或 250k。如果你的 Armbian overlay 里没有 can1 怎么办先别急着换系统检查一下内核是否已经编译了 CAN 驱动。我遇到过一种情况是设备树里 CAN 节点默认是 disabled但驱动已经在了。这时候可以看一下当前 dmesg 里有没有rockchip-canfd或者canfd相关的 probe 信息如果驱动在只是节点没打开那就可以自己写一个很简单的 overlay 把它启用或者直接用 fdtoverlay 手动把补丁迭加上去具体内容参考同芯片其他板子的写法改一下 compatible 和 pinctrl 即可。5.3 实测通信与常见坑启用成功后先做一次自环测试确认控制器本身没毛病sudo ip link set can0 down sudo ip link set can0 type can bitrate 500000 loopback on sudo ip link set can0 up cansend can0 123#DEADBEEF candump can0如果自环能收到自己发的帧说明控制器工作正常。然后关掉回环模式把两块板子的 CANH 接 CANH、CANL 接 CANL、两端各接一个 120 欧姆电阻再互发数据sudo ip link set can0 down sudo ip link set can0 up type can bitrate 500000 # 板子 A 上发 cansend can0 123#12345678 # 板子 B 上收 candump can0CAN 和 CANL 接反或者忘记接终端电阻时表现往往是发帧时提示no ack或者总线上大量错误帧。这类问题排查时优先查接线别一上来就怀疑配置。实测下来90% 的 CAN 不通都出在这两个地方。6. 接口开启后怎么验证6.1 设备文件逐个核对重启完成后最直接的办法就是看系统是否生成了对应的设备节点。我习惯先把这些文件过一遍接口检查命令预期结果UARTls -l /dev/ttyS*出现 ttyS0I2Cls -l /dev/i2c-*出现 i2c-2SPIls -l /dev/spidev*出现 spidevX.0PWMls /sys/class/pwm/出现 pwmchipXCANip link show can0出现 can 接口设备节点有了再逐个做功能验证。UART 最简单的测试是回环把 TX 和 RX 用杜邦线短接然后用两个终端操作stty -F /dev/ttyS0 115200 echo hello /dev/ttyS0 cat /dev/ttyS0如果能打印出 hello说明串口收发链路没问题。I2C 用 i2cdetect 扫描总线i2cdetect -y 2如果总线上挂了设备会列出设备的地址编号。SPI 可以写个简单的 Python 脚本用 spidev 库发几个字节的 0x55然后用示波器或逻辑分析仪看 SCLK 和 MOSI 上有没有波形更简单的做法是把 MOSI 和 MISO 短接发什么收什么。PWM 的验证放在下面一节。6.2 PWM 输出验证与波形观察PWM 在 Linux 里不是设备文件而是 sysfs 属性节点。先找到你的 pwmchip然后按下面流程导出通道cd /sys/class/pwm ls # 找到对应板子的 pwmchip可能是 pwmchip0、pwmchip2 或其它 cd pwmchip0 echo 0 export cd pwm0 ls不同内核版本下这里的文件名可能是period和duty_cycle也可能是pwm_period和pwm_duty_cycle进去 ls 一眼就能分辨。配置一个舵机标准的 50Hz 信号echo 20000000 period echo 1500000 duty_cycle echo 1 enableperiod 的单位是纳秒20000000 纳秒就是 20 毫秒对应 50Hz。duty_cycle 设置 1500000 纳秒就是 1.5 毫秒高电平对应舵机中位。你可以把手头一个舵机或者 LED 接上去看它是否确实动作。如果手上只有万用表可以量到占空比变化时平均电压在变如果万用表测频率也能读出大概 50Hz。要想看真正的方波波形还是逻辑分析仪或示波器最直观高电平时间、周期、占空比一目了然。6.3 用逻辑分析仪看真实波形验证这些接口逻辑分析仪是我最推荐的低成本工具几十块钱的八通道就够用了。把探针接在对应引脚上可以直观看到UART 波形一条空闲时高电平的线上起始位拉低、数据位翻转、停止位拉高波特率对了才能正确解码I2C 波形SCL 有规律的时钟脉冲SDA 在时钟低电平期间翻转数据起始条件是 SCL 高电平时 SDA 拉低SPI 波形SCLK 节拍清晰CS 低电平拉整个传输窗口MOSI/MISO 分别在时钟边沿采样PWM 波形固定的周期占空比变化时只有高电平宽度在变。这三个总线和 PWM 的时序特征对照你看到的真实波形排查问题会快得多。很多资料上画了时序图但你没见过真实波形第一次排查时可能不敢确认多看几次就熟了。7. 常见问题排查记录7.1 勾选了 overlay 却没有产生设备节点这个是最常见的问题。先确认重启了吗armbian-config 保存后必须重启才会生效。重启后还是不行就按顺序查dmesg | grep -iE overlay|uart|i2c|spi|pwm|can|error看有没有加载失败的报错。常见的坑是 overlay 名字写错比如把 uart0 写成了 uart_0或者某个 overlay 依赖另一个 overlay 必须先加载。还有一种可能是你同时启用了两个抢同一组引脚的 overlay比如就在一个 config 里同时写了 spi0 和 can1这种情况设备树加载时不会直接报错但其中一个功能就是起不来因为引脚被对方占了。7.2 UART 读不到数据或者乱码UART 的坑大概就是这么几类我按出现概率排一下TX 和 RX 接反了这是最常见的交叉对接才对没有共地两个设备之间 GND 必须连通波特率不匹配两端一个 9600 一个 115200 必然乱码权限不够普通用户访问 /dev/ttyS0 报 Permission denied把用户加到 dialout 组再退出重新登录sudo usermod -aG dialout $USER7.3 I2C 扫描不到设备i2cdetect 扫描不到设备时先检查设备地址是不是不在默认扫描范围有些传感器地址在 0x77 以上可以用-i参数扫描全范围。硬件上重点查上拉电阻这个我很早之前踩过大坑I2C 的上拉电阻值不对会导致信号质量差上拉电阻选小了设备拉不低总线通信自然失败选大了信号上升沿太慢高速通信会出错。板载 I2C 上拉一般已经做好但如果你长距离飞线信号衰减会很明显这时候要么缩短杜邦线要么手动加上拉电阻。另外线太长或者接了太多次转接也会导致时序不满足。7.4 SPI 发了数据但是设备没反应SPI 设备没反应第一个要查的是模式。很多 SPI 设备只支持某一种 CPOL/CPHA 组合你默认的模式不对设备就会直接不响应。换个模式再试或者看设备手册确认。第二个是时钟频率有些器件对 SCLK 频率有上限比如只能跑 1MHz 以下你把频率拉太高就会通信失败。第三个是片选逻辑硬件片选和软件片选混用的时候CS 时序会被打乱导致数据没被正确锁存。7.5 PWM 没有输出PWM 没有输出九成是这三个原因。一个是选错了 pwmchipRK3588 有好几组 PWM 控制器引到 40pin 的是其中某几个通道你要先确认引脚对应的到底是哪个 pwmchip 的哪个通道。第二个是没有 export 成功或者 export 之后没有写 enable1。第三个是 period 和 duty_cycle 的单位搞错了写成微秒而不是纳秒那频率会差一千倍实际效果就是舵机不动或者风扇直接满转。下面整理成速查表方便以后对着排查现象优先排查项顺序接口全部未出现是否重启、overlay 名、dmesg1UART 无数据TX/RX 接反、共地、波特率、权限1 → 4I2C 扫不到地址范围、上拉电阻、线长1 → 3SPI 无响应CPOL/CPHA 模式、时钟频率、片选1 → 3PWM 无输出pwmchip 编号、export、period 单位1 → 3CAN 发送无 ACKCANH/CANL 接反、终端电阻、bitrate1 → 37.6 权限问题统一处理最后把权限问题统一说一遍。玩这些接口普通用户经常碰到 Permission denied。除了 UART 需要加入 dialout 组I2C 和 GPIO 在新内核里通常也要求对应组或者干脆用 udev 规则放开。偷懒的做法是每次都用 sudo但长期调试下来很麻烦。一次性把常用组都加上sudo usermod -aG dialout,ssh,gpio,spi,i2c $USER然后注销重新登录之后大部分接口设备文件就能直接访问。8. 最后分享一点实际经验我个人在实际操作中的体会是接口配置这件事最忌讳的就是一次全开完然后不复盘。我刚开始折腾的时候把 uart0、i2c2、spi0、pwm、can1 一口气全勾上重启之后到处找不到设备最后发现是 SPI0 和 CAN1 的引脚冲突两个功能互相打架。后来我养成了习惯每次只开一个接口验证通过之后再开下一个这样出了问题定位非常快。另外我强烈建议你把自己验证过的有效配置记录下来包括 overlay 名字、引脚号、设备节点、验证命令因为不同内核版本的 Armbian 改版频繁升级一次内核可能就有一半配置要对不上这时候你手头有记录就能快速恢复。这块板子的接口开启到这里就算完整跑通了后面不管是接传感器、挂屏幕、控制舵机还是搭 CAN 总线网络都有了稳定的基础。最后再分享一个小技巧调试时先在本地做回环测试再连真实外部设备能把板子问题和外部设备问题清晰分开省下的时间远比你想象的要多。