Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion boards/main/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
file(GLOB_RECURSE MAIN_SOURCES "*.cpp")

idf_component_register(SRCS ${MAIN_SOURCES}
INCLUDE_DIRS ".")
INCLUDE_DIRS "."
REQUIRES driver)
13 changes: 13 additions & 0 deletions boards/main/Kconfig.projbuild
Original file line number Diff line number Diff line change
@@ -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
12 changes: 12 additions & 0 deletions boards/main/common.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#pragma once

#include <cstdint>

enum class Result : uint8_t {
SUCCESS = 0,
FAILURE,

I2C_INIT_FAILED,
I2C_WRITE_FAILED,
I2C_READ_FAILED,
};
98 changes: 98 additions & 0 deletions boards/main/i2c.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
#include "i2c.h"

#include <cstring>

#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, &reg, 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
13 changes: 13 additions & 0 deletions boards/main/i2c.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#pragma once

#include <cstdint>

#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
7 changes: 4 additions & 3 deletions boards/main/main.cpp
Original file line number Diff line number Diff line change
@@ -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);
}
}