duruofu/ch422

0.0.1

Latest
uploaded 1 day ago
CH422 IO expander component

readme

# CH422 IO 扩展器

CH422 是一款 I2C 接口的 IO 扩展芯片,支持 8 个双向 IO 引脚 (IO0-IO7) 和 4 个通用输出引脚 (OC0-OC3)。本组件将其封装为纯 IO 扩展器模式,屏蔽了数码管驱动细节,方便作为通用 GPIO 扩展使用。

## 特性

*   **接口**: I2C (支持 400kHz 高速模式)
*   **IO0-IO7**: 8 个双向输入/输出引脚 (准双向口)
*   **OC0-OC3**: 4 个漏极开路 (Open-Drain) 输出引脚,具有较大的灌电流能力 (适合驱动 LED)
*   **线程安全**: 内置互斥锁,支持多任务环境

## 使用示例

### 1. 初始化 I2C

```c
#include "driver/i2c_master.h"

static esp_err_t i2c_master_init(i2c_master_bus_handle_t *bus_handle)
{
    i2c_master_bus_config_t bus_config = {
        .i2c_port = I2C_NUM_0,
        .sda_io_num = 15,
        .scl_io_num = 14,
        .clk_source = I2C_CLK_SRC_DEFAULT,
        .flags.enable_internal_pullup = true
    };
    return i2c_new_master_bus(&bus_config, bus_handle);
}
```

### 2. 设备初始化

CH422 的 I2C 地址是固定的(由命令码决定),因此初始化时无需传入地址。初始化函数会自动配置芯片为 IO 扩展模式 (A_SCAN=0)。

```c
#include "ch422.h"

ch422_dev_t dev;
i2c_master_bus_handle_t bus_handle;

// ... 先初始化 I2C 总线 ...

ESP_LOGI(TAG, "Initializing CH422...");
esp_err_t ret = ch422_init(&dev, bus_handle);
if (ret != ESP_OK) {
    ESP_LOGE(TAG, "Failed to initialize CH422");
}
```

### 3. 控制输出 (OC0-OC3)

OC 引脚为漏极开路输出,适合驱动 LED 或继电器。

```c
// 控制单个引脚 (OC0-OC3 对应 pin_index 0-3)
ch422_set_pin_state(&dev, 0, true);  // OC0 输出低电平 (有效)
ch422_set_pin_state(&dev, 3, false); // OC3 输出高阻态 (无效)

// 按字节批量控制 (仅低4位有效)
ch422_set_oc_byte(&dev, 0x0F);       // OC0-OC3 全部输出低电平
ch422_set_oc_byte(&dev, 0x00);       // OC0-OC3 全部输出高阻态
```

### 4. 控制双向 IO (IO0-IO7)

IO0-IO7 为准双向口,既可输出也可输入。

#### 输出模式
```c
// 单个引脚控制 (IO0-IO7 对应 pin_index 4-11)
ch422_set_pin_state(&dev, 4, true);  // IO0 输出高电平
ch422_set_pin_state(&dev, 11, false);// IO7 输出低电平

// 批量控制
ch422_set_io_byte(&dev, 0x55);       // IO0-IO7 输出 0x55
```

#### 输入模式
**注意**: 读取输入前,必须先将对应引脚置为高电平 (1),使其处于弱上拉状态,否则无法正确读取外部信号。

```c
// 1. 先将所有 IO 置为高电平 (输入模式准备)
ch422_set_io_byte(&dev, 0xFF);

// 2. 读取输入状态
uint8_t input_val = 0;
esp_err_t ret = ch422_read_io_byte(&dev, &input_val);
if (ret == ESP_OK) {
    ESP_LOGI(TAG, "Input IO Value: 0x%02X", input_val);
}
```

## 注意事项

1.  **I2C 地址**: CH422 使用非标准的 I2C 协议(命令码即地址),本驱动已在内部处理了所有地址映射。
2.  **准双向口**: IO0-IO7 与 8051 单片机的 P0 口类似,作为输入使用时必须先写 1。
3.  **模式限制**: 本驱动强制将 CH422 配置为 IO 扩展模式 (A_SCAN=0),不支持数码管动态扫描模式。
4.  **资源释放**: 使用完毕后请调用 `ch422_deinit(&dev)` 释放 I2C 设备句柄和互斥锁资源。

Links

Supports all targets

License: MIT

To add this component to your project, run:

idf.py add-dependency "duruofu/ch422^0.0.1"

download archive

Stats

  • Archive size
    Archive size ~ 9.61 KB
  • Downloaded in total
    Downloaded in total 0 times
  • Downloaded this version
    This version: 0 times

Badge

duruofu/ch422 version: 0.0.1
|