Aruna
ESP32_I2C_master.cpp
Go to the documentation of this file.
1 //
2 // Created by noeel on 14-10-20.
3 //
4 
6 #include "driver/i2c.h"
7 
8 using namespace aruna;
9 using namespace aruna::driver;
10 
11 ESP32_I2C_master::ESP32_I2C_master(i2c_port_t i2c_num, const i2c_config_t* i2c_conf): i2c_num(i2c_num), i2c_conf(i2c_conf) {
12 // start I2C driver
13  ESP_ERROR_CHECK(i2c_param_config(i2c_num, i2c_conf));
14  ESP_ERROR_CHECK(i2c_driver_install(i2c_num, I2C_MODE_MASTER, 0, 0, ESP_INTR_FLAG_IRAM));
15  i2c_cmd_handler = i2c_cmd_link_create();
16 }
17 
19  ESP_ERROR_CHECK(i2c_driver_delete(i2c_num));
20  i2c_cmd_link_delete(i2c_cmd_handler);
21 }
22 err_t ESP32_I2C_master::_write(uint8_t address, uint8_t reg, uint8_t* data, size_t data_size) {
23  esp_err_t esp_err;
24  ESP_ERROR_CHECK(i2c_master_start(i2c_cmd_handler));
25  ESP_ERROR_CHECK(i2c_master_write_byte(i2c_cmd_handler, (address << 1) | I2C_MASTER_WRITE, I2C_MASTER_ACK));
26  ESP_ERROR_CHECK(i2c_master_write_byte(i2c_cmd_handler, (uint8_t) reg, I2C_MASTER_ACK));
27  ESP_ERROR_CHECK(i2c_master_write(i2c_cmd_handler, data, data_size, I2C_MASTER_ACK));
28  ESP_ERROR_CHECK(i2c_master_stop(i2c_cmd_handler));
29  esp_err = i2c_master_cmd_begin(i2c_num, i2c_cmd_handler, 100 / portTICK_PERIOD_MS );
30  switch (esp_err) {
31  case ESP_OK:
32  return err_t::OK;
33  case ESP_ERR_INVALID_ARG:
35  case ESP_FAIL:
36  return err_t::NO_RESPONSE;
37  case ESP_ERR_INVALID_STATE:
39  default:
40  return err_t::UNDEFINED;
41  }
42 }
43 
44 err_t ESP32_I2C_master::_read(uint8_t address, uint8_t reg, uint8_t* buffer, size_t buffer_size) {
45  esp_err_t esp_err;
46  ESP_ERROR_CHECK(i2c_master_start(i2c_cmd_handler));
47  ESP_ERROR_CHECK(i2c_master_write_byte(i2c_cmd_handler, (address << 1) | I2C_MASTER_WRITE, I2C_MASTER_ACK));
48  ESP_ERROR_CHECK(i2c_master_write_byte(i2c_cmd_handler, (uint8_t) reg, I2C_MASTER_ACK));
49  ESP_ERROR_CHECK(i2c_master_start(i2c_cmd_handler));
50  ESP_ERROR_CHECK(i2c_master_write_byte(i2c_cmd_handler, (address << 1) | I2C_MASTER_READ, true));
51  ESP_ERROR_CHECK(i2c_master_read(i2c_cmd_handler, buffer, buffer_size, I2C_MASTER_ACK));
52  ESP_ERROR_CHECK(i2c_master_stop(i2c_cmd_handler));
53  esp_err = i2c_master_cmd_begin(i2c_num, i2c_cmd_handler, 100 / portTICK_PERIOD_MS );
54  switch (esp_err) {
55  case ESP_OK:
56  return err_t::OK;
57  case ESP_ERR_INVALID_ARG:
59  case ESP_FAIL:
60  return err_t::NO_RESPONSE;
61  case ESP_ERR_INVALID_STATE:
63  default:
64  return err_t::UNDEFINED;
65  }
66 }
Definition: comm.cpp:14
err_t _write(uint8_t address, uint8_t reg, uint8_t *data, size_t data_size) override
ESP32_I2C_master(i2c_port_t i2c_num, const i2c_config_t *i2c_conf)
err_t _read(uint8_t address, uint8_t reg, uint8_t *buffer, size_t buffer_size) override