树莓派通过I²C连接带HW-61板的LCD时遇System.IO.IOException错误121
解决树莓派I²C连接LCD显示屏时的Remote I/O Error(Error 121)问题
硬件排查步骤
- 确认电平转换器配置:Whadda WPI410双向电平转换器需确保上拉电阻正确配置。I²C总线要求SDA/SCL线分别上拉对应电压(树莓派侧3.3V、HW-61侧5V),若转换器自带上拉需确认启用状态,无自带则额外添加4.7kΩ上拉电阻至对应电源。
- 验证电源供应:HW-61板VCC为5V输出,用万用表实测引脚电压,确保稳定在5V左右且电源适配器电流足够(LCD至少需几十毫安供电),电压不足会导致设备无响应。
- 检查物理接线:
- 确认SDA/SCL引脚无接反,HW-61的SDA对应电平转换器SDA_HV,树莓派SDA(GPIO2)对应SDA_LV;SCL引脚同理对应。
- 所有GND连接必须牢固,Wago端子压线需到位,虚接是I²C通信失败的高频诱因。
- 检测I²C设备识别状态:在树莓派终端执行
i2cdetect -y 1,若0x27位置显示设备地址或UU,说明硬件连接基本正常;若为空,重点排查接线、电平转换及电源环节。
软件配置与代码调整
- 确认I²C总线编号:部分树莓派型号(如Zero系列)的I²C总线编号为0而非1,执行
ls /dev/i2c-*查看实际总线,代码中busId需匹配实际值。 - 核对PCF8574引脚映射:HW-61板的PCF8574与LCD的引脚连接可能存在差异,当前代码的引脚定义不一定适配所有HW-61板。可尝试调整引脚参数(比如将enablePin改为1、backlightPin改为7),或查阅HW-61原理图确认映射关系。
- 最小化代码测试:排除依赖注入、日志等干扰,使用极简代码验证通信:
using Iot.Device.CharacterLcd; using Iot.Device.Pcx857x; using System.Device.Gpio; using System.Device.I2c; class TestProgram { static void Main() { try { var i2cConnection = new I2cConnectionSettings(busId: 1, deviceAddress: 0x27); using var i2cDevice = I2cDevice.Create(i2cConnection); using var driverPcf = new Pcf8574(i2cDevice); using var gpioController = new GpioController(driverPcf); using var lcd = new Lcd1602( registerSelectPin: 0, enablePin: 2, dataPins: new int[] { 4, 5, 6, 7 }, backlightPin: 3, readWritePin: 1, controller: gpioController ); lcd.Clear(); lcd.Write("Test"); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } }
- 检查I²C权限:确保运行程序的用户(如pi用户)属于i2c组,执行
groups pi查看,若缺失则执行sudo usermod -aG i2c pi,重启设备后生效。
其他潜在问题
- 地址冲突:用
i2cdetect -y 1确认总线上无其他设备占用0x27地址。 - 电平转换器接反:Whadda WPI410的LV侧需接树莓派(3.3V),HV侧接HW-61(5V),同时VCC_LV接树莓派3.3V、VCC_HV接5V电源,避免高低压侧颠倒。
内容的提问来源于stack exchange,提问作者F1nix
相关产品推荐
相关产品推荐

