如何控制pca9555GPIO扩展芯片的GPIO输出高低电平

问题描述

1.如何控制pca9555GPIO扩展芯片的GPIO输出高低电平

2.如何读取pca9555GPIO扩展芯片的GPIO输入的高低电平

环境信息

  • 操作系统:如 Ubuntu 24.04

  • 软件版本:OpenUBMC2512

  • 硬件配置:[如 CPU、内存等]

期望结果

将pca9555芯片添加到组件中,实现GPIO电平的读取。

答案内容由AI生成,仅供参考:

控制与读取 PCA9555 GPIO 扩展芯片的电平

根据您提供的环境信息(Ubuntu 24.04 + OpenUBMC 2512),以下是如何在 OpenUBMC 系统中配置和使用 PCA9555 GPIO 扩展芯片来控制输出电平和读取输入电平的方法。


:puzzle_piece: 1. 概述

PCA9555 是一款通过 I2C 接口实现的 16 位 GPIO 扩展器,在 OpenUBMC 系统中可通过 CSR(Component Self-description Record)配置方式进行描述和管理。系统通过 ScannerAccessor 对象对其实现周期性读取或实时控制。


:gear: 2. 如何控制 PCA9555 的 GPIO 输出电平(设置高低电平)

要控制 PCA9555 的某个 GPIO 引脚为高或低电平,需完成以下步骤:

:white_check_mark: 步骤 1:在 CSR 中配置 PCA9555 设备

在 CSR 配置文件中添加 PCA9555 芯片定义,指定其 I2C 地址、地址宽度等参数。

{
  "Objects": {
    "Pca9555_GPIO_Expander": {
      "Type": "Pca9555",
      "Address": 64,           // I2C 地址 0x40 -> 十进制为 64
      "AddrWidth": 1,
      "OffsetWidth": 1,
      "WriteTmout": 100,
      "ReadTmout": 100
    }
  }
}

:white_check_mark: 步骤 2:配置输出方向(可选,默认已由硬件初始化)

PCA9555 有 Configuration Register 控制每个引脚是输入还是输出。若需要更改,可通过底层写操作设置:

  • 寄存器:
    • Input Port 0/1(只读)
    • Output Port 0/1(读写)
    • Polarity Inversion 0/1
    • Configuration 0/1(0 表示输出,1 表示输入)

例如,将 Port 0 设置为全输出(写入 0x00 到 Configuration Register 0):

# 使用 i2ctransfer 命令发送数据
i2ctransfer -y 1 w3@0x40 0x03 0x00  # 写 Configuration Port 0 为输出模式

:white_check_mark: 步骤 3:控制输出电平(高/低)

写入 Output Port 0/1 寄存器即可改变电平状态。

# 设置 Port 0 输出值为 0xFF(全部高电平)
i2ctransfer -y 1 w3@0x40 0x01 0xFF

# 设置 Port 0 第0位为低电平(即 -> 0xFE)
i2ctransfer -y 1 w3@0x40 0x01 0xFE

说明

  • 0x01 是 Output Port Register 0 的地址
  • @0x40 是 PCA9555 的 I2C 地址
  • -y 1 表示使用 I2C 总线编号 1

:magnifying_glass_tilted_left: 3. 如何读取 PCA9555 的 GPIO 输入电平

读取 PCA9555 的输入状态通过 Input Port 寄存器完成。

:white_check_mark: 方法一:直接使用命令读取(适用于调试)

# 读取 Input Port 0
i2ctransfer -y 1 w1@0x40 0x00 r1

# 示例输出:0x5A 表示当前输入状态
  • w1@0x40 0x00:写入寄存器地址 0x00(Input Port 0)
  • r1:读取 1 字节数据

:white_check_mark: 方法二:在 OpenUBMC 中使用 Scanner 实现周期性监测

在 CSR 中定义一个 Scanner 对象,用于定期读取 PCA9555 的输入状态。

示例配置:

{
  "Objects": {
    "Scanner_PCA9555_Input": {
      "Type": "Scanner",
      "Chip": "#/Pca9555_GPIO_Expander",
      "Register": 0x00,         // Input Port 0 寄存器
      "Period": 1000,           // 每 1000 ms 扫描一次
      "ScanEnabled": 1,
      "Debounce": "ContBin_H3L3"  // 可选防抖策略
    }
  }
}

读取结果可通过 D-Bus 查询:

busctl get-property bmc.kepler.hwproxy /xyz/openbmc_project/... bmc.kepler.Scanner Value

:brick: 4. 添加 PCA9555 到系统组件(实现完整集成)

为了更高级的控制,可以结合 SRUpgrade 或自定义控制模块,通过 WriteProtect 信号连接至 PCA9555 的某个 GPIO 引脚。

示例:配置一个依赖 PCA9555 的对象

{
  "Objects": {
    "SRUpgrade_1": {
      "StorageChip": "#/Eeprom_BCU",
      "WriteProtect": {
        "Chip": "#/Pca9555_GPIO_Expander",
        "Register": 0x01,      // Output Port 0
        "Bit": 7               // 使用第7位作为写保护使能
      }
    }
  }
}

此配置表示:当该位为 高电平 时,EEPROM 处于写保护状态。


:hammer_and_wrench: 5. 常用工具与调试命令

查看 I2C 总线设备列表

i2cdetect -l
i2cdetect -y 1

读写 PCA9555 寄存器(实用命令)

功能 命令
读 Configuration Port 0 i2ctransfer -y 1 w1@0x40 0x03 r1
写 Configuration Port 0 (全输出) i2ctransfer -y 1 w3@0x40 0x03 0x00
读 Input Port 0 i2ctransfer -y 1 w1@0x40 0x00 r1
写 Output Port 0 (全高) i2ctransfer -y 1 w3@0x40 0x01 0xFF

:white_check_mark: 6. 期望结果达成路径总结

步骤 操作 目标
1 在 CSR 中描述 Pca9555 对象 添加硬件描述
2 配置 Scanner 监控输入引脚 实现 GPIO 输入读取
3 使用 I2C 命令或绑定控制逻辑 实现 GPIO 输出控制
4 可选:结合 Debounce 防抖策略 提高信号稳定性
5 使用 i2ctransfer 或 D-Bus 接口验证 完成功能验证

:books: 参考文档

  • CSR配置字典之Pca9555类
  • 《BMC Studio 板卡适配指南》
  • 《I2C 接口文档》
  • OpenUBMC D-Bus 接口规范:bmc.kepler.Chip.BlockIO

通过以上配置与操作,您可以在 OpenUBMC 2512 系统中成功添加并控制 PCA9555 GPIO 扩展芯片,实现 GPIO 输入读取和输出控制功能。

pca9555是 高性能i2c接口 8 位 GPIO(通用输入输出)扩展器,通过i2c写入/读取pca9555寄存器控制对应io引脚电平。在CSR对应i2c通道下配置Pca9555器件,新增Accessor对象用于控制不同寄存器的读取/写入,进而控制pca9555GPIO扩展芯片的GPIO的高低电平。详细寄存器和配置可以参考你现在需要配置的器件手册。

1 个赞

谢谢,我试试。

好的,还有问题可以再咨询。