From 0cef5f8eb673b89d772de3426162e8d55b03a3da Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Mon, 4 Jan 2021 18:22:33 +1100 Subject: [PATCH] Create approx driver for setup --- workspace/TS100/Core/Drivers/MSA301.cpp | 40 +++++++++++++++++++ workspace/TS100/Core/Drivers/MSA301.h | 27 +++++++++++++ workspace/TS100/Core/Drivers/MSA301_defines.h | 34 ++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 workspace/TS100/Core/Drivers/MSA301.cpp create mode 100644 workspace/TS100/Core/Drivers/MSA301.h create mode 100644 workspace/TS100/Core/Drivers/MSA301_defines.h diff --git a/workspace/TS100/Core/Drivers/MSA301.cpp b/workspace/TS100/Core/Drivers/MSA301.cpp new file mode 100644 index 00000000..8b35b628 --- /dev/null +++ b/workspace/TS100/Core/Drivers/MSA301.cpp @@ -0,0 +1,40 @@ +/* + * MSA301.cpp + * + * Created on: 3 Jan 2021 + * Author: Ralim + */ + +#include +#include "MSA301_defines.h" +#define MSA301_I2C_ADDRESS 0x4C +bool MSA301::detect() { + return FRToSI2C::probe(MSA301_I2C_ADDRESS); +} + +static const FRToSI2C::I2C_REG i2c_registers[] = { // + // + { MSA301_REG_ODR, 0b00001000, 1 }, //X/Y/Z enabled @ 250Hz + { MSA301_REG_POWERMODE, 0b0001001, 1 }, // Normal mode + { MSA301_REG_RESRANGE, 0b00000001, 0 }, // 14bit resolution @ 4G range + { MSA301_REG_ORIENT_HY, 0b01000000, 0 }, // 4*62.5mg hyst, no blocking, symmetrical + { MSA301_REG_ORIENT_HY, 0b01000000, 0 }, // 4*62.5mg hyst, no blocking, symmetrical + + }; + +bool MSA301::initalize() { + // Enable X/Y/Z + // Normal mode + // 250Hz filter + // 4G range + // 14 bit resolution + + return FRToSI2C::writeRegistersBulk(MSA301_I2C_ADDRESS, i2c_registers, sizeof(i2c_registers) / sizeof(i2c_registers[0])); +} + +Orientation MSA301::getOrientation() { + //read MSA301_REG_ORIENT_STATUS +} + +void MSA301::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) { +} diff --git a/workspace/TS100/Core/Drivers/MSA301.h b/workspace/TS100/Core/Drivers/MSA301.h new file mode 100644 index 00000000..b77e500d --- /dev/null +++ b/workspace/TS100/Core/Drivers/MSA301.h @@ -0,0 +1,27 @@ +/* + * MSA301.h + * + * Created on: 3 Jan 2021 + * Author: Ralim + */ + +#ifndef DRIVERS_MSA301_H_ +#define DRIVERS_MSA301_H_ +#include "I2C_Wrapper.hpp" +#include "BSP.h" + +class MSA301 { +public: + //Returns true if this accelerometer is detected + static bool detect(); + //Init any internal state + static bool initalize(); + // Reads the I2C register and returns the orientation + static Orientation getOrientation(); + //Return the x/y/z axis readings as signed int16's + static void getAxisReadings(int16_t &x, int16_t &y, int16_t &z); + +private: +}; + +#endif /* DRIVERS_MSA301_H_ */ diff --git a/workspace/TS100/Core/Drivers/MSA301_defines.h b/workspace/TS100/Core/Drivers/MSA301_defines.h new file mode 100644 index 00000000..12ebc62c --- /dev/null +++ b/workspace/TS100/Core/Drivers/MSA301_defines.h @@ -0,0 +1,34 @@ +/* + * MSA301_defines.h + * + * Created on: 3 Jan 2021 + * Author: Ralim + */ + +#ifndef DRIVERS_MSA301_DEFINES_H_ +#define DRIVERS_MSA301_DEFINES_H_ +//Definitions from Adafruit <3 + +#define MSA301_REG_PARTID 0x01 ///< Register that contains the part ID +#define MSA301_REG_OUT_X_L 0x02 ///< Register address for X axis lower byte +#define MSA301_REG_OUT_X_H 0x03 ///< Register address for X axis higher byte +#define MSA301_REG_OUT_Y_L 0x04 ///< Register address for Y axis lower byte +#define MSA301_REG_OUT_Y_H 0x05 ///< Register address for Y axis higher byte +#define MSA301_REG_OUT_Z_L 0x06 ///< Register address for Z axis lower byte +#define MSA301_REG_OUT_Z_H 0x07 ///< Register address for Z axis higher byte +#define MSA301_REG_MOTIONINT 0x09 ///< Register address for motion interrupt +#define MSA301_REG_DATAINT 0x0A ///< Register address for data interrupt +#define MSA301_REG_CLICKSTATUS 0x0B ///< Register address for click/doubleclick status +#define MSA301_REG_RESRANGE 0x0F ///< Register address for resolution range +#define MSA301_REG_ODR 0x10 ///< Register address for data rate setting +#define MSA301_REG_POWERMODE 0x11 ///< Register address for power mode setting +#define MSA301_REG_INTSET0 0x16 ///< Register address for interrupt setting #0 +#define MSA301_REG_INTSET1 0x17 ///< Register address for interrupt setting #1 +#define MSA301_REG_INTMAP0 0x19 ///< Register address for interrupt map #0 +#define MSA301_REG_INTMAP1 0x1A ///< Register address for interrupt map #1 +#define MSA301_REG_TAPDUR 0x2A ///< Register address for tap duration +#define MSA301_REG_TAPTH 0x2B ///< Register address for tap threshold +#define MSA301_REG_ORIENT_HY 0x2C ///< Register address for orientation Hysteresis +#define MSA301_REG_ORIENT_STATUS 0x0C ///< Register address for orientation hysteresis + +#endif /* DRIVERS_MSA301_DEFINES_H_ */