Use Adafruit_BusIO for I2C abstraction

This commit is contained in:
Samy Kamkar
2020-12-20 17:22:20 -08:00
parent 65b24e25d4
commit a516aa949d
2 changed files with 15 additions and 46 deletions
+14 -45
View File
@@ -21,6 +21,7 @@
* @section author Author
*
* Written by Limor Fried/Ladyada for Adafruit Industries.
* Updated by Samy Kamkar for cross-platform support.
*
* @section license License
*
@@ -28,7 +29,9 @@
*/
#include "Adafruit_BMP085.h"
#include <Adafruit_I2CDevice.h>
Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(BMP085_I2CADDR);
Adafruit_BMP085::Adafruit_BMP085() {}
boolean Adafruit_BMP085::begin(uint8_t mode) {
@@ -36,7 +39,7 @@ boolean Adafruit_BMP085::begin(uint8_t mode) {
mode = BMP085_ULTRAHIGHRES;
oversampling = mode;
Wire.begin();
i2c_dev.begin();
if (read8(0xD0) != 0x55)
return false;
@@ -274,61 +277,27 @@ float Adafruit_BMP085::readAltitude(float sealevelPressure) {
uint8_t Adafruit_BMP085::read8(uint8_t a) {
uint8_t ret;
Wire.beginTransmission(BMP085_I2CADDR); // start transmission to device
#if !defined(ARDUINO) || (ARDUINO >= 100)
Wire.write(a); // sends register address to read from
#else
Wire.send(a); // sends register address to read from
#endif
Wire.endTransmission(); // end transmission
Wire.beginTransmission(BMP085_I2CADDR); // start transmission to device
Wire.requestFrom(BMP085_I2CADDR, 1); // send data n-bytes read
#if !defined(ARDUINO) || (ARDUINO >= 100)
ret = Wire.read(); // receive DATA
#else
ret = Wire.receive(); // receive DATA
#endif
Wire.endTransmission(); // end transmission
// send 1 byte, reset i2c, read 1 byte
i2c_dev.write_then_read(&a, 1, &ret, 1, true);
return ret;
}
uint16_t Adafruit_BMP085::read16(uint8_t a) {
uint8_t retbuf[2];
uint16_t ret;
Wire.beginTransmission(BMP085_I2CADDR); // start transmission to device
#if !defined(ARDUINO) || (ARDUINO >= 100)
Wire.write(a); // sends register address to read from
#else
Wire.send(a); // sends register address to read from
#endif
Wire.endTransmission(); // end transmission
// send 1 byte, reset i2c, read 2 bytes
// we could typecast uint16_t as uint8_t array but would need to ensure proper endianness
i2c_dev.write_then_read(&a, 1, retbuf, 2, true);
Wire.beginTransmission(BMP085_I2CADDR); // start transmission to device
Wire.requestFrom(BMP085_I2CADDR, 2); // send data n-bytes read
#if !defined(ARDUINO) || (ARDUINO >= 100)
ret = Wire.read(); // receive DATA
ret <<= 8;
ret |= Wire.read(); // receive DATA
#else
ret = Wire.receive(); // receive DATA
ret <<= 8;
ret |= Wire.receive(); // receive DATA
#endif
Wire.endTransmission(); // end transmission
// write_then_read uses uint8_t array
ret = retbuf[1] | (retbuf[0] << 8);
return ret;
}
void Adafruit_BMP085::write8(uint8_t a, uint8_t d) {
Wire.beginTransmission(BMP085_I2CADDR); // start transmission to device
#if !defined(ARDUINO) || (ARDUINO >= 100)
Wire.write(a); // sends register address to read from
Wire.write(d); // write data
#else
Wire.send(a); // sends register address to read from
Wire.send(d); // write data
#endif
Wire.endTransmission(); // end transmission
// send d prefixed with a (a d [stop])
i2c_dev.write(&d, 1, true, &a, 1);
}
+1 -1
View File
@@ -26,7 +26,7 @@
#else
#include "WProgram.h"
#endif
#include "Wire.h"
#include <Adafruit_I2CDevice.h>
#define BMP085_DEBUG 0 //!< Debug mode