RockPi 4运行Adafruit OLED库报硬件I2C匹配错误求助
问题根因
报错本质是Adafruit Blinka库的RockPi 4板级引脚映射和你代码传参不匹配。
你代码里指定要用I2C7总线,但传的board.SDA、board.SCL是默认映射到其他I2C端口的引脚,和Blinka内置记录的I2C7对应SDA/SCL引脚对不上,直接触发参数校验报错。
从报错里列的合法I2C端口列表就能看出来:I2C7对应的SCL、SDA是两个独立的Pin实例,和你传入的默认SDA/SCL根本不是同一个引脚。至于你用mraa-i2c detect 0能扫到0x3c地址的OLED,是因为mraa自己维护了一套独立的引脚映射,和Blinka不通用,扫得到不代表Blinka认你传的引脚参数。
修复方法
- 先确认硬件接线
RockPi 4的I2C引脚对应关系记清楚,别接错:- 物理引脚3(SDA)、5(SCL)对应I2C7,就是你开启I2C显示功能对应的总线
- 物理引脚27(SDA)、28(SCL)对应I2C1
- 其余引脚的I2C功能默认关闭,需要单独加载dtbo才能用
- 修改代码里的I2C初始化逻辑,两种方案二选一即可
方案1:用Blinka内置的I2C7专用引脚定义,替换原来的初始化行:
方案2:如果你的Blinka版本找不到# 删除原来的i2c = busio.I2C(7, board.SDA, board.SCL),替换为下面这行 i2c = busio.I2C(board.SCL_7, board.SDA_7)SCL_7/SDA_7定义,直接跳过引脚校验,用总线号初始化底层I2C对象:from adafruit_blinka.microcontroller.generic_linux.i2c import I2C as _I2C i2c = _I2C(7) - 补全访问权限
执行下面的命令把当前用户加到i2c用户组,重启终端生效,否则会报权限不足无法访问总线:sudo usermod -aG i2c $USER - 重新运行代码即可,不会再触发引脚不匹配的报错。
注意事项
你代码里同时用了mraa和Adafruit库,两个库的引脚编号规则不一样:mraa默认用物理引脚号,Blinka用的是板级逻辑编号,写GPIO控制代码的时候别搞混对应关系,不然会出现GPIO控制失效的问题。
内容的提问来源于stack exchange,提问作者Pedrojdi
相关产品推荐
相关产品推荐

