-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathi2c.hpp
75 lines (67 loc) · 1.97 KB
/
i2c.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#ifndef ESP32_I2CDEVICE_H_
#define ESP32_I2CDEVICE_H_
#include <esp_types.h>
#include "driver/i2c.h"
#include <esp32/rom/ets_sys.h>
#include "error_type.h"
namespace libesp {
class ESP32_I2CDevice {
protected:
ESP32_I2CDevice(gpio_num_t scl, gpio_num_t sda, i2c_port_t p, uint32_t rxBufSize, uint32_t txBufSize);
public:
~ESP32_I2CDevice();
gpio_num_t getSCL() const {return SCL;}
gpio_num_t getSDA() const {return SDA;}
i2c_port_t getPort() const {return Port;}
uint16_t getRXBufferSize() const {return RXBufferSize;}
uint16_t getTXBufferSize() const {return TXBufferSize;}
void deinit();
protected:
gpio_num_t SCL;
gpio_num_t SDA;
i2c_port_t Port;
uint16_t RXBufferSize;
uint16_t TXBufferSize;
};
class ESP32_I2CSlaveDevice : public ESP32_I2CDevice {
public:
ESP32_I2CSlaveDevice(gpio_num_t scl, gpio_num_t sda, uint8_t address, i2c_port_t p, uint32_t rxBufSize, uint32_t txBufSize );
public:
bool init(bool enablePullUps);
/* writes the data on the next request from the master
* @return number of bytes written or -1 for error
*/
int write(uint8_t *data, uint16_t size, uint16_t ticksToWait);
/* reads the data from master
* @return number of bytes read or -1 for error
*/
int read(uint8_t *data, uint16_t size, uint16_t ticksToWait);
private:
uint8_t Address;
};
class ESP32_I2CMaster : public ESP32_I2CDevice {
public:
enum ACK_TYPE {
ACK_EVERY_BYTE = 0
, NACK_EVERY_BYTE = 1
, NACK_LAST_BYTE = 2
};
public:
ESP32_I2CMaster(gpio_num_t scl, gpio_num_t sda, uint32_t clock, i2c_port_t p, uint32_t rxBufSize, uint32_t txBufSize );
~ESP32_I2CMaster();
static void doIt();
static void doLED();
bool init(bool enablePullUps);
void scan();
ErrorType probe(uint8_t address);
bool start(uint8_t addr, bool forWrite);
bool write(uint8_t *data, uint16_t size, bool ack);
bool read(uint8_t *data, uint16_t size, ACK_TYPE ackType);
bool stop(uint16_t ticksToWait);
uint8_t read(void);
private:
uint32_t MasterClock;
i2c_cmd_handle_t CmdHandle;
};
}
#endif