write, read and write_then_read
This commit is contained in:
parent
fff83857cb
commit
91f5520704
|
|
@ -1,6 +1,8 @@
|
||||||
#include <Adafruit_I2CDevice.h>
|
#include <Adafruit_I2CDevice.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
//#define DEBUG_SERIAL Serial
|
||||||
|
|
||||||
Adafruit_I2CDevice::Adafruit_I2CDevice(uint8_t addr, TwoWire *theWire) {
|
Adafruit_I2CDevice::Adafruit_I2CDevice(uint8_t addr, TwoWire *theWire) {
|
||||||
_addr = addr;
|
_addr = addr;
|
||||||
_wire = theWire;
|
_wire = theWire;
|
||||||
|
|
@ -28,6 +30,93 @@ bool Adafruit_I2CDevice::detected(void) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Adafruit_I2CDevice::write(uint8_t *buffer, size_t len, bool stop) {
|
||||||
|
if (len > 32) {
|
||||||
|
// currently not guaranteed to work if more than 32 bytes!
|
||||||
|
// we will need to find out if some platforms have larger
|
||||||
|
// I2C buffer sizes :/
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.println(F("\tI2CDevice could not write such a large buffer"));
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_wire->beginTransmission(_addr);
|
||||||
|
|
||||||
|
if (_wire->write(buffer, len) != len) {
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.println(F("\tI2CDevice failed to write"));
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.print(F("\tI2CDevice Wrote: "));
|
||||||
|
for (int i=0; i<len; i++) {
|
||||||
|
DEBUG_SERIAL.print(F("0x"));
|
||||||
|
DEBUG_SERIAL.print(buffer[i], HEX);
|
||||||
|
DEBUG_SERIAL.print(F(", "));
|
||||||
|
if (len % 32 == 31) {
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
return (_wire -> endTransmission(stop) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Adafruit_I2CDevice::read(uint8_t *buffer, size_t len, bool stop) {
|
||||||
|
if (len > 32) {
|
||||||
|
// currently not guaranteed to work if more than 32 bytes!
|
||||||
|
// we will need to find out if some platforms have larger
|
||||||
|
// I2C buffer sizes :/
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.println(F("\tI2CDevice could not read such a large buffer"));
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_wire->requestFrom(_addr, (uint8_t)len, stop) != len) {
|
||||||
|
// Not enough data available to fulfill our obligation!
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.println(F("\tI2CDevice did not receive enough data"));
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint16_t i=0; i<len; i++) {
|
||||||
|
buffer[i] = _wire->read();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_SERIAL
|
||||||
|
DEBUG_SERIAL.print(F("\tI2CDevice Read: "));
|
||||||
|
for (int i=0; i<len; i++) {
|
||||||
|
DEBUG_SERIAL.print(F("0x"));
|
||||||
|
DEBUG_SERIAL.print(buffer[i], HEX);
|
||||||
|
DEBUG_SERIAL.print(F(", "));
|
||||||
|
if (len % 32 == 31) {
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DEBUG_SERIAL.println();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Adafruit_I2CDevice::write_then_read(uint8_t *write_buffer, size_t write_len, uint8_t *read_buffer, size_t read_len, bool stop) {
|
||||||
|
if (! write(write_buffer, write_len, stop)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return read(read_buffer, read_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint8_t Adafruit_I2CDevice::address(void) {
|
uint8_t Adafruit_I2CDevice::address(void) {
|
||||||
return _addr;
|
return _addr;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,4 +12,8 @@ public:
|
||||||
uint8_t address(void);
|
uint8_t address(void);
|
||||||
bool begin(void);
|
bool begin(void);
|
||||||
bool detected(void);
|
bool detected(void);
|
||||||
|
|
||||||
|
bool read(uint8_t *buffer, size_t len, bool stop=true);
|
||||||
|
bool write(uint8_t *buffer, size_t len, bool stop=true);
|
||||||
|
bool write_then_read(uint8_t *write_buffer, size_t write_len, uint8_t *read_buffer, size_t read_len, bool stop=false);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
#include <Adafruit_I2CDevice.h>
|
||||||
|
|
||||||
|
#define I2C_ADDRESS 0x60
|
||||||
|
Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(I2C_ADDRESS);
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
while (!Serial) { delay(10); }
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("I2C device read and write test");
|
||||||
|
|
||||||
|
if (!i2c_dev.begin()) {
|
||||||
|
Serial.print("Did not find device at 0x");
|
||||||
|
Serial.println(i2c_dev.address(), HEX);
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
Serial.print("Device found on address 0x");
|
||||||
|
Serial.println(i2c_dev.address(), HEX);
|
||||||
|
|
||||||
|
uint8_t buffer[32];
|
||||||
|
// Try to read 32 bytes
|
||||||
|
i2c_dev.read(buffer, 32);
|
||||||
|
Serial.print("Read: ");
|
||||||
|
for (uint8_t i=0; i<32; i++) {
|
||||||
|
Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", ");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
// read a register by writing first, then reading
|
||||||
|
buffer[0] = 0x0C; // we'll reuse the same buffer
|
||||||
|
i2c_dev.write_then_read(buffer, 1, buffer, 2, false);
|
||||||
|
Serial.print("Write then Read: ");
|
||||||
|
for (uint8_t i=0; i<2; i++) {
|
||||||
|
Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", ");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue