2004 i2c lcd 和树莓派 pico 的 EIO 问题

问题描述 投票:0回答:1

我有一个 raspberry pi pico 和一个 20x4 I2C lcd。但是当我尝试连接到液晶屏时,它会引发此错误:

我多次检查了我的电线。我经常连接和断开它们。但这些都不起作用。

我真的在互联网上寻找它,但没有给我任何完整的答案

OSError: [Errno 5] EIO

请帮助我

我的i2cLcd.py(我的连接库)(我选择这个名称):

import utime
import gc

from lcd_api import LcdApi
from machine import I2C

# PCF8574 pin definitions
MASK_RS = 0x01       # P0
MASK_RW = 0x02       # P1
MASK_E  = 0x04       # P2

SHIFT_BACKLIGHT = 3  # P3
SHIFT_DATA      = 4  # P4-P7

class I2cLcd(LcdApi):
    
    #Implements a HD44780 character LCD connected via PCF8574 on I2C

    def __init__(self, i2c, i2c_addr, num_lines, num_columns):
        self.i2c = i2c
        self.i2c_addr = int(hex(i2c_addr))
        self.i2c.writeto(self.i2c_addr, bytes([0]))
        utime.sleep_ms(20)   # Allow LCD time to powerup
        # Send reset 3 times
        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)
        utime.sleep_ms(5)    # Need to delay at least 4.1 msec
        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)
        utime.sleep_ms(1)
        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)
        utime.sleep_ms(1)
        # Put LCD into 4-bit mode
        self.hal_write_init_nibble(self.LCD_FUNCTION)
        utime.sleep_ms(1)
        LcdApi.__init__(self, num_lines, num_columns)
        cmd = self.LCD_FUNCTION
        if num_lines > 1:
            cmd |= self.LCD_FUNCTION_2LINES
        self.hal_write_command(cmd)
        gc.collect()

    def hal_write_init_nibble(self, nibble):
        # Writes an initialization nibble to the LCD.
        # This particular function is only used during initialization.
        byte = ((nibble >> 4) & 0x0f) << SHIFT_DATA
        self.i2c.writeto(self.i2c_addr, bytes([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytes([byte]))
        gc.collect()
        
    def hal_backlight_on(self):
        # Allows the hal layer to turn the backlight on
        self.i2c.writeto(self.i2c_addr, bytes([1 << SHIFT_BACKLIGHT]))
        gc.collect()
        
    def hal_backlight_off(self):
        #Allows the hal layer to turn the backlight off
        self.i2c.writeto(self.i2c_addr, bytes([0]))
        gc.collect()
        
    def hal_write_command(self, cmd):
        # Write a command to the LCD. Data is latched on the falling edge of E.
        byte = ((self.backlight << SHIFT_BACKLIGHT) |
                (((cmd >> 4) & 0x0f) << SHIFT_DATA))
        self.i2c.writeto(self.i2c_addr, bytes([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytes([byte]))
        byte = ((self.backlight << SHIFT_BACKLIGHT) |
                ((cmd & 0x0f) << SHIFT_DATA))
        self.i2c.writeto(self.i2c_addr, bytes([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytes([byte]))
        if cmd <= 3:
            # The home and clear commands require a worst case delay of 4.1 msec
            utime.sleep_ms(5)
        gc.collect()

    def hal_write_data(self, data):
        # Write data to the LCD. Data is latched on the falling edge of E.
        byte = (MASK_RS |
                (self.backlight << SHIFT_BACKLIGHT) |
                (((data >> 4) & 0x0f) << SHIFT_DATA))
        self.i2c.writeto(self.i2c_addr, bytes([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytes([byte]))
        byte = (MASK_RS |
                (self.backlight << SHIFT_BACKLIGHT) |
                ((data & 0x0f) << SHIFT_DATA))      
        self.i2c.writeto(self.i2c_addr, bytes([byte | MASK_E]))
        self.i2c.writeto(self.i2c_addr, bytes([byte]))
        gc.collect()

我的代码部分出现错误:

def setup():
    i2c = I2C(0, sda=Pin(8), scl=Pin(9), freq=400000)
    I2C_ADDR = i2c.scan()[0]
    lcd = I2cLcd(i2c, I2C_ADDR, 4, 20)
    lcd.custom_char(1, bytearray([0x1F,
      0x1F,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00]))
    lcd.custom_char(3, bytearray([0x03,
      0x03,
      0x03,
      0x03,
      0x03,
      0x03,
      0x03,
      0x03]))
    lcd.custom_char(5, bytearray([0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x00,
      0x1F,
      0x1F]))
    lcd.custom_char(7, bytearray([0x18,
      0x18,
      0x18,
      0x18,
      0x18,
      0x18,
      0x18,
      0x18]))
    return lcd, clock, buzzer

谢谢

i2c raspberry-pi-pico lcd oserror
1个回答
0
投票

这是一个非常常见的错误,通常在 pico 无法建立 I2C 连接时出现。

我不知道您是否已经尝试过,但请考虑再检查一次,确保每个连接都到达其应有的位置。

确保您的 i2c 引脚良好,SDA 和 SCL 以及其他引脚连接到显示器的正确部分。

© www.soinside.com 2019 - 2024. All rights reserved.