/** * @file i2cPort.cpp * @author Gustice * @brief C++ Wrapper for I2C-interface * * @copyright Copyright (c) 2020 */ #include "i2cPort.hpp" #include "esp_log.h" const int TxBufDisabled = 0; /*!< I2C master doesn't need buffer */ const int RxBufDisabled = 0; /*!< I2C master doesn't need buffer */ constexpr int I2C_TOOL_TIMEOUT_VALUE_MS = 50; #define ACK_CHECK_EN 0x1 /*!< I2C master will check ack from slave*/ #define ACK_CHECK_DIS 0x0 /*!< I2C master will not check ack from slave */ I2cMaster::I2cMaster(i2c_port_t port, gpio_num_t sda, gpio_num_t scl) : Port(port) { i2c_master_bus_config_t i2c_bus_config{ .i2c_port = port, .sda_io_num = sda, .scl_io_num = scl, .clk_source = I2C_CLK_SRC_DEFAULT, .glitch_ignore_cnt = 7, }; i2c_bus_config.flags.enable_internal_pullup = 1; ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_config, &_busHandle)); } bool I2cMaster::probe(uint8_t addr) { esp_err_t ret = i2c_master_probe(_busHandle, addr, I2C_TOOL_TIMEOUT_VALUE_MS); return ret == ESP_OK; } I2cMaster::Slave::Slave(I2cMaster &interface, uint8_t addr, ClockRate rate) : Addr(addr), Interface(interface) { i2c_device_config_t i2c_dev_conf{ .device_address = addr, .scl_speed_hz = rate, }; ESP_ERROR_CHECK(i2c_master_bus_add_device(interface._busHandle, &i2c_dev_conf, &_devHandle)); } I2cMaster::Slave::~Slave() { i2c_master_bus_rm_device(_devHandle); } bool I2cMaster::Slave::writeTo(const std::vector &data) { esp_err_t ret = i2c_master_transmit(_devHandle, data.data(), data.size(), I2C_TOOL_TIMEOUT_VALUE_MS); if (ret != ESP_OK) { if (ret == ESP_ERR_TIMEOUT) { ESP_LOGW("I2C", "Bus is busy"); } return false; } return true; } std::vector I2cMaster::Slave::readFrom(const std::vector &address, unsigned size) { if (size == 0) { return {}; } std::vector buffer(size); esp_err_t ret = i2c_master_transmit_receive(_devHandle, address.data(), address.size(), buffer.data(), buffer.size(), I2C_TOOL_TIMEOUT_VALUE_MS); if (ret != ESP_OK) { if (ret == ESP_ERR_TIMEOUT) { ESP_LOGW("I2C", "Bus is busy"); } return {}; } return buffer; } constexpr int DisableBuffer = 0; /*!< I2C master doesn't need buffers */