smart-home/ziyuan/bak/Wire.h
2026-02-26 09:16:34 +08:00

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