From 51bdd7233bc55c4e3d051f69853f2507188f5721 Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 21 Apr 2026 10:56:00 +0200 Subject: [PATCH] Added I2C IO Expander --- main/hw_test.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/main/hw_test.c b/main/hw_test.c index 94dc37c..f0239d7 100644 --- a/main/hw_test.c +++ b/main/hw_test.c @@ -1,9 +1,12 @@ #include "driver/gpio.h" +#include "driver/i2c_master.h" +#include "driver/i2c_types.h" #include "esp_err.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "led_strip.h" +#include #define LED_GPIO 21 #define TASTER_GPIO 12 @@ -13,15 +16,23 @@ #define TERMINAL_TX 3 #define DIP_MASTER 4 #define I2C_SCL 5 -#define I2C_SDA +#define I2C_SDA 6 #define TOUCH_1 9 #define TOUCH_2 8 #define LED_RING 7 +#define I2C_PORT 0 +#define IO_EXPANDER_ADDRESS 0x20 +#define BMA456_ADDRESS 0x18 + static const char *TAG = "LED_TASK"; static led_strip_handle_t led_strip; static led_strip_handle_t led_ring; +static i2c_master_bus_handle_t bus_handle; +static i2c_master_dev_handle_t io_expander; +static i2c_master_dev_handle_t bma456_dev_handle; + /* LED Task */ void vTaskLed(void *pvParameters) { ESP_LOGI(TAG, "LED task started"); @@ -126,4 +137,46 @@ void app_main(void) { /* Input Monitor Task */ ESP_LOGI(TAG, "Input Monitor Task"); xTaskCreate(vTaskInput, "monitor_input", 4096, NULL, 5, NULL); + + /* Init I2C IO Expander */ + i2c_master_bus_config_t i2c_mst_config = { + .clk_source = I2C_CLK_SRC_DEFAULT, + .i2c_port = I2C_PORT, + .scl_io_num = I2C_SCL, + .sda_io_num = I2C_SDA, + .glitch_ignore_cnt = 7, + .flags.enable_internal_pullup = true, + }; + + err = i2c_new_master_bus(&i2c_mst_config, &bus_handle); + if (err != ESP_OK) { + ESP_LOGI(TAG, "I2C Master Could not Init Bus"); + } + + i2c_device_config_t dev_cfg = { + .dev_addr_length = I2C_ADDR_BIT_LEN_7, + .device_address = IO_EXPANDER_ADDRESS, + .scl_speed_hz = 100000, + }; + err = i2c_master_bus_add_device(bus_handle, &dev_cfg, &io_expander); + if (err != ESP_OK) { + ESP_LOGI(TAG, "Could not add IO Expnader to Bus %d", err); + } else { + + uint8_t write_buf[2] = {0x03, 0xFF}; // 0xFF setzt alle Bits auf Input + err = i2c_master_transmit(io_expander, write_buf, sizeof(write_buf), -1); + if (err != ESP_OK) { + ESP_LOGI(TAG, "Could not set IO Expander in input mode %d", err); + } + + uint8_t reg_addr = 0x00; + uint8_t read_val = 0; + + err = i2c_master_transmit_receive(io_expander, ®_addr, 1, &read_val, 1, + -1); + if (err != ESP_OK) { + ESP_LOGI(TAG, "Could not read IO Expander input %d", err); + } + ESP_LOGI(TAG, "Read INPUT %d", read_val); + } }