M5Unified
I2C_Class.cpp
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 #include "I2C_Class.hpp"
5 
6 #include <M5GFX.h>
7 
8 namespace m5
9 {
12 
13  void I2C_Class::setPort(i2c_port_t port_num, int sda, int scl)
14  {
15  _port_num = port_num;
16  _pin_sda = sda;
17  _pin_scl = scl;
18  m5gfx::i2c::setPins(port_num, sda, scl).has_value();
19  }
20 
21  bool I2C_Class::begin(i2c_port_t port_num, int sda, int scl)
22  {
23  setPort(port_num, sda, scl);
24  return begin();
25  }
26 
27  bool I2C_Class::begin(void)
28  {
29  return m5gfx::i2c::init(_port_num).has_value();
30  }
31 
32  bool I2C_Class::release(void) const
33  {
34  return m5gfx::i2c::release(_port_num).has_value();
35  }
36 
37  bool I2C_Class::start(std::uint8_t address, bool read, std::uint32_t freq) const
38  {
39  return m5gfx::i2c::beginTransaction(_port_num, address, freq, read).has_value();
40  }
41 
42  bool I2C_Class::restart(std::uint8_t address, bool read, std::uint32_t freq) const
43  {
44  return m5gfx::i2c::restart(_port_num, address, freq, read).has_value();
45  }
46 
47  bool I2C_Class::stop(void) const
48  {
49  return m5gfx::i2c::endTransaction(_port_num).has_value();
50  }
51 
52  bool I2C_Class::write(std::uint8_t data) const
53  {
54  return m5gfx::i2c::writeBytes(_port_num, &data, 1).has_value();
55  }
56 
57  bool I2C_Class::write(const std::uint8_t* __restrict__ data, std::size_t length) const
58  {
59  return m5gfx::i2c::writeBytes(_port_num, data, length).has_value();
60  }
61 
62  bool I2C_Class::read(std::uint8_t* __restrict__ result, std::size_t length) const
63  {
64  return m5gfx::i2c::readBytes(_port_num, result, length).has_value();
65  }
66 
67  bool I2C_Class::writeRegister(std::uint8_t address, std::uint8_t reg, const std::uint8_t* __restrict__ data, std::size_t length, std::uint32_t freq) const
68  {
69  return m5gfx::i2c::beginTransaction(_port_num, address, freq, false).has_value()
70  && m5gfx::i2c::writeBytes(_port_num, &reg, 1).has_value()
71  && m5gfx::i2c::writeBytes(_port_num, data, length).has_value()
72  && m5gfx::i2c::endTransaction(_port_num).has_value();
73  }
74 
75  bool I2C_Class::readRegister(std::uint8_t address, std::uint8_t reg, std::uint8_t* __restrict__ result, std::size_t length, std::uint32_t freq) const
76  {
77  return m5gfx::i2c::readRegister(_port_num, address, reg, result, length, freq).has_value();
78  }
79 
80  bool I2C_Class::writeRegister8(std::uint8_t address, std::uint8_t reg, std::uint8_t data, std::uint32_t freq) const
81  {
82  return m5gfx::i2c::writeRegister8(_port_num, address, reg, data, 0, freq).has_value();
83  }
84 
85  std::uint8_t I2C_Class::readRegister8(std::uint8_t address, std::uint8_t reg, std::uint32_t freq) const
86  {
87  return m5gfx::i2c::readRegister8(_port_num, address, reg, freq).value_or(0);
88  }
89 
90  bool I2C_Class::bitOn(std::uint8_t address, std::uint8_t reg, std::uint8_t data, std::uint32_t freq) const
91  {
92  return m5gfx::i2c::bitOn(_port_num, address, reg, data, freq).has_value();
93  }
94 
95  bool I2C_Class::bitOff(std::uint8_t address, std::uint8_t reg, std::uint8_t data, std::uint32_t freq) const
96  {
97  return m5gfx::i2c::bitOff(_port_num, address, reg, data, freq).has_value();
98  }
99 
100  void I2C_Class::scanID(bool* __restrict__ result) const
101  {
102  // ESP32S3ではアドレス0~7をスキャン対象に含めると動作が停止する
103  for (int i = 8; i < 0x78; i++)
104  {
105  result[i] = start(i, false, 400000) && stop();
106  }
107  }
108 
109  bool I2C_Device::writeRegister8Array(const std::uint8_t* reg_data_array, std::size_t length) const
110  {
111  for (size_t i = 0; i < length; i+=2)
112  {
113  if (!_i2c->writeRegister8(_addr, reg_data_array[i], reg_data_array[i+1], _freq))
114  {
115  return false;
116  }
117  }
118  return true;
119  }
120 }
bool read(std::uint8_t *result, std::size_t length) const
Definition: I2C_Class.cpp:62
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 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
bool begin(void)
Definition: I2C_Class.cpp:27
bool stop(void) const
Definition: I2C_Class.cpp:47
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 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
std::uint8_t _addr
Definition: I2C_Class.hpp:197
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
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