ESP32 IDF 读取16位输入输出芯片PCA9555的程序调试

PCA9555 包含了多个寄存器,用于配置和控制 GPIO 引脚。以下是 PCA9555 的主要寄存器:

Configuration 寄存器 0x06 0x07 输入输出设置,设置0x00为输出,设置0xFF为输入
Input 寄存器 0x00 0x01 当Configuration 寄存器 设置为输入时 这个寄存器可以读取输入电平
Output 寄存器 0x02 0x03 当Configuration 寄存器 设置为输出时 这个寄存器可以设置输出电平
Polarity Inversion 寄存器 0x04 0x05 当Configuration 寄存器 设置为输入时 这个寄存器可以反转输入电平
寄存器说明

  1. Configuration 寄存器 (配置寄存器)
    功能: 这些寄存器用于设置 Port A 和 Port B 上每个 GPIO 引脚的输入/输出方向。
    0: 对应的引脚配置为输出。
    1: 对应的引脚配置为输入。
    寄存器地址:
    C0: 配置 Port A 的寄存器地址是 0x06。
    C1: 配置 Port B 的寄存器地址是 0x07。
  2. Input 寄存器 (输入寄存器)
    功能: 这些寄存器用于读取 Port A 和 Port B 上每个 GPIO 引脚的当前输入状态。
    寄存器地址:
    IN0: 读取 Port A 的寄存器地址是 0x00。
    IN1: 读取 Port B 的寄存器地址是 0x01。
  3. Output 寄存器 (输出寄存器)
    功能: 这些寄存器用于设置 Port A 和 Port B 上每个 GPIO 引脚的输出状态。
    寄存器地址:
    OUT0: 设置 Port A 的寄存器地址是 0x02。
    OUT1: 设置 Port B 的寄存器地址是 0x03。
  4. Polarity Inversion 寄存器 (极性反转寄存器)
    功能: 这些寄存器用于反转 Port A 和 Port B 上每个 GPIO 引脚的输入状态。
    0: 对应的引脚保持原始输入状态。
    1: 对应的引脚输入状态被反转。
    寄存器地址:
    POL0: 极性反转 Port A 的寄存器地址是 0x04。
    POL1: 极性反转 Port B 的寄存器地址是 0x05。

示例代码

#include <driver/i2c.h>
#include <esp_log.h>

#define I2C_MASTER_SCL_IO 15 /*!< gpio number for I2C master clock */
#define I2C_MASTER_SDA_IO 16 /*!< gpio number for I2C master data */
#define I2C_MASTER_NUM I2C_NUM_0 /*!< I2C port number for master dev */
#define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master do not need buffer */
#define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master do not need buffer */
#define I2C_MASTER_FREQ_HZ 400000 /*!< I2C master clock frequency */

#define MCP23017_ADDRESS 0x20 /*!< I2C address of MCP23017 */

static const char *TAG = "I2C_MASTER";

void i2c_master_init() {
    i2c_config_t conf = {
    .mode = I2C_MODE_MASTER,
    .sda_io_num = I2C_MASTER_SDA_IO,
    .sda_pullup_en = GPIO_PULLUP_ENABLE,
    .scl_io_num = I2C_MASTER_SCL_IO,
    .scl_pullup_en = GPIO_PULLUP_ENABLE,
    .master.clk_speed = I2C_MASTER_FREQ_HZ,
    };

    i2c_param_config(I2C_MASTER_NUM, &conf);
    i2c_driver_install(I2C_MASTER_NUM, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}

void read_register(uint8_t reg, uint8_t *value)
{
    uint8_t data[1] = {reg};
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();

    // 写入寄存器地址
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (MCP23017_ADDRESS << 1) | I2C_MASTER_WRITE, true);
    i2c_master_write(cmd, data, 1, true);

    // 读取数据
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (MCP23017_ADDRESS << 1) | I2C_MASTER_READ, true);
    i2c_master_read(cmd, value, 1, I2C_MASTER_LAST_NACK);
    i2c_master_stop(cmd);

    i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS);
    i2c_cmd_link_delete(cmd);
}

void write_register(uint8_t reg, uint8_t value) {
    uint8_t data[2] = {reg, value};
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (MCP23017_ADDRESS << 1) | I2C_MASTER_WRITE, true);
    i2c_master_write(cmd, data, sizeof(data), true);
    i2c_master_stop(cmd);
    i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS);
    i2c_cmd_link_delete(cmd);
}



void example() {
    i2c_master_init();
    // 设置PORTA为全输出
    set_output_direction(0, 0x00);
    // 设置PORTA的输出值为0xFF
    set_output_value(0, 0x0f);
}

void app_main() {
    i2c_master_init();
    write_register(0x06, 0x00);	//输出
    write_register(0x07, 0x00);
    write_register(0x02, 0xaa);
    write_register(0x03, 0x55);
	//以上为输出


    write_register(0x06, 0xff);	//输入
    write_register(0x07, 0xff);

    uint8_t data1[1] = {0};
    uint8_t data2[1] = {0};
    while (true)
    {
        read_register(0x00, data1);
        read_register(0x01, data2);
        ESP_LOGI(TAG, "read register 0x12: %02X      0x13: %02X", data1[0], data2[0]);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

希望对大家有点帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值