Skip to content

Commit

Permalink
Merge pull request #18 from caternuson/iss16_busio
Browse files Browse the repository at this point in the history
Convert to BusIO
  • Loading branch information
caternuson authored Sep 17, 2021
2 parents 1db9a0a + 9fe141d commit f9b53d3
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 175 deletions.
229 changes: 62 additions & 167 deletions Adafruit_LSM9DS1.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@
*/
/**************************************************************************/
Adafruit_LSM9DS1::Adafruit_LSM9DS1(TwoWire *wireBus, int32_t sensorID) {
initI2C(wireBus, sensorID);
_wire = wireBus;
initSensor(sensorID);
}

/**************************************************************************/
Expand All @@ -36,7 +37,8 @@ Adafruit_LSM9DS1::Adafruit_LSM9DS1(TwoWire *wireBus, int32_t sensorID) {
*/
/**************************************************************************/
Adafruit_LSM9DS1::Adafruit_LSM9DS1(int32_t sensorID) {
initI2C(&Wire, sensorID);
_wire = &Wire;
initSensor(sensorID);
}

/**************************************************************************/
Expand All @@ -48,42 +50,11 @@ Adafruit_LSM9DS1::Adafruit_LSM9DS1(int32_t sensorID) {
*/
/**************************************************************************/
Adafruit_LSM9DS1::Adafruit_LSM9DS1(int8_t xgcs, int8_t mcs, int32_t sensorID) {
_i2c = false;
// hardware SPI!
_csm = mcs;
_csxg = xgcs;
_mosi = _miso = _clk = -1;
_lsm9dso_sensorid_accel = sensorID + 1;
//_lsm9dso_sensorid_mag = sensorID + 2;
_lsm9dso_sensorid_gyro = sensorID + 3;
_lsm9dso_sensorid_temp = sensorID + 4;
_accelSensor = Sensor(this, &Adafruit_LSM9DS1::readAccel,
&Adafruit_LSM9DS1::getAccelEvent,
&Adafruit_LSM9DS1::getAccelSensor);
_gyroSensor =
Sensor(this, &Adafruit_LSM9DS1::readGyro, &Adafruit_LSM9DS1::getGyroEvent,
&Adafruit_LSM9DS1::getGyroSensor);
_tempSensor =
Sensor(this, &Adafruit_LSM9DS1::readTemp, &Adafruit_LSM9DS1::getTempEvent,
&Adafruit_LSM9DS1::getTempSensor);
}

void Adafruit_LSM9DS1::initI2C(TwoWire *wireBus, int32_t sensorID) {
_i2c = true;
_wire = wireBus;
_lsm9dso_sensorid_accel = sensorID + 1;
//_lsm9dso_sensorid_mag = sensorID + 2;
_lsm9dso_sensorid_gyro = sensorID + 3;
_lsm9dso_sensorid_temp = sensorID + 4;
_accelSensor = Sensor(this, &Adafruit_LSM9DS1::readAccel,
&Adafruit_LSM9DS1::getAccelEvent,
&Adafruit_LSM9DS1::getAccelSensor);
_gyroSensor =
Sensor(this, &Adafruit_LSM9DS1::readGyro, &Adafruit_LSM9DS1::getGyroEvent,
&Adafruit_LSM9DS1::getGyroSensor);
_tempSensor =
Sensor(this, &Adafruit_LSM9DS1::readTemp, &Adafruit_LSM9DS1::getTempEvent,
&Adafruit_LSM9DS1::getTempSensor);
initSensor(sensorID);
}

/**************************************************************************/
Expand All @@ -99,26 +70,13 @@ void Adafruit_LSM9DS1::initI2C(TwoWire *wireBus, int32_t sensorID) {
/**************************************************************************/
Adafruit_LSM9DS1::Adafruit_LSM9DS1(int8_t sclk, int8_t smiso, int8_t smosi,
int8_t xgcs, int8_t mcs, int32_t sensorID) {
_i2c = false;
// software SPI!
_csm = mcs;
_csxg = xgcs;
_mosi = smosi;
_miso = smiso;
_clk = sclk;
_lsm9dso_sensorid_accel = sensorID + 1;
//_lsm9dso_sensorid_mag = sensorID + 2;
_lsm9dso_sensorid_gyro = sensorID + 3;
_lsm9dso_sensorid_temp = sensorID + 4;
_accelSensor = Sensor(this, &Adafruit_LSM9DS1::readAccel,
&Adafruit_LSM9DS1::getAccelEvent,
&Adafruit_LSM9DS1::getAccelSensor);
_gyroSensor =
Sensor(this, &Adafruit_LSM9DS1::readGyro, &Adafruit_LSM9DS1::getGyroEvent,
&Adafruit_LSM9DS1::getGyroSensor);
_tempSensor =
Sensor(this, &Adafruit_LSM9DS1::readTemp, &Adafruit_LSM9DS1::getTempEvent,
&Adafruit_LSM9DS1::getTempSensor);
initSensor(sensorID);
}

/**************************************************************************/
Expand All @@ -128,35 +86,32 @@ Adafruit_LSM9DS1::Adafruit_LSM9DS1(int8_t sclk, int8_t smiso, int8_t smosi,
*/
/**************************************************************************/
bool Adafruit_LSM9DS1::begin() {
if (_i2c) {
_wire->begin();
if (!_magSensor.begin_I2C(LSM9DS1_ADDRESS_MAG, _wire)) {
if (_wire) {
// I2C
if (i2c_dev)
delete i2c_dev;
i2c_dev = new Adafruit_I2CDevice(LSM9DS1_ADDRESS_ACCELGYRO, _wire);
if (!i2c_dev->begin())
return false;
}
} else if (_clk == -1) {
// Hardware SPI
pinMode(_csxg, OUTPUT);
pinMode(_csm, OUTPUT);
digitalWrite(_csxg, HIGH);
digitalWrite(_csm, HIGH);
SPI.begin();
if (!_magSensor.begin_SPI(_csm)) {
if (!_magSensor.begin_I2C(LSM9DS1_ADDRESS_MAG, _wire))
return false;
}
} else {
// Serial.println("softSPI");
// Sofware SPI
pinMode(_clk, OUTPUT);
pinMode(_mosi, OUTPUT);
pinMode(_miso, INPUT);
pinMode(_csxg, OUTPUT);
pinMode(_csm, OUTPUT);
digitalWrite(_csxg, HIGH);
digitalWrite(_csm, HIGH);
digitalWrite(_clk, HIGH);
if (!_magSensor.begin_SPI(_csm, _clk, _miso, _mosi)) { // soft SPI
return false;
// SPI
if (spi_dev)
delete spi_dev;
if (_clk == -1) {
// Hardware SPI
spi_dev = new Adafruit_SPIDevice(_csxg);
if (!_magSensor.begin_SPI(_csm))
return false;
} else {
// Software SPI
spi_dev = new Adafruit_SPIDevice(_csxg, _clk, _miso, _mosi);
if (!_magSensor.begin_SPI(_csm, _clk, _miso, _mosi))
return false;
}
if (!spi_dev->begin())
return false;
}

// soft reset & reboot accel/gyro
Expand Down Expand Up @@ -573,36 +528,33 @@ void Adafruit_LSM9DS1::getTempSensor(sensor_t *sensor) {
/***************************************************************************
PRIVATE FUNCTIONS
***************************************************************************/
void Adafruit_LSM9DS1::write8(boolean type, byte reg, byte value) {
byte address, _cs;
void Adafruit_LSM9DS1::initSensor(int32_t sensorID) {
_lsm9dso_sensorid_accel = sensorID + 1;
//_lsm9dso_sensorid_mag = sensorID + 2;
_lsm9dso_sensorid_gyro = sensorID + 3;
_lsm9dso_sensorid_temp = sensorID + 4;
_accelSensor = Sensor(this, &Adafruit_LSM9DS1::readAccel,
&Adafruit_LSM9DS1::getAccelEvent,
&Adafruit_LSM9DS1::getAccelSensor);
_gyroSensor =
Sensor(this, &Adafruit_LSM9DS1::readGyro, &Adafruit_LSM9DS1::getGyroEvent,
&Adafruit_LSM9DS1::getGyroSensor);
_tempSensor =
Sensor(this, &Adafruit_LSM9DS1::readTemp, &Adafruit_LSM9DS1::getTempEvent,
&Adafruit_LSM9DS1::getTempSensor);
}

if (type == MAGTYPE) {
address = LSM9DS1_ADDRESS_MAG;
_cs = _csm;
} else {
address = LSM9DS1_ADDRESS_ACCELGYRO;
_cs = _csxg;
}
if (_i2c) {
_wire->beginTransmission(address);
_wire->write(reg);
_wire->write(value);
_wire->endTransmission();
/*
Serial.print("0x"); Serial.print(address, HEX);
Serial.print(" $"); Serial.print(reg, HEX); Serial.print(" = ");
Serial.println(value, HEX);
*/
void Adafruit_LSM9DS1::write8(boolean type, byte reg, byte value) {
// support for writing directly to magnetometer registers removed
// should access via _magSensor methods
if (type == MAGTYPE)
return;

uint8_t buffer[2] = {i2c_dev ? uint8_t(reg) : uint8_t(reg & 0x7F), value};
if (i2c_dev) {
i2c_dev->write(buffer, 2);
} else {
digitalWrite(_cs, LOW);
if (_clk == -1) // hardware SPI
SPI.beginTransaction(SPISettings(200000, MSBFIRST, SPI_MODE0));
// set address
spixfer(reg & 0x7F); // write data
spixfer(value);
if (_clk == -1) // hardware SPI
SPI.endTransaction();
digitalWrite(_cs, HIGH);
spi_dev->write(buffer, 2);
}
}

Expand All @@ -616,74 +568,17 @@ byte Adafruit_LSM9DS1::read8(boolean type, byte reg) {

byte Adafruit_LSM9DS1::readBuffer(boolean type, byte reg, byte len,
uint8_t *buffer) {
byte address, _cs;

if (type == MAGTYPE) {
address = LSM9DS1_ADDRESS_MAG;
_cs = _csm;
} else {
address = LSM9DS1_ADDRESS_ACCELGYRO;
_cs = _csxg;
}

if (_i2c) {
_wire->beginTransmission(address);
_wire->write(reg);
_wire->endTransmission();
if (_wire->requestFrom(address, (byte)len) != len) {
return 0;
}

/*
Serial.print("0x"); Serial.print(address, HEX);
Serial.print(" $"); Serial.print(reg, HEX); Serial.print(": ");
*/

for (uint8_t i = 0; i < len; i++) {
buffer[i] = _wire->read();
// Serial.print(buffer[i], HEX); Serial.print(", ");
}
// Serial.println();

// support for writing directly to magnetometer registers removed
// should access via _magSensor methods
if (type == MAGTYPE)
return 0;

uint8_t regbuf[1] = {i2c_dev ? uint8_t(reg) : uint8_t(reg | 0x80)};
if (i2c_dev) {
i2c_dev->write_then_read(regbuf, 1, buffer, len);
} else {
if (_clk == -1) // hardware SPI
SPI.beginTransaction(SPISettings(200000, MSBFIRST, SPI_MODE0));
else
digitalWrite(_clk, HIGH);
// set address

digitalWrite(_cs, LOW);

spixfer(reg | 0x80); // readdata
for (uint8_t i = 0; i < len; i++) {
buffer[i] = spixfer(0);
}
if (_clk == -1) // hardware SPI
SPI.endTransaction();
else
digitalWrite(_clk, HIGH);
digitalWrite(_cs, HIGH);
spi_dev->write_then_read(regbuf, 1, buffer, len);
}

return len;
}

uint8_t Adafruit_LSM9DS1::spixfer(uint8_t data) {

if (_clk == -1) {
// Serial.println("Hardware SPI");
return SPI.transfer(data);
} else {
// Serial.println("Software SPI");
uint8_t reply = 0;
for (int i = 7; i >= 0; i--) {
reply <<= 1;
digitalWrite(_clk, LOW);
digitalWrite(_mosi, data & (1 << i));
digitalWrite(_clk, HIGH);
if (digitalRead(_miso))
reply |= 1;
}
return reply;
}
}
12 changes: 6 additions & 6 deletions Adafruit_LSM9DS1.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
#define __LSM9DS1_H__

#include "Arduino.h"
#include <Adafruit_I2CDevice.h>
#include <Adafruit_LIS3MDL.h>
#include <Adafruit_SPIDevice.h>
#include <Adafruit_Sensor.h>
#include <SPI.h>
#include <Wire.h>

#define LSM9DS1_ADDRESS_ACCELGYRO (0x6B)
#define LSM9DS1_ADDRESS_MAG (0x1E)
Expand Down Expand Up @@ -236,14 +236,14 @@ class Adafruit_LSM9DS1 {
Adafruit_Sensor &getMag(void) { return _magSensor; }

private:
Adafruit_I2CDevice *i2c_dev = NULL; ///< Pointer to I2C bus interface
Adafruit_SPIDevice *spi_dev = NULL; ///< Pointer to SPI bus interface
void write8(boolean type, byte reg, byte value);
byte read8(boolean type, byte reg);
byte readBuffer(boolean type, byte reg, byte len, uint8_t *buffer);
uint8_t spixfer(uint8_t data);
void initI2C(TwoWire *wireBus, int32_t sensorID);
void initSensor(int32_t sensorID);

boolean _i2c;
TwoWire *_wire;
TwoWire *_wire = NULL;
int8_t _csm, _csxg, _mosi, _miso, _clk;
float _accel_mg_lsb;
float _gyro_dps_digit;
Expand Down
4 changes: 2 additions & 2 deletions library.properties
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
name=Adafruit LSM9DS1 Library
version=2.0.2
version=2.1.0
author=Adafruit
maintainer=Adafruit <[email protected]>
sentence=Arduino library for LSM9DS1 9-DOF sensor board.
paragraph=Arduino library for LSM9DS1 9-DOF sensor board.
category=Sensors
url=https://github.com/adafruit/Adafruit_LSM9DS1
architectures=*
depends=Adafruit Unified Sensor, Adafruit LIS3MDL
depends=Adafruit Unified Sensor, Adafruit LIS3MDL, Adafruit BusIO

0 comments on commit f9b53d3

Please sign in to comment.