You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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"
    # 重启设备
    reboot
    
    重启后再运行i2cdetect -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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:30:55