运行SSD1306 OLED代码时出现OSError: [Errno 5] EIO,求错误成因
问题分析:OSError: [Errno 5] EIO 错误成因
错误信息
>>> %Run -c $EDITOR_CONTENT Traceback (most recent call last): File "<stdin>", line 5, in <module> File "/lib/ssd1306.py", line 110, in __init__ File "/lib/ssd1306.py", line 36, in __init__ File "/lib/ssd1306.py", line 71, in init_display File "/lib/ssd1306.py", line 115, in write_cmd OSError: [Errno 5] EIO
代码内容
from machine import Pin, I2C from ssd1306 import SSD1306_I2C i2c = I2C(0, sda=Pin(16), scl=Pin(17), freq=40000) oled = SSD1306_I2C(128, 64, i2c) oled.fill(0) oled.text("Hello", 0, 0) oled.show() import machine import ssd1306 import time # Define the pins for I2C communication i2c = machine.I2C(0, sda=machine.Pin(16), scl=machine.Pin(17), freq=400000) # Define the display object oled = ssd1306.SSD1306_I2C(128, 64, i2c) # Clear the display oled.fill(0) oled.show() # Display something oled.text("Hello, Pico!", 0, 0) oled.show()
错误成因
这个Errno 5 EIO属于输入输出错误,核心是单片机与SSD1306 OLED屏的I2C通信完全失败,常见诱因如下:
- 硬件接线问题:SDA、SCL引脚接反,线路松动/接触不良;OLED的VCC、GND供电异常(比如电压不匹配、供电不足)。
- I2C引脚配置错误:你使用了I2C(0)总线,但不同开发板的I2C总线对应引脚不同,比如树莓派Pico的I2C0默认对应GP0、GP1,若GP16/GP17并非该板子的I2C0引脚,就会导致通信中断。
- I2C频率不兼容:SSD1306虽标称支持最高400kHz,但如果线路过长、线材质量差,高频下会出现信号丢包。你代码里混用了40kHz和400kHz两种频率,建议先降到100kHz测试。
- OLED地址不匹配:SSD1306默认I2C地址为
0x3C或0x3D,若你的屏幕地址并非这两个,初始化时未指定就会通信失败。可以先扫描总线确认设备地址:from machine import I2C, Pin i2c = I2C(0, sda=Pin(16), scl=Pin(17)) print(i2c.scan()) - 重复初始化干扰:代码里重复导入模块、创建I2C和OLED对象,虽不会直接触发错误,但可能打乱通信时序,建议合并代码逻辑,避免重复初始化。
内容的提问来源于stack exchange,提问作者Pinnache
相关产品推荐
相关产品推荐

