#include #include //#define DEBUG_SERIAL Serial /*! * @brief Create an I2C device at a given address * @param addr The 7-bit I2C address for the device * @param theWire The I2C bus to use, defaults to &Wire */ Adafruit_I2CDevice::Adafruit_I2CDevice(uint8_t addr, TwoWire *theWire) { _addr = addr; _wire = theWire; _begun = false; } /*! * @brief Initializes and does basic address detection * @return True if I2C initialized and a device with the addr found */ bool Adafruit_I2CDevice::begin(void) { _wire->begin(); _begun = true; return detected(); } /*! * @brief Scans I2C for the address - note will give a false-positive * if there's no pullups on I2C * @return True if I2C initialized and a device with the addr found */ bool Adafruit_I2CDevice::detected(void) { // Init I2C if not done yet if (!_begun && !begin()) { return false; } // A basic scanner, see if it ACK's _wire->beginTransmission(_addr); if (_wire->endTransmission () == 0) { return true; } return false; } /*! * @brief Write a buffer or two to the I2C device. Cannot be more than 32 bytes. * @param buffer Pointer to buffer of data to write * @param len Number of bytes from buffer to write * @param prefix_buffer Pointer to optional array of data to write before buffer. Cannot be more than 32 bytes. * @param prefix_len Number of bytes from prefix buffer to write * @param stop Whether to send an I2C STOP signal on write * @return True if write was successful, otherwise false. */ bool Adafruit_I2CDevice::write(uint8_t *buffer, size_t len, bool stop, uint8_t *prefix_buffer, size_t prefix_len) { if ((len+prefix_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); // Write the prefix data (usually an address) if ((prefix_len != 0) && (prefix_buffer != NULL)) { if (_wire->write(prefix_buffer, prefix_len) != prefix_len) { #ifdef DEBUG_SERIAL DEBUG_SERIAL.println(F("\tI2CDevice failed to write")); #endif return false; } } // Write the data itself 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: ")); if ((prefix_len != 0) && (prefix_buffer != NULL)) { for (uint16_t i=0; i endTransmission(stop) == 0); } /*! * @brief Read from I2C into a buffer from the I2C device. Cannot be more than 32 bytes. * @param buffer Pointer to buffer of data to read into * @param len Number of bytes from buffer to read. * @param stop Whether to send an I2C STOP signal on read * @return True if read was successful, otherwise false. */ 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((uint8_t)_addr, (uint8_t)len, (uint8_t)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; iread(); } #ifdef DEBUG_SERIAL DEBUG_SERIAL.print(F("\tI2CDevice Read: ")); for (uint16_t i=0; i