diff --git a/workspace/TS100/Core/Drivers/SC7A20.cpp b/workspace/TS100/Core/Drivers/SC7A20.cpp new file mode 100644 index 00000000..7bebb29d --- /dev/null +++ b/workspace/TS100/Core/Drivers/SC7A20.cpp @@ -0,0 +1,69 @@ +/* + * SC7A20.cpp + * + * Created on: 18 Sep. 2020 + * Author: Ralim + */ + +#include +#include +#include + +bool SC7A20::detect() { + if (FRToSI2C::probe(SC7A20_ADDRESS)) { + //Read chip id to ensure its not an address collision + uint8_t id = 0; + if (FRToSI2C::Mem_Read(SC7A20_ADDRESS, SC7A20_WHO_AMI_I, &id, 1)) { + return id == 0b00010001; + } + } + + return false; +} + +static const FRToSI2C::I2C_REG i2c_registers[] = { // + // + { SC7A20_CTRL_REG1, 0b01100111, 0 }, //200Hz, XYZ enabled + { SC7A20_CTRL_REG2, 0b00000000, 0 }, //Setup filter to 0x00 ?? + { SC7A20_CTRL_REG3, 0b00000000, 0 }, //int1 off + { SC7A20_CTRL_REG4, 0b01001000, 0 }, //Block mode off,little-endian,2G,High-pres,self test off + { SC7A20_CTRL_REG5, 0b00000100, 0 }, //fifo off, D4D on int1 + { SC7A20_CTRL_REG6, 0x00, 0 }, //INT2 off + //Basically setup the unit to run, and enable 4D orientation detection + { SC7A20_INT2_CFG, 0b01111110, 0 }, //setup for movement detection + { SC7A20_INT2_THS, 0x28, 0 }, // + { SC7A20_INT2_DURATION, 64, 0 }, // + { SC7A20_INT1_CFG, 0b01111110, 0 }, // + { SC7A20_INT1_THS, 0x28, 0 }, // + { SC7A20_INT1_DURATION, 64, 0 } + + // + }; +bool SC7A20::initalize() { + //Setup acceleration readings + //2G range + //bandwidth = 250Hz + //High pass filter on (Slow compensation) + //Turn off IRQ output pins + //Orientation recognition in symmetrical mode + // Hysteresis is set to ~ 16 counts + //Theta blocking is set to 0b10 + + return FRToSI2C::writeRegistersBulk(SC7A20_ADDRESS, i2c_registers, sizeof(i2c_registers) / sizeof(i2c_registers[0])); + +} + +void SC7A20::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) { + //We can tell the accelerometer to output in LE mode which makes this simple + uint16_t sensorData[3] = { 0, 0, 0 }; + + if (FRToSI2C::Mem_Read(SC7A20_ADDRESS, SC7A20_OUT_X_L, (uint8_t*) sensorData, 6) == false) { + x = y = z = 0; + return; + } + //Shift 6 to make its range ~= the other accelerometers + x = sensorData[0]; + y = sensorData[1]; + z = sensorData[2]; + +} diff --git a/workspace/TS100/Core/Drivers/SC7A20.hpp b/workspace/TS100/Core/Drivers/SC7A20.hpp new file mode 100644 index 00000000..213c1898 --- /dev/null +++ b/workspace/TS100/Core/Drivers/SC7A20.hpp @@ -0,0 +1,27 @@ +/* + * BMA223.hpp + * + * Created on: 18 Sep. 2020 + * Author: Ralim + */ + +#ifndef CORE_DRIVERS_BMA223_HPP_ +#define CORE_DRIVERS_BMA223_HPP_ +#include "I2C_Wrapper.hpp" +#include "BSP.h" +#include "SC7A20_defines.h" + +class SC7A20 { +public: + static bool detect(); + static bool initalize(); + //1 = rh, 2,=lh, 8=flat + static Orientation getOrientation() { + return static_cast((FRToSI2C::I2C_RegisterRead(SC7A20_ADDRESS,SC7A20_INT2_SOURCE) >> 2) - 1); + } + static void getAxisReadings(int16_t& x, int16_t& y, int16_t& z); + +private: +}; + +#endif /* CORE_DRIVERS_BMA223_HPP_ */ diff --git a/workspace/TS100/Core/Drivers/SC7A20_defines.h b/workspace/TS100/Core/Drivers/SC7A20_defines.h new file mode 100644 index 00000000..1b74063e --- /dev/null +++ b/workspace/TS100/Core/Drivers/SC7A20_defines.h @@ -0,0 +1,46 @@ +/* + * BMA223_defines.h + * + * Created on: 18 Sep. 2020 + * Author: Ralim + */ + +#ifndef CORE_DRIVERS_SC7A20_DEFINES_H_ +#define CORE_DRIVERS_SC7A20_DEFINES_H_ + +#define SC7A20_ADDRESS 0x18<<1 +#define SC7A20_WHO_AMI_I 0x0F +#define SC7A20_CTRL_REG1 0x20 +#define SC7A20_CTRL_REG2 0x21 +#define SC7A20_CTRL_REG3 0x22 +#define SC7A20_CTRL_REG4 0x23 +#define SC7A20_CTRL_REG5 0x24 +#define SC7A20_CTRL_REG6 0x25 +#define SC7A20_REFERENCE 0x26 +#define SC7A20_STATUS_REG 0x27 +#define SC7A20_OUT_X_L 0x28 +#define SC7A20_OUT_X_H 0x29 +#define SC7A20_OUT_Y_L 0x2A +#define SC7A20_OUT_Y_H 0x2B +#define SC7A20_OUT_Z_L 0x2C +#define SC7A20_OUT_Z_H 0x2D +#define SC7A20_FIFO_CTRL 0x2E +#define SC7A20_FIFO_SRC 0x2F +#define SC7A20_INT1_CFG 0x30 +#define SC7A20_INT1_SOURCE 0x31 +#define SC7A20_INT1_THS 0x32 +#define SC7A20_INT1_DURATION 0x33 +#define SC7A20_INT2_CFG 0x34 +#define SC7A20_INT2_SOURCE 0x35 +#define SC7A20_INT2_THS 0x36 +#define SC7A20_INT2_DURATION 0x37 +#define SC7A20_CLICK_CFG 0x38 +#define SC7A20_CLICK_SRC 0x39 +#define SC7A20_CLICK_THS 0x3A +#define SC7A20_TIME_LIMIT 0x3B +#define SC7A20_TIME_LATENCY 0x3C +#define SC7A20_TIME_WINDOW 0x3D +#define SC7A20_ACT_THS 0x3E +#define SC7A20_ACT_DURATION 0x3F + +#endif /* CORE_DRIVERS_BMA223_DEFINES_H_ */