Skip to content

Commit

Permalink
Merge pull request #24 from caternuson/iss23_busio
Browse files Browse the repository at this point in the history
Convert to BusIO
  • Loading branch information
caternuson committed Aug 4, 2021
2 parents 36cda27 + 1ed1839 commit 2e03583
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 116 deletions.
133 changes: 25 additions & 108 deletions Adafruit_ADXL345_U.cpp
Expand Up @@ -10,67 +10,10 @@
#include "WProgram.h"
#endif

#include <Wire.h>
#include <limits.h>

#include "Adafruit_ADXL345_U.h"

/**************************************************************************/
/*!
@brief And abstract 'send' method for different versions of the Arduino
Wire library
@returns The byte read
*/
/**************************************************************************/
inline uint8_t Adafruit_ADXL345_Unified::i2cread(void) {
#if ARDUINO >= 100
return Wire.read();
#else
return Wire.receive();
#endif
}

/**************************************************************************/
/*!
@brief And abstract 'send' method for different versions of the Arduino
Wire library
@param x The byte to send
*/
/**************************************************************************/
inline void Adafruit_ADXL345_Unified::i2cwrite(uint8_t x) {
#if ARDUINO >= 100
Wire.write((uint8_t)x);
#else
Wire.send(x);
#endif
}

/**************************************************************************/

/**
* @brief Abstract away SPI receiver & transmitter
* @param clock The pin number for SCK, the SPI ClocK line
* @param miso The pin number for MISO, the SPI Master In Slave Out line
* @param mosi The pin number for MOSI, the SPI Master Out Slave In line
* @param data The byte to send
*
* @return uint8_t The single byte response
*/
static uint8_t spixfer(uint8_t clock, uint8_t miso, uint8_t mosi,
uint8_t data) {
uint8_t reply = 0;
for (int i = 7; i >= 0; i--) {
reply <<= 1;
digitalWrite(clock, LOW);
digitalWrite(mosi, data & (1 << i));
digitalWrite(clock, HIGH);
if (digitalRead(miso))
reply |= 1;
}
return reply;
}

/**************************************************************************/
/*!
@brief Writes one byte to the specified destination register
Expand All @@ -79,16 +22,11 @@ static uint8_t spixfer(uint8_t clock, uint8_t miso, uint8_t mosi,
*/
/**************************************************************************/
void Adafruit_ADXL345_Unified::writeRegister(uint8_t reg, uint8_t value) {
if (_i2c) {
Wire.beginTransmission((uint8_t)_i2caddr);
i2cwrite((uint8_t)reg);
i2cwrite((uint8_t)(value));
Wire.endTransmission();
uint8_t buffer[2] = {reg, value};
if (i2c_dev) {
i2c_dev->write(buffer, 2);
} else {
digitalWrite(_cs, LOW);
spixfer(_clk, _di, _do, reg);
spixfer(_clk, _di, _do, value);
digitalWrite(_cs, HIGH);
spi_dev->write(buffer, 2);
}
}

Expand All @@ -100,20 +38,14 @@ void Adafruit_ADXL345_Unified::writeRegister(uint8_t reg, uint8_t value) {
*/
/**************************************************************************/
uint8_t Adafruit_ADXL345_Unified::readRegister(uint8_t reg) {
if (_i2c) {
Wire.beginTransmission((uint8_t)_i2caddr);
i2cwrite(reg);
Wire.endTransmission();
Wire.requestFrom((uint8_t)_i2caddr, 1);
return (i2cread());
uint8_t buffer[1] = {i2c_dev ? reg : reg | 0x80};
if (i2c_dev) {
i2c_dev->write(buffer, 1);
i2c_dev->read(buffer, 1);
} else {
reg |= 0x80; // read byte
digitalWrite(_cs, LOW);
spixfer(_clk, _di, _do, reg);
uint8_t reply = spixfer(_clk, _di, _do, 0xFF);
digitalWrite(_cs, HIGH);
return reply;
spi_dev->write_then_read(buffer, 1, buffer, 1);
}
return buffer[0];
}

/**************************************************************************/
Expand All @@ -124,21 +56,14 @@ uint8_t Adafruit_ADXL345_Unified::readRegister(uint8_t reg) {
*/
/**************************************************************************/
int16_t Adafruit_ADXL345_Unified::read16(uint8_t reg) {
if (_i2c) {
Wire.beginTransmission((uint8_t)_i2caddr);
i2cwrite(reg);
Wire.endTransmission();
Wire.requestFrom((uint8_t)_i2caddr, 2);
return (uint16_t)(i2cread() | (i2cread() << 8));
uint8_t buffer[2] = {i2c_dev ? reg : reg | 0x80 | 0x40, 0};
if (i2c_dev) {
i2c_dev->write(buffer, 1);
i2c_dev->read(buffer, 2);
} else {
reg |= 0x80 | 0x40; // read byte | multibyte
digitalWrite(_cs, LOW);
spixfer(_clk, _di, _do, reg);
uint16_t reply =
spixfer(_clk, _di, _do, 0xFF) | (spixfer(_clk, _di, _do, 0xFF) << 8);
digitalWrite(_cs, HIGH);
return reply;
spi_dev->write_then_read(buffer, 1, buffer, 2);
}
return uint16_t(buffer[1]) << 8 | uint16_t(buffer[0]);
}

/**************************************************************************/
Expand Down Expand Up @@ -191,7 +116,6 @@ int16_t Adafruit_ADXL345_Unified::getZ(void) {
Adafruit_ADXL345_Unified::Adafruit_ADXL345_Unified(int32_t sensorID) {
_sensorID = sensorID;
_range = ADXL345_RANGE_2_G;
_i2c = true;
}

/**************************************************************************/
Expand All @@ -209,11 +133,8 @@ Adafruit_ADXL345_Unified::Adafruit_ADXL345_Unified(uint8_t clock, uint8_t miso,
int32_t sensorID) {
_sensorID = sensorID;
_range = ADXL345_RANGE_2_G;
_cs = cs;
_clk = clock;
_do = mosi;
_di = miso;
_i2c = false;
spi_dev = new Adafruit_SPIDevice(cs, clock, miso, mosi, 1000000,
SPI_BITORDER_MSBFIRST, SPI_MODE1);
}

/**************************************************************************/
Expand All @@ -224,17 +145,13 @@ Adafruit_ADXL345_Unified::Adafruit_ADXL345_Unified(uint8_t clock, uint8_t miso,
*/
/**************************************************************************/
bool Adafruit_ADXL345_Unified::begin(uint8_t i2caddr) {
_i2caddr = i2caddr;

if (_i2c)
Wire.begin();
else {
pinMode(_cs, OUTPUT);
digitalWrite(_cs, HIGH);
pinMode(_clk, OUTPUT);
digitalWrite(_clk, HIGH);
pinMode(_do, OUTPUT);
pinMode(_di, INPUT);
if (spi_dev == NULL) {
i2c_dev = new Adafruit_I2CDevice(i2caddr, &Wire);
if (!i2c_dev->begin())
return false;
} else {
if (!spi_dev->begin())
return false;
}

/* Check connection */
Expand Down
10 changes: 4 additions & 6 deletions Adafruit_ADXL345_U.h
Expand Up @@ -33,8 +33,9 @@
#include "WProgram.h"
#endif

#include <Adafruit_I2CDevice.h>
#include <Adafruit_SPIDevice.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

/*=========================================================================
I2C ADDRESS/BITS
Expand Down Expand Up @@ -145,14 +146,11 @@ class Adafruit_ADXL345_Unified : public Adafruit_Sensor {
int16_t getX(void), getY(void), getZ(void);

private:
inline uint8_t i2cread(void);
inline void i2cwrite(uint8_t x);
Adafruit_I2CDevice *i2c_dev = NULL; ///< Pointer to I2C bus interface
Adafruit_SPIDevice *spi_dev = NULL; ///< Pointer to SPI bus interface

int32_t _sensorID;
range_t _range;
uint8_t _clk, _do, _di, _cs;
bool _i2c;
int8_t _i2caddr;
};

#endif // Adafruit_ADXL345_h
4 changes: 2 additions & 2 deletions library.properties
@@ -1,10 +1,10 @@
name=Adafruit ADXL345
version=1.2.2
version=1.3.0
author=Adafruit
maintainer=Adafruit <info@adafruit.com>
sentence=Unified driver for the ADXL345 Accelerometer
paragraph=Unified driver for the ADXL345 Accelerometer
category=Sensors
url=https://github.com/adafruit/Adafruit_ADXL345
architectures=*
depends=Adafruit Unified Sensor
depends=Adafruit Unified Sensor, Adafruit BusIO

0 comments on commit 2e03583

Please sign in to comment.