M5Unified
I2C_Class.hpp
Go to the documentation of this file.
1 // Copyright (c) M5Stack. All rights reserved.
2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3 
4 #ifndef __M5_I2C_CLASS_H__
5 #define __M5_I2C_CLASS_H__
6 
7 #include "m5unified_common.h"
8 #if __has_include ( <driver/i2c.h> )
9 
10 #include <driver/i2c.h>
11 
12 #endif
13 
14 #include <cstdint>
15 #include <cstddef>
16 
17 namespace m5
18 {
19  class I2C_Class
20  {
21  public:
26  void setPort(i2c_port_t port_num, int pin_sda, int pin_scl);
27 
33  bool begin(i2c_port_t port_num, int pin_sda, int pin_scl);
34 
37  bool begin(void);
38 
41  bool release(void) const;
42 
47  bool start(std::uint8_t address, bool read, std::uint32_t freq) const;
48 
53  bool restart(std::uint8_t address, bool read, std::uint32_t freq) const;
54 
58  bool stop(void) const;
59 
63  bool write(std::uint8_t data) const;
64 
69  bool write(const std::uint8_t* data, std::size_t length) const;
70 
75  bool read(std::uint8_t* result, std::size_t length) const;
76 
77  //----------
78 
85  bool writeRegister(std::uint8_t address, std::uint8_t reg, const std::uint8_t* data, std::size_t length, std::uint32_t freq) const;
86 
93  bool readRegister(std::uint8_t address, std::uint8_t reg, std::uint8_t* result, std::size_t length, std::uint32_t freq) const;
94 
100  bool writeRegister8(std::uint8_t address, std::uint8_t reg, std::uint8_t data, std::uint32_t freq) const;
101 
106  std::uint8_t readRegister8(std::uint8_t address, std::uint8_t reg, std::uint32_t freq) const;
107 
113  bool bitOn(std::uint8_t address, std::uint8_t reg, std::uint8_t data, std::uint32_t freq) const;
114 
120  bool bitOff(std::uint8_t address, std::uint8_t reg, std::uint8_t data, std::uint32_t freq) const;
121 
124  void scanID(bool* result) const;
125 
126  i2c_port_t getPort(void) const { return _port_num; }
127  int8_t getSDA(void) const { return _pin_sda; }
128  int8_t getSCL(void) const { return _pin_scl; }
129 
130  bool isEnabled(void) const { return _port_num >= 0; }
131 
132  private:
133  i2c_port_t _port_num = (i2c_port_t)-1;
134  int8_t _pin_sda = -1;
135  int8_t _pin_scl = -1;
136  };
137 
138 
139 
141  extern I2C_Class In_I2C;
142 
144  extern I2C_Class Ex_I2C;
145 
146 
147 
149  {
150  public:
151  I2C_Device(std::uint8_t i2c_addr, std::uint32_t freq, I2C_Class* i2c = &In_I2C)
152  : _i2c { i2c }
153  , _freq { freq }
154  , _addr { i2c_addr }
155  , _init { false }
156  {}
157 
158  void setPort(I2C_Class* i2c) { _i2c = i2c; }
159 
160  bool writeRegister8(std::uint8_t reg, std::uint8_t data) const
161  {
162  return _i2c->writeRegister8(_addr, reg, data, _freq);
163  }
164 
165  std::uint8_t readRegister8(std::uint8_t reg) const
166  {
167  return _i2c->readRegister8(_addr, reg, _freq);
168  }
169 
170  bool writeRegister8Array(const std::uint8_t* reg_data_array, std::size_t length) const;
171 
172  bool writeRegister(std::uint8_t reg, const std::uint8_t* data, std::size_t length) const
173  {
174  return _i2c->writeRegister(_addr, reg, data, length, _freq);
175  }
176 
177  bool readRegister(std::uint8_t reg, std::uint8_t* result, std::size_t length) const
178  {
179  return _i2c->readRegister(_addr, reg, result, length, _freq);
180  }
181 
182  bool bitOn(std::uint8_t reg, std::uint8_t bit) const
183  {
184  return _i2c->bitOn(_addr, reg, bit, _freq);
185  }
186 
187  bool bitOff(std::uint8_t reg, std::uint8_t bit) const
188  {
189  return _i2c->bitOff(_addr, reg, bit, _freq);
190  }
191 
192  bool isEnabled(void) const { return _init; }
193 
194  protected:
196  std::uint32_t _freq;
197  std::uint8_t _addr;
198  bool _init;
199  };
200 
201 }
202 
203 #endif
bool read(std::uint8_t *result, std::size_t length) const
Definition: I2C_Class.cpp:62
int8_t getSDA(void) const
Definition: I2C_Class.hpp:127
void setPort(i2c_port_t port_num, int pin_sda, int pin_scl)
Definition: I2C_Class.cpp:13
bool restart(std::uint8_t address, bool read, std::uint32_t freq) const
Definition: I2C_Class.cpp:42
std::uint8_t readRegister8(std::uint8_t address, std::uint8_t reg, std::uint32_t freq) const
Definition: I2C_Class.cpp:85
void scanID(bool *result) const
Definition: I2C_Class.cpp:100
bool bitOff(std::uint8_t address, std::uint8_t reg, std::uint8_t data, std::uint32_t freq) const
Definition: I2C_Class.cpp:95
bool isEnabled(void) const
Definition: I2C_Class.hpp:130
bool bitOn(std::uint8_t address, std::uint8_t reg, std::uint8_t data, std::uint32_t freq) const
Definition: I2C_Class.cpp:90
bool write(std::uint8_t data) const
Definition: I2C_Class.cpp:52
bool writeRegister(std::uint8_t address, std::uint8_t reg, const std::uint8_t *data, std::size_t length, std::uint32_t freq) const
Definition: I2C_Class.cpp:67
bool start(std::uint8_t address, bool read, std::uint32_t freq) const
Definition: I2C_Class.cpp:37
int8_t getSCL(void) const
Definition: I2C_Class.hpp:128
bool begin(void)
Definition: I2C_Class.cpp:27
bool stop(void) const
Definition: I2C_Class.cpp:47
i2c_port_t getPort(void) const
Definition: I2C_Class.hpp:126
bool writeRegister8(std::uint8_t address, std::uint8_t reg, std::uint8_t data, std::uint32_t freq) const
Definition: I2C_Class.cpp:80
bool release(void) const
Definition: I2C_Class.cpp:32
bool write(const std::uint8_t *data, std::size_t length) const
bool readRegister(std::uint8_t address, std::uint8_t reg, std::uint8_t *result, std::size_t length, std::uint32_t freq) const
Definition: I2C_Class.cpp:75
std::uint32_t _freq
Definition: I2C_Class.hpp:196
bool bitOn(std::uint8_t reg, std::uint8_t bit) const
Definition: I2C_Class.hpp:182
bool bitOff(std::uint8_t reg, std::uint8_t bit) const
Definition: I2C_Class.hpp:187
I2C_Device(std::uint8_t i2c_addr, std::uint32_t freq, I2C_Class *i2c=&In_I2C)
Definition: I2C_Class.hpp:151
std::uint8_t _addr
Definition: I2C_Class.hpp:197
bool readRegister(std::uint8_t reg, std::uint8_t *result, std::size_t length) const
Definition: I2C_Class.hpp:177
std::uint8_t readRegister8(std::uint8_t reg) const
Definition: I2C_Class.hpp:165
I2C_Class * _i2c
Definition: I2C_Class.hpp:195
bool writeRegister8Array(const std::uint8_t *reg_data_array, std::size_t length) const
Definition: I2C_Class.cpp:109
void setPort(I2C_Class *i2c)
Definition: I2C_Class.hpp:158
bool isEnabled(void) const
Definition: I2C_Class.hpp:192
bool writeRegister8(std::uint8_t reg, std::uint8_t data) const
Definition: I2C_Class.hpp:160
bool writeRegister(std::uint8_t reg, const std::uint8_t *data, std::size_t length) const
Definition: I2C_Class.hpp:172
Definition: M5Unified.cpp:48
I2C_Class Ex_I2C
for external I2C device
Definition: I2C_Class.cpp:11
I2C_Class In_I2C
for internal I2C device
Definition: I2C_Class.cpp:10