# 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 设备句柄和互斥锁资源。
idf.py add-dependency "duruofu/ch422^0.0.1"