资讯动态

Orange Pi 5 Plus 40Pin接口配置:UART/I2C/SPI/PWM/CAN全攻略

发布时间:2026/9/24 8:59:01 来源:尧图企业网站定制
Orange Pi 5 Plus的40Pin接口可以说是这块板子最吸引人的地方但也是新手最容易栽跟头的地方。很多人从树莓派或Arduino转过来拿到板子习惯性地把传感器、显示屏往排针上一插结果发现UART没数据、I2C扫不到设备、SPI读不到寄存器、PWM引脚纹丝不动最后只能怀疑板子坏了。实际上问题并不在硬件而是Orange Pi 5 Plus默认状态下这些接口大部分都没有被系统“使能”。今天这篇教程就是围绕如何把UART、I2C、SPI、PWM、CAN这五类常用通信接口一次性配置到位来写的目标是把原理讲清楚、把步骤列明白、把坑提前告诉你。不管你是刚接触SBC开发的新手还是从STM32阵营转过来的老手这篇都值得收藏备用。我会从RK3588S的引脚复用机制讲起然后依次给出系统准备、逐个接口的开通步骤、最终配置清单以及我实际调试中踩过的各种问题。内容全部基于Orange Pi官方Debian/Armbian系镜像的操作方式其他第三方镜像虽然路径可能略有变化但思路完全通用。1. 为什么Orange Pi 5 Plus“没有现成的接口”可用1.1 一个物理引脚能当八种功能用IOMUX决定了“听谁的”先看硬件层面。Orange Pi 5 Plus用的SoC是瑞芯微RK3588S这颗芯片的引脚复用Pin Mux设计比很多单片机器件复杂得多单个物理引脚通常对应三到八种可选功能。比如某个排针上的引脚既可以作为UART3的TX也可以作为SPI0的MOSI还可以作为GPIO1_B2具体做哪一种工作取决于内嵌的IOMUX控制寄存器怎么配置。这跟STM32的AFIO重映射是一个逻辑只不过在ARM64的Linux系统下你基本不会直接去操作寄存器而是靠设备树告诉内核这个引脚现在我要拿来当什么用。这时候问题就来了。为了兼容尽可能多的使用场景官方系统在出厂时绝大部分引脚都被设置成了默认的GPIO模式其他复用功能全部处于关闭状态。原因很实在板卡厂商不知道你会把UART接在哪个物理引脚上也不知道你是打算用I2C还是SPI既然猜不准那就先全部当GPIO用然后留一个“开关”让你在配置里自己选。这个开关就是Linux的设备树覆盖Device Tree Overlay。1.2 Device Tree Overlay加载机制一键开启的本质是拼装dtbo设备树Device TreeDTB是Linux在ARM平台用来描述板级硬件资源的标准手段。简单理解它就是一张“接线说明书”告诉内核哪个引脚连接了哪个外设、外设的时钟是多少、中断号是多少。完整的设备树由基础文件加上各个overlay片段组成。Orange Pi系统在开机时Bootloader会读取/boot/orangepiEnv.txt里的overlays这个配置项把对应的dtbo片段拼接到主设备树dtb上再传给内核。比如你在配置里写了overlaysuart3-m1启动时系统就会把uart3-m1.dtbo这个文件加载进去将UART3的引脚复用、时钟、设备节点全部注册到内核。所谓“一键开启”本质上就是这么一次拼接动作。这里我建议先记住一个最核心的排查思路接口不出现99%的原因不是硬件坏了而是dtbo没有加载成功或加载了但引脚冲突导致节点被内核丢弃。1.3 和STM32裸机/Arduino配置方式的差异很多从STM32转过来的朋友会陷入一个习惯性误区觉得既然它能像单片机一样通过寄存器配置复用我能不能直接在代码里操作寄存器当然可以但强烈不建议。Orange Pi跑的是完整Linux系统硬件资源由内核统一管理如果你在用户态程序里绕过设备树直接写IOMUX寄存器很可能和内核驱动发生冲突轻则功能异常重则导致系统卡死。更正统的思路是先在设备树层面把接口打开然后通过Linux标准接口如/sys/class/pwm、/dev/i2c-N、/dev/spidevX.Y去使用它。Arduino和STM32的库函数是在裸机上直接操作寄存器而Orange Pi是“用户程序 - 内核驱动 - 硬件寄存器”的完整链路。修改设备树就是在这条链路上提前把“硬件能力”声明好后续一切操作都建立在设备节点之上。2. 动手之前先把这三样东西准备好2.1 系统镜像和内核版本overlay名字与内核严格对应我踩过一个大坑在网上找了一段别人写的配置里面写着overlaysuart3-m1但在我的系统上死活不生效最后发现是因为内核版本不同那个overlay名字在官方仓库里已经改成了uart3-m1加一个后缀或者干脆被合并进其他dtbo里了。这个现象在Orange Pi系列上特别明显因为官方系统维护比较活跃设备树文件经常会调整。比较稳妥的做法是去官方下载最新的Debian或Ubuntu镜像不要在旧镜像上强行套新overlay教程。另外开机后建议先看一眼内核版本uname -a如果内核版本在5.10以上但低于6.x大部分经典overlay名字都可用如果是6.x内核注意检查官方社区是否有大版本兼容说明。这里说的“6.x”只是我遇到的版本跨度具体以你手上的系统为准。2.2 批量安装三类工具配置、查看、验证既然要开接口下面这些工具基本是刚需。我分成三类来装实测在官方Debian/Ubuntu源里都有sudo apt update sudo apt install -y device-tree-compiler i2c-tools pwm-config? no keep simple实际命令我会分开写清楚# 第一组配置和查看 sudo apt install -y device-tree-compiler # 第二组I2C扫描与读写 sudo apt install -y i2c-tools # 第三组串口调试 sudo apt install -y minicom python3-serial # 第四组CAN报文收发 sudo apt install -y can-utils # 第五组SPI验证spidev_test通常需要单独编译或来自libspidev sudo apt install -y libspidev-devtool的安装状态用which检查即可which dtc minicom i2cdetect candump其中dtc是设备树编译器后面检查overlay是否生效、手动编译dts时会用到。i2cdetect是I2C总线扫描神器。candump用于CAN报文抓取。这几个工具覆盖面已经很完整了。2.3 动手前先备份再学会看启动日志如果你买来板子后已经做过一些尝试或者系统是从第三方渠道下载的我建议先直接备份关键配置文件然后重置干净再继续sudo cp /boot/orangepiEnv.txt /boot/orangepiEnv.txt.bak如果不确定系统使用的是/boot/orangepiEnv.txt还是/boot/armbianEnv.txt先确认ls -l /boot/*Env.txtOrange Pi官方镜像一般是orangepiEnv.txtArmbian镜像则是armbianEnv.txt。后续所有配置都在对应的这个文件里改。修改之前还要学会看三个关键信息# 查看所有GPIO和引脚复用状态 sudo cat /sys/kernel/debug/gpio # 查看设备树中所有节点的状态 ls /proc/device-tree/ # 查看内核启动时设备树相关的日志排查overlay加载失败信息 sudo dmesg | grep -i overlay每次改完overlay并重启后dmesg | grep -i overlay如果没有任何报错说明dtbo至少是正常加载的。接下来就逐个验证设备节点是否出现。3. 五路接口逐一开通UART、I2C、SPI、PWM、CAN3.1 UART串口是排障的基础先从这里下手UART不同overlay的选取核心是看物理引脚位置。你需要对照板子的40Pin引脚图确认你的设备要接在哪个UART哪个Mux位置。常见的别名有uart0-m0、uart1-m0、uart2-m0、uart3-m1、uart4-m2等等后缀里的m0/m1/m2代表不同的引脚组合。以uart3-m1为例在/boot/orangepiEnv.txt里这样加overlaysuart3-m1如果已经有其他overlay就用空格分隔overlaysuart2-m0 i2c3-m0 spi0-mx保存后重启sudo reboot重启后查看是否生成了对应设备ls -l /dev/ttyS*uart3-m1这类命名对应关系通常会生成/dev/ttyS3但不绝对因为不同dtbo里serial别名可能映射到ttyS1或ttyS4。最直接的确认方式是sudo dmesg | grep -i ttyS看到类似ttyS3 at MMIO 0xfebc0000的字段说明设备节点已注册。验证UART最常见的方法是回环测试。把板子的TX引脚和RX引脚用一根杜邦线直接短接然后开两个串口会话一个收一个发或者更简单用串口调试工具发送数据看能不能原样收回来。用minicom -D /dev/ttyS3打开配置波特率根据你的设备设置常用115200或9600然后往TX发字符串如果RX能收到同样的字符串链路就是通的。更精简的方式是直接用Pythonpython3 -c import serial; sserial.Serial(/dev/ttyS3,115200); s.write(bOrangePi); print(s.read(8))串口接线还有一个极其容易被忽视的细节设备与开发板之间必须共地。如果你的外部设备是独立供电的但没有把GND连到Orange Pi的GND电平参考点不一样收到的数据必然是乱码。我调试时就因为漏接GND白折腾了两个小时。3.2 I2C开总线、扫设备、顺便搞懂上拉电阻I2C的开启方式和UART几乎一样。在overlays里加上你需要的总线名称比如overlaysi2c3-m0重启后先用i2cdetect -l查看系统里所有I2C总线sudo i2cdetect -l输出里会出现i2c-0到i2c-9之类的列表但总线编号和overlay名字里的数字不一定对应。比如i2c3-m0可能生成的是/dev/i2c-3也可能因为别名冲突变成/dev/i2c-5。别想当然看列表是最快的。确认总线编号后在对应的总线上扫描设备地址sudo i2cdetect -y 3如果有一个Sensor接在总线上扫描结果会在对应的十六进制地址上显示编号。比如常见的BMP280气压计地址是0x76OLED屏常用0x3C。如果扫描结果全是--就检查接线和上拉电阻。说到这里顺便回应一下网上问得很多的问题I2C为什么要开漏输出加外部上拉电阻因为I2C总线协议要求多设备共享一对线SCL和SDA所有设备的驱动输出都设计成开漏形式。开漏输出只能主动拉低到GND不能主动输出高电平所以必须通过外部上拉电阻把总线电平“拉”到VCC。当没有任何设备拉低时总线默认高电平当某个设备想发0时它把线拉低就行了。这种设计解决了多主机抢占总线时的电平冲突问题。Orange Pi 5 Plus的40Pin上启用I2C后SoC片内已经集成了上拉电阻大多数情况下不需要你额外外接但如果总线过长超过20cm或挂载设备过多还是建议外接4.7kΩ或2.2kΩ上拉电阻拉到3.3V以确保信号边沿够陡、通信稳定。i2c-tools里还有i2cget、i2cset可以用来直接读写寄存器对验证硬件很好用# 读取0x76地址设备的0xD0寄存器 sudo i2cget -y 3 0x76 0xD03.3 SPI回环测试走一遍把硬件片选和软件片选说清楚SPI的overlay以spiX-mx的形式出现比如spi0-mx是SPI0的通用开启选项。在overlays里加上overlaysspi0-mx重启后查看设备ls -l /dev/spidev*正常会看到/dev/spidev0.0、/dev/spidev0.1这样的设备节点其中第一个数字是SPI控制器编号第二个数字是片选通道。验证SPI最实用的是回环测试短接MOSI和MISO引脚再用spidev_test工具发送数据。如果硬件没问题发送的数据和接收的数据应该是完全一致的。编译spidev_test也很简单git clone https://github.com/rm-hull/spidev-test.git cd spidev-test make sudo ./spidev_test -D /dev/spidev0.0 -l-l参数就是loopback模式它会自动把MOSI和MISO的数据做对比输出spi mode: 0x0和发送/接收的十六进制数据。两边一致SPI链路就是通的。关于硬件片选与软件片选我要多说一点。SPI从设备通常都用一根CS引脚来判断总线上的命令是不是发给自己的。默认情况下Linux的spidev驱动会在每次传输前后自动拉低/拉高CS线这是硬件片选应用层不需要管。但有些特殊场景比如你需要手动控制CS以适配一些奇怪的从设备时序那就要把设备树里SPI节点的cs-gpios属性配置成GPIO使用软件片选。具体做法是在overlay里声明对应GPIO修改设备树dtsspi0 { cs-gpios gpio1 12 GPIO_ACTIVE_LOW; };这里需要引用你板子上对应GPIO的bank和引脚号。软件片选的好处是时机控制更灵活坏处是实时性不如硬件自动切换。接一颗普通Flash芯片、SD卡之类硬件片选完全够用只有用非标准SPI时序器件时才考虑软件片选。3.4 PWM先算周期再谈占空比风扇和呼吸灯都吃这套PWM接口的overlay命名方式是pwmX-mY例如pwm0-m0、pwm1-m1等。在overlays里加上后重启。接着查看PWM芯片节点ls /sys/class/pwm/看到pwmchip0、pwmchip1这类目录后先确认每个chip下面的通道cat /sys/class/pwm/pwmchip0/npwm这个文件显示当前PWM控制器支持几个通道。以很多RK3588板子为例一个pwmchip里通常对应多个pwmN通道export时会体现出来。使能一个PWM通道的标准流程如下# 进入对应pwmchip目录 cd /sys/class/pwm/pwmchip0 # export 通道0 sudo echo 0 export # 设置周期单位纳秒。20ms 20000000ns对应50Hz常用于舵机控制 sudo echo 20000000 pwm0/period # 设置占空比。例如1ms高电平对应5%占空比 sudo echo 1000000 pwm0/duty_cycle # 使能输出 sudo echo 1 pwm0/enable如果你手头有示波器此时就能看到对应的方波输出没有示波器也可以接一个LED加上限流电阻通过亮度变化判断PWM是否生效。用LED做测试时我在实际调试中发现一个规律对于1kHz左右的低频PWMLED亮度变化会有明显闪烁感想要肉眼看到“亮度连续可调”的呼吸灯效果建议把频率提高到5kHz以上。这里要特别注意PWM的典型应用参数舵机控制周期20ms50Hz占空比1ms到2ms对应0度到180度这个参数几乎成了舵机的事实标准。电机调速如果是驱动MOS管做直流电机调速PWM频率一般选在10kHz到20kHz之间能有效避开人耳可闻噪声。四线风扇调速25kHz是很多电脑风扇的推荐频率占空比越高转速越快。设置时先确认你外设的输入规格再决定频率和占空比。另外PWM是数字方波信号如果用来驱动电机这类感性负载必须通过MOS管或驱动器做功率放大不能直接把PWM引脚接到电机两端否则SoC引脚瞬间就会被反电动势冲掉。3.5 CAN内置控制器 外部收发器缺了后者完全不能工作Orange Pi 5 Plus的SoC内部集成了CAN控制器这是很多同价位SBC没有的优势。你不需要再外挂MCP2515这种独立的CAN控制芯片只需要把CAN_TX/CAN_RX这两个引脚接到一颗CAN收发器上比如TJA1050或SN65HVD230然后由收发器连接到CAN_H和CAN_L总线。运行时启用比较常见的是can0-m0或者can1-m0同样在overlays里加对应项。重启后先安装tool并尝试启用接口sudo apt install -y can-utils sudo ip link set can0 up type can bitrate 500000如果没有任何报错接口就进入工作状态了。用ip -details link show can0能看到can0: NOARP,UP,LOWER_UP mtu 16 qdisc pfifo_fast state UNKNOWN qlen 10 can state ERROR-ACTIVE (berr-counter tx 0 rx 0) bitrate 500000state ERROR-ACTIVE表示控制器已经上线。接下来用candump监听总线报文sudo candump can0同时开另一个终端用cansend主动发送一帧标准帧ID 0x123数据DEADBEEFsudo cansend can0 123#DEADBEEF如果收发器连接正常且总线上有其他CAN节点两边应该能互相收到报文。需要特别提醒的是CAN不像UART那样可以通过短接TX和RX做回环自测。CAN收发器在总线上发送的报文不会被同一个控制器当作接收报文回显除非CAN控制器的Loopback模式被打开所以最简单的验证方式就是接两个带CAN功能的板子对发或者用USBCAN分析仪监听。4. 接口配置总清单按这张表抄作业就行我把五类接口的overlay命名、使能后的设备节点、验证命令汇总成一张总表方便你以后快速查阅。以Orange Pi官方Debian/Armbian系系统为例接口类型overlay示例生成的关键设备节点验证命令示例UARTuart3-m1/dev/ttyS3等minicom -D /dev/ttyS3I2Ci2c3-m0/dev/i2c-3等sudo i2cdetect -y 3SPIspi0-mx/dev/spidev0.0spidev_test -D /dev/spidev0.0 -lPWMpwm0-m0/sys/class/pwm/pwmchip0echo 0 /sys/class/pwm/pwmchip0/exportCANcan0-m0can0网络接口sudo ip link set can0 up type can bitrate 500000注意这张表里的overlay名不保证在任意版本全适用正式接线前请先参照你板子对应的原理图核对物理引脚再通过dmesg确认加载情况。配置文件的最终形态大概是这样的多个接口同时开启时用空格分隔overlaysuart3-m1 i2c3-m0 spi0-mx pwm0-m0 can0-m0我个人通常遵循一个习惯每次只加一个接口重启验证一次。原因很简单如果一次把五个接口全部加上一旦某个引脚冲突你排查起来要在一个大杂烩环境里定位难度成倍增加。批量操作看起来很高效实际调试成本反而更高。另外无论哪个接口都建议把测试脚本或命令记录下来方便下次刷系统后快速恢复环境。5. 我踩过的坑这六大问题最容易出现5.1 overlay写了但设备节点不存在这大概是最常见的一个坑。我分析过几种原因一是overlays这行拼写不完整被系统静默忽略二是文件名本身和教程里的对不上当前内核仓库里已经改过名三是同一个引脚被两个overlay同时声明导致后加载的节点被内核丢弃。排查路径我建议是这样先检查配置文件是否被正确读取cat /proc/cmdline看内核命令行里是否包含你配置的overlay名。如果没有说明Bootloader根本没加载它优先检查orangepiEnv.txt的语法特别是overlays前面不能有奇怪的缩进或注释符号。如果命令行里能看到overlay名但设备节点还是没有再用dmesg | grep overlay看内核报错信息多半能看到failed to apply或pin conflict之类的关键词。5.2 UART输出乱码乱码问题绝大多数出在三个环节波特率不匹配、电平不匹配、地线没共地。波特率不匹配好理解设备端设置了115200而板子用了9600收出来全是乱码电平不匹配则更隐蔽Orange Pi的UART是3.3V TTL电平如果你的USB转串口工具输出的是5V TTL或者你直接把带RS232电平的设备接到了板子上通信必然失败还可能损伤引脚。建议所有外设一律确认电平域最好通过电平转换芯片再接入。GND共地这一点前面说过独立供电的模块一定要和Orange Pi共地否则信号参考点漂移同样会出现随机乱码。5.3 I2C扫描不到设备先确认总线号别想当然用i2c-3就一定能扫到设备。有些I2C总线在板卡上被其他外设占用比如HDMI的DDC通道或者PMIC虽然i2cdetect -l能看到但并不是所有总线都接在40Pin上。正确做法是查阅原理图确认你启用的I2C总线对应哪个控制器再对照i2cdetect -l输出里的地址段找到正确总线编号。接着确认设备地址。很多传感器有多个可选地址比如通过SA0引脚拉高拉低改变末位地址。另外注意某些设备的地址是7位模式某些手册上标的是8位模式左移一位看手册时别搞混。最后再判断上拉电阻和接线多设备共用总线时如果某个设备把SCL或SDA拉死整条总线都会瘫痪这种情况i2cdetect会显示一片空白或集中在0x00地址上。5.4 SPI回环测试数据不一致我在调试SPI的时候遇到过好几次这种诡异现象发送0xAA板子收到的却是0x55。后来发现是MOSI和MISO接反了。SPI是双工通信发数据的同时也在收数据如果MOSI和MISO交叉连接发送端会收到发送数据的逻辑反相结果。另一个可能性是接线虚焊或杜邦线接触不良高速传输时偶尔丢字节。先把频率调到1MHz以下再测排除信号完整性干扰。5.5 PWM没有输出PWM使能这一步看着简单但很容易栽在通道号上。别拿到pwmchip0就无脑echo 0 export应该先看npwm确认你需要的通道索引是否存在。以RK3588为例有的pwmchip索引下有多个pwm编号需要参考硬件原理图确定某个PWM通道接在40Pin的具体引脚上再找到对应的chip和channel。或者看dmesg | grep pwm内核日志里一般会打印PWM控制器注册信息能帮助你对应。另外PWM输出操作通常需要root权限如果你用普通用户运行echo 1 enable提示Permission denied要么加上sudo要么给/sys/class/pwm配置相应的udev规则。5.6 CAN接口起不来或监听不到报文CAN接口起不来第一件事就是检查外部收发器。没有收发器仅靠SoC的CAN_TX/CAN_RX引脚是无法在总线上产生差动电压的ip link set can0 up虽然不报错但状态可能一直是ERROR-ACTIVE或BUS-OFF。收发器供电也要单独确认TJA1050通常需要5V供电SN65HVD230需要3.3V别把电源接错。监听不到报文还有一个常见因素终端电阻。CAN总线两端要求各接一个120Ω终端电阻如果只接一个收法器板子且没有终端电阻信号反射会导致通信不稳定甚至完全不通。短距离调试可以直接在CAN_H和CAN_L之间并一个120Ω电阻问题立竿见影。最后再分享一点实际心得我在Orange Pi系列上折腾接口配置最大的感悟是设备树这层东西本质上就是一个“硬件状态管理表”你给的配置越明确系统运行越省心。与其在用户态里各种尝试绕过系统不如老老实实把overlay配好让内核去接管硬件资源。有几个小习惯我坚持了很久在这里一并分享给你。第一每次修改orangepiEnv.txt前用cp做备份并且给备份文件加上日期后缀方便回滚。第二配置里不要同时开启所有可用接口只开当下需要的既能降低引脚冲突概率也能减少系统启动时的驱动加载负担。第三遇到问题第一时间查dmesg它比任何教程都诚实。第四UART、I2C、SPI这类低速接口可以先跑起来再考虑接实际外设PWM和CAN要格外留意电平匹配和线路规划尤其是CAN的收发器和终端电阻这两样省了哪一个都不可能正常工作。这套接口配置流程不只在Orange Pi 5 Plus上适用用RK3588、RK3568等其他瑞芯微芯片的板子思路基本一致。你把overlay机制和排错方法摸透了以后换任何一款SBC都能很快上手。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价