diff --git a/boards/main/CMakeLists.txt b/boards/main/CMakeLists.txt index 67233cd..67ee619 100755 --- a/boards/main/CMakeLists.txt +++ b/boards/main/CMakeLists.txt @@ -1,4 +1,5 @@ file(GLOB_RECURSE MAIN_SOURCES "*.cpp") idf_component_register(SRCS ${MAIN_SOURCES} - INCLUDE_DIRS ".") + INCLUDE_DIRS "." + REQUIRES driver) diff --git a/boards/main/Kconfig.projbuild b/boards/main/Kconfig.projbuild new file mode 100644 index 0000000..c27d2b9 --- /dev/null +++ b/boards/main/Kconfig.projbuild @@ -0,0 +1,13 @@ +menu "Rocket board configuration" + orsource "$IDF_PATH/examples/common_components/env_caps/$IDF_TARGET/Kconfig.env_caps" + + config I2C_SDA_GPIO + int "I2C SDA GPIO number" + range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX + default 7 + + config I2C_SCL_GPIO + int "I2C SCL GPIO number" + range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX + default 6 +endmenu \ No newline at end of file diff --git a/boards/main/common.h b/boards/main/common.h new file mode 100644 index 0000000..aa25d6d --- /dev/null +++ b/boards/main/common.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +enum class Result : uint8_t { + SUCCESS = 0, + FAILURE, + + I2C_INIT_FAILED, + I2C_WRITE_FAILED, + I2C_READ_FAILED, +}; diff --git a/boards/main/i2c.cpp b/boards/main/i2c.cpp new file mode 100644 index 0000000..44086d0 --- /dev/null +++ b/boards/main/i2c.cpp @@ -0,0 +1,98 @@ +#include "i2c.h" + +#include + +#include "driver/i2c.h" +#include "esp_log.h" + +namespace i2c { + +constexpr inline const char *TAG = "I2C"; + +// The project uses only one I2C bus +constexpr inline i2c_port_t BUS_NUMBER = I2C_NUM_0; + +constexpr inline int FREQUENCY = 400000; + +constexpr inline uint32_t TIMEOUT = 50; + +Result init() { + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = CONFIG_I2C_SDA_GPIO, + .scl_io_num = CONFIG_I2C_SCL_GPIO, + .sda_pullup_en = true, + .scl_pullup_en = true, + .master = + { + .clk_speed = FREQUENCY, + }, + .clk_flags = I2C_SCLK_SRC_FLAG_FOR_NOMAL, + }; + + if (i2c_param_config(BUS_NUMBER, &conf) != ESP_OK) { + ESP_LOGE(TAG, "Config error"); + return Result::I2C_INIT_FAILED; + } + + if (i2c_driver_install(BUS_NUMBER, conf.mode, 0, 0, 0) != ESP_OK) { + ESP_LOGE(TAG, "Init error"); + return Result::I2C_INIT_FAILED; + } + + return Result::SUCCESS; +} + +Result read(uint8_t addr, uint8_t reg, uint8_t *buffer, uint16_t size) { + if (i2c_master_write_read_device(BUS_NUMBER, addr, ®, 1, buffer, size, + TIMEOUT / portTICK_PERIOD_MS) != ESP_OK) { + ESP_LOGE(TAG, "Failed to read"); + return Result::I2C_READ_FAILED; + } + + return Result::SUCCESS; +} + +static Result performWriteTransaction(uint8_t addr, uint8_t reg, + const uint8_t *buffer, uint16_t size, + i2c_cmd_handle_t command) { + if (i2c_master_start(command) != ESP_OK) { + return Result::I2C_WRITE_FAILED; + } + if (i2c_master_write_byte(command, addr << 1U, true) != ESP_OK) { + return Result::I2C_WRITE_FAILED; + } + if (i2c_master_write_byte(command, reg, true) != ESP_OK) { + return Result::I2C_WRITE_FAILED; + } + if (i2c_master_write(command, buffer, size, true) != ESP_OK) { + return Result::I2C_WRITE_FAILED; + } + if (i2c_master_stop(command) != ESP_OK) { + return Result::I2C_WRITE_FAILED; + } + if (i2c_master_cmd_begin(BUS_NUMBER, command, TIMEOUT) != ESP_OK) { + return Result::I2C_WRITE_FAILED; + } + return Result::SUCCESS; +} + +Result write(uint8_t addr, uint8_t reg, const uint8_t *buffer, uint16_t size) { + uint8_t command_buffer[I2C_LINK_RECOMMENDED_SIZE(2)] = {0}; + i2c_cmd_handle_t command = i2c_cmd_link_create_static( + command_buffer, I2C_LINK_RECOMMENDED_SIZE(2)); + + Result res = performWriteTransaction(addr, reg, buffer, size, command); + if (res != Result::SUCCESS) { + ESP_LOGE(TAG, "Failed to write"); + i2c_cmd_link_delete_static(command); + + return res; + } + + i2c_cmd_link_delete_static(command); + + return Result::SUCCESS; +} + +} // namespace i2c diff --git a/boards/main/i2c.h b/boards/main/i2c.h new file mode 100644 index 0000000..494dac2 --- /dev/null +++ b/boards/main/i2c.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +#include "common.h" + +namespace i2c { + +Result init(); +Result read(uint8_t addr, uint8_t reg, uint8_t *buffer, uint16_t size); +Result write(uint8_t addr, uint8_t reg, const uint8_t *buffer, uint16_t size); + +} // namespace i2c diff --git a/boards/main/main.cpp b/boards/main/main.cpp index da74946..a682382 100755 --- a/boards/main/main.cpp +++ b/boards/main/main.cpp @@ -1,11 +1,12 @@ -#include "esp_log.h" #include "freertos/FreeRTOS.h" +#include "i2c.h" static const char *TAG = "rocket"; extern "C" void app_main(void) { + i2c::init(); + while (true) { - ESP_LOGI(TAG, "Hello World!"); - vTaskDelay(1000 / portTICK_PERIOD_MS); + vTaskDelay(10 / portTICK_PERIOD_MS); } }