11#include "driver/i2c_master.h"
14#include "freertos/FreeRTOS.h"
15#include "freertos/task.h"
17static const char *
TAG =
"pca9535";
19#define I2C_PORT I2C_NUM_0
20#define I2C_SCL_GPIO 14
21#define I2C_SDA_GPIO 15
22#define I2C_FREQ_HZ 400000
23#define I2C_TIMEOUT_MS 1000
25#define PCA9535_I2C_ADDR 0x20
27#define PCA9535_REG_INPUT0 0x00
28#define PCA9535_REG_INPUT1 0x01
29#define PCA9535_REG_OUTPUT0 0x02
30#define PCA9535_REG_OUTPUT1 0x03
31#define PCA9535_REG_INVERT0 0x04
32#define PCA9535_REG_INVERT1 0x05
33#define PCA9535_REG_CONFIG0 0x06
34#define PCA9535_REG_CONFIG1 0x07
37#define LED_P03_BIT (1U << 3)
38#define LED_P04_BIT (1U << 4)
39#define LED_MASK (LED_P03_BIT | LED_P04_BIT)
42#define PORT0_CONFIG_LEDS 0xE7
44#define TEST_BLINK_MS 400
53 uint8_t buf[2] = {reg, value};
75 i2c_master_bus_config_t bus_cfg = {
79 .clk_source = I2C_CLK_SRC_DEFAULT,
80 .glitch_ignore_cnt = 7,
81 .flags.enable_internal_pullup =
true,
83 ESP_RETURN_ON_ERROR(i2c_new_master_bus(&bus_cfg, &
s_i2c_bus),
TAG,
"i2c bus init failed");
85 i2c_device_config_t dev_cfg = {
86 .dev_addr_length = I2C_ADDR_BIT_LEN_7,
91 TAG,
"i2c device add failed");
96 TAG,
"config0 failed");
104 ESP_LOGI(
TAG,
"PCA9535 at 0x%02X, %u Hz, SCL=GPIO%d SDA=GPIO%d, config0=0x%02X",
118 uint8_t port = patterns[idx];
120 ESP_LOGI(
TAG,
"Test LED port0=0x%02X", port);
123 idx = (idx + 1) % (
sizeof(patterns) /
sizeof(patterns[0]));
130 static bool started =
false;
132 ESP_RETURN_ON_FALSE(
s_initialized, ESP_ERR_INVALID_STATE,
TAG,
"not initialized");
138 BaseType_t created = xTaskCreate(
pca9535_test_task,
"pca9535_test", 2048, NULL, 5, NULL);
139 ESP_RETURN_ON_FALSE(created == pdPASS, ESP_ERR_NO_MEM,
TAG,
"test task create failed");
142 ESP_LOGI(
TAG,
"Test task started: LEDs on P0.3 and P0.4");
esp_err_t pca9535_test_start(void)
Запускает тестовую задачу: поочерённое мигание светодиодов P0.3 и P0.4.
static void pca9535_test_task(void *arg)
Тест: поочерённое включение P0.3 и P0.4.
#define PCA9535_REG_OUTPUT0
#define PCA9535_REG_INVERT1
#define LED_P03_BIT
Светодиоды на порту 0, пины 3 и 4.
static esp_err_t pca9535_set_port0(uint8_t value)
#define PORT0_CONFIG_LEDS
Конфигурация: P0.3 и P0.4 — выходы, остальные — входы
#define PCA9535_REG_CONFIG0
static i2c_master_bus_handle_t s_i2c_bus
#define PCA9535_REG_INVERT0
esp_err_t pca9535_init(void)
Инициализирует шину I2C и PCA9535.
static bool s_initialized
static i2c_master_dev_handle_t s_pca9535_dev
#define PCA9535_REG_CONFIG1
static esp_err_t pca9535_read_reg(uint8_t reg, uint8_t *value)
static esp_err_t pca9535_write_reg(uint8_t reg, uint8_t value)
Драйвер I2C-расширителя портов PCA9535.