127 lines
3.4 KiB
C++
127 lines
3.4 KiB
C++
/*
|
|
TwoWire.h - I2C library for ESP32 (based on ESP-IDF i2c_master)
|
|
Copyright (c) 2024. All rights reserved.
|
|
*/
|
|
|
|
#ifndef TwoWire_h
|
|
#define TwoWire_h
|
|
|
|
#include <esp_err.h>
|
|
#include <driver/i2c_master.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#define I2C_BUFFER_LENGTH 258
|
|
typedef void(*user_onRequest)(void);
|
|
typedef void(*user_onReceive)(uint8_t*, int);
|
|
|
|
// I2C 错误码定义(与原代码保持一致)
|
|
typedef enum {
|
|
I2C_ERROR_OK = 0,
|
|
I2C_ERROR_DEVICE, // 设备无响应
|
|
I2C_ERROR_ACK, // 未收到 ACK
|
|
I2C_ERROR_TIMEOUT, // 超时
|
|
I2C_ERROR_BUS, // 总线错误
|
|
I2C_ERROR_BUSY, // 总线忙
|
|
I2C_ERROR_MEMORY, // 缓冲区溢出
|
|
I2C_ERROR_CONTINUE, // 操作继续(重复起始)
|
|
I2C_ERROR_NO_BEGIN // 未开始传输
|
|
} i2c_err_t;
|
|
|
|
class TwoWire {
|
|
private:
|
|
uint8_t num; // 总线编号 (0 或 1)
|
|
int8_t sda; // SDA 引脚
|
|
int8_t scl; // SCL 引脚
|
|
i2c_master_bus_handle_t i2c; // I2C 总线句柄
|
|
|
|
uint32_t _frequency;
|
|
|
|
uint8_t rxBuffer[I2C_BUFFER_LENGTH];
|
|
uint16_t rxIndex;
|
|
uint16_t rxLength;
|
|
uint16_t rxQueued;
|
|
|
|
uint8_t txBuffer[I2C_BUFFER_LENGTH];
|
|
uint16_t txIndex;
|
|
uint16_t txLength;
|
|
uint16_t txAddress;
|
|
uint16_t txQueued;
|
|
|
|
uint8_t transmitting;
|
|
i2c_err_t last_error;
|
|
uint16_t _timeOutMillis;
|
|
|
|
|
|
static const char ERRORTEXT[];
|
|
|
|
public:
|
|
TwoWire(uint8_t bus_num);
|
|
~TwoWire();
|
|
|
|
bool begin(int sda=-1, int scl=-1, uint32_t frequency=0);
|
|
void setClock(uint32_t frequency);
|
|
size_t getClock();
|
|
|
|
void setTimeOut(uint16_t timeOutMillis);
|
|
uint16_t getTimeOut();
|
|
|
|
uint8_t lastError();
|
|
char* getErrorText(uint8_t err);
|
|
|
|
i2c_err_t writeTransmission(uint16_t address, uint8_t* buff, uint16_t size, bool sendStop=true);
|
|
i2c_err_t readTransmission(uint16_t address, uint8_t* buff, uint16_t size, bool sendStop=true, uint32_t* readCount=NULL);
|
|
|
|
void beginTransmission(uint16_t address);
|
|
void beginTransmission(uint8_t address);
|
|
void beginTransmission(int address);
|
|
|
|
uint8_t endTransmission(bool sendStop);
|
|
uint8_t endTransmission(void);
|
|
|
|
uint8_t requestFrom(uint16_t address, uint16_t size, bool sendStop);
|
|
uint8_t requestFrom(uint16_t address, uint16_t size, uint8_t sendStop);
|
|
uint8_t requestFrom(uint16_t address, uint16_t size);
|
|
uint8_t requestFrom(uint8_t address, uint16_t size, uint8_t sendStop);
|
|
uint8_t requestFrom(uint8_t address, uint16_t size);
|
|
uint8_t requestFrom(int address, int size, int sendStop);
|
|
uint8_t requestFrom(int address, int size);
|
|
|
|
size_t write(uint8_t);
|
|
size_t write(const uint8_t*, size_t);
|
|
int available(void);
|
|
int read(void);
|
|
int peek(void);
|
|
void flush(void);
|
|
|
|
inline size_t write(const char* s) {
|
|
return write((const uint8_t*)s, strlen(s));
|
|
}
|
|
inline size_t write(unsigned long n) {
|
|
return write((uint8_t)n);
|
|
}
|
|
inline size_t write(long n) {
|
|
return write((uint8_t)n);
|
|
}
|
|
inline size_t write(unsigned int n) {
|
|
return write((uint8_t)n);
|
|
}
|
|
inline size_t write(int n) {
|
|
return write((uint8_t)n);
|
|
}
|
|
|
|
void onReceive(void (*)(int));
|
|
void onRequest(void (*)(void));
|
|
|
|
uint32_t setDebugFlags(uint32_t setBits, uint32_t resetBits);
|
|
bool busy();
|
|
|
|
private:
|
|
i2c_err_t esp_err_to_i2c_err(esp_err_t err);
|
|
};
|
|
|
|
extern TwoWire Wire;
|
|
extern TwoWire Wire1;
|
|
|
|
#endif |