ESPHome  2023.9.1
i2c.cpp
Go to the documentation of this file.
1 #include "i2c.h"
2 #include "esphome/core/log.h"
3 #include <memory>
4 
5 namespace esphome {
6 namespace i2c {
7 
8 static const char *const TAG = "i2c";
9 
10 ErrorCode I2CDevice::read_register(uint8_t a_register, uint8_t *data, size_t len, bool stop) {
11  ErrorCode err = this->write(&a_register, 1, stop);
12  if (err != ERROR_OK)
13  return err;
14  return bus_->read(address_, data, len);
15 }
16 
17 ErrorCode I2CDevice::read_register16(uint16_t a_register, uint8_t *data, size_t len, bool stop) {
18  a_register = convert_big_endian(a_register);
19  ErrorCode const err = this->write(reinterpret_cast<const uint8_t *>(&a_register), 2, stop);
20  if (err != ERROR_OK)
21  return err;
22  return bus_->read(address_, data, len);
23 }
24 
25 ErrorCode I2CDevice::write_register(uint8_t a_register, const uint8_t *data, size_t len, bool stop) {
26  WriteBuffer buffers[2];
27  buffers[0].data = &a_register;
28  buffers[0].len = 1;
29  buffers[1].data = data;
30  buffers[1].len = len;
31  return bus_->writev(address_, buffers, 2, stop);
32 }
33 
34 ErrorCode I2CDevice::write_register16(uint16_t a_register, const uint8_t *data, size_t len, bool stop) {
35  a_register = convert_big_endian(a_register);
36  WriteBuffer buffers[2];
37  buffers[0].data = reinterpret_cast<const uint8_t *>(&a_register);
38  buffers[0].len = 2;
39  buffers[1].data = data;
40  buffers[1].len = len;
41  return bus_->writev(address_, buffers, 2, stop);
42 }
43 
44 bool I2CDevice::read_bytes_16(uint8_t a_register, uint16_t *data, uint8_t len) {
45  if (read_register(a_register, reinterpret_cast<uint8_t *>(data), len * 2) != ERROR_OK)
46  return false;
47  for (size_t i = 0; i < len; i++)
48  data[i] = i2ctohs(data[i]);
49  return true;
50 }
51 
52 bool I2CDevice::write_bytes_16(uint8_t a_register, const uint16_t *data, uint8_t len) {
53  // we have to copy in order to be able to change byte order
54  std::unique_ptr<uint16_t[]> temp{new uint16_t[len]};
55  for (size_t i = 0; i < len; i++)
56  temp[i] = htoi2cs(data[i]);
57  return write_register(a_register, reinterpret_cast<const uint8_t *>(temp.get()), len * 2) == ERROR_OK;
58 }
59 
61  this->parent_->write_register(this->register_, &value, 1);
62  return *this;
63 }
64 I2CRegister &I2CRegister::operator&=(uint8_t value) {
65  value &= get();
66  this->parent_->write_register(this->register_, &value, 1);
67  return *this;
68 }
70  value |= get();
71  this->parent_->write_register(this->register_, &value, 1);
72  return *this;
73 }
74 
75 uint8_t I2CRegister::get() const {
76  uint8_t value = 0x00;
77  this->parent_->read_register(this->register_, &value, 1);
78  return value;
79 }
80 
82  this->parent_->write_register16(this->register_, &value, 1);
83  return *this;
84 }
86  value &= get();
87  this->parent_->write_register16(this->register_, &value, 1);
88  return *this;
89 }
91  value |= get();
92  this->parent_->write_register16(this->register_, &value, 1);
93  return *this;
94 }
95 
96 uint8_t I2CRegister16::get() const {
97  uint8_t value = 0x00;
98  this->parent_->read_register16(this->register_, &value, 1);
99  return value;
100 }
101 
102 } // namespace i2c
103 } // namespace esphome
uint16_t i2ctohs(uint16_t i2cshort)
Definition: i2c.h:55
ErrorCode read_register(uint8_t a_register, uint8_t *data, size_t len, bool stop=true)
Definition: i2c.cpp:10
uint8_t get() const
Definition: i2c.cpp:75
bool write_bytes_16(uint8_t a_register, const uint16_t *data, uint8_t len)
Definition: i2c.cpp:52
uint16_t htoi2cs(uint16_t hostshort)
Definition: i2c.h:56
I2CRegister & operator|=(uint8_t value)
Definition: i2c.cpp:69
virtual ErrorCode writev(uint8_t address, WriteBuffer *buffers, size_t cnt)
Definition: i2c_bus.h:48
constexpr14 T convert_big_endian(T val)
Convert a value between host byte order and big endian (most significant byte first) order...
Definition: helpers.h:239
ErrorCode write(const uint8_t *data, uint8_t len, bool stop=true)
Definition: i2c.h:72
ErrorCode write_register16(uint16_t a_register, const uint8_t *data, size_t len, bool stop=true)
Definition: i2c.cpp:34
uint8_t address_
Definition: i2c.h:134
std::string size_t len
Definition: helpers.h:292
virtual ErrorCode read(uint8_t address, uint8_t *buffer, size_t len)
Definition: i2c_bus.h:32
I2CRegister16 & operator=(uint8_t value)
Definition: i2c.cpp:81
I2CRegister16 & operator &=(uint8_t value)
const uint8_t * data
Definition: i2c_bus.h:26
I2CRegister16 & operator|=(uint8_t value)
Definition: i2c.cpp:90
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7
ErrorCode write_register(uint8_t a_register, const uint8_t *data, size_t len, bool stop=true)
Definition: i2c.cpp:25
I2CRegister & operator &=(uint8_t value)
uint8_t get() const
Definition: i2c.cpp:96
ErrorCode read_register16(uint16_t a_register, uint8_t *data, size_t len, bool stop=true)
Definition: i2c.cpp:17
I2CRegister & operator=(uint8_t value)
Definition: i2c.cpp:60
bool read_bytes_16(uint8_t a_register, uint16_t *data, uint8_t len)
Definition: i2c.cpp:44