在OpenWrt系统的Orange Pi R1 Plus LTS上启用I2C OLED SSD1306遇阻求助
Orange Pi R1 Plus LTS OpenWrt下I2C OLED SSD1306问题解决及替代方案
问题背景
本人是OpenWrt新手,但有一年树莓派Linux项目(大学毕业设计)经验,在Orange Pi R1 Plus LTS的OpenWrt 21.02.2版本(r16495-bf0c965af0)上使用I2C OLED SSD1306时遇到问题:
- 检测I2C总线0提示文件不存在,总线1检测到0x18地址显示
UU - 修改演示文件指定端口1和地址0x18后,运行报错
OSError: [Errno 16] Resource busy - 怀疑总线0未启用,但OpenWrt版本无boot文件夹,无法按官方文档操作
问题排查与解决
1. 理解i2cdetect中的UU含义
UU表示该I2C地址已被内核驱动占用,这是你运行Python脚本时报Resource busy的直接原因——用户态程序无法访问被内核驱动占用的I2C设备。
2. 启用I2C总线0的方法
OpenWrt 21.02.2没有独立boot文件夹,可通过以下步骤启用总线0:
- 先检查并加载I2C核心驱动模块:
# 查看已加载的I2C模块 lsmod | grep i2c # 如果缺少i2c_dev或sunxi_i2c(全志平台驱动),手动加载 insmod i2c_dev insmod sunxi_i2c - 通过U-Boot环境变量添加总线启用参数:
重启后再运行# 查看当前bootargs参数 fw_printenv bootargs # 在原有参数后添加i2c0=on,例如: fw_setenv bootargs "原bootargs内容 i2c0=on" # 重启设备 rebooti2cdetect -y 0,检查/dev/i2c-0是否存在。
3. 释放I2C总线1的占用资源
找到占用0x18地址的内核驱动并卸载:
# 查询占用0x18地址的设备名称 grep 0x18 /sys/bus/i2c/devices/i2c-1/*/name # 根据输出的模块名卸载,例如模块名为foo_drv rmmod foo_drv
卸载后重新运行i2cdetect -y 1,UU会变成设备地址,此时再运行Python演示脚本即可正常访问。
替代显示屏方案
如果I2C问题无法解决,以下两种显示屏完全可用:
- SPI TFT IPS显示屏:Orange Pi R1 Plus支持SPI引脚,加载SPI驱动模块(
insmod spi_dev、insmod sunxi_spi)后,使用支持SPI模式的OLED/TFT驱动库(如luma.oled)即可,兼容性良好。 - UART串口显示屏:无需依赖I2C/SPI驱动,仅需连接TX/RX引脚,通过Python的
serial库发送指令控制,操作简单,适合新手快速上手。
内容的提问来源于stack exchange,提问作者Iqbal Fauzan
相关产品推荐
相关产品推荐

