diff --git a/workspace/TS100/Core/Inc/LIS2DH12.hpp b/workspace/TS100/Core/Inc/LIS2DH12.hpp index 5a30288f..ed9d844a 100644 --- a/workspace/TS100/Core/Inc/LIS2DH12.hpp +++ b/workspace/TS100/Core/Inc/LIS2DH12.hpp @@ -1,42 +1,46 @@ -/* - * LIS2DH12.hpp - * - * Created on: 27Feb.,2018 - * Author: Ralim - */ - -#ifndef LIS2DH12_HPP_ -#define LIS2DH12_HPP_ -#include "stm32f1xx_hal.h" -#include "FRToSI2C.hpp" -#include "LIS2DH12_defines.hpp" -#include "hardware.h" - -class LIS2DH12 { -public: - static void initalize(); - //1 = rh, 2,=lh, 8=flat - static Orientation getOrientation() { -#ifdef MODEL_TS80 - uint8_t val = (FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS, - LIS_INT2_SRC) >> 2); - if (val == 8) - val = 3; - else if (val == 1) - val = 1; - else if (val == 2) - val = 0; - else - val = 3; - return static_cast(val); -#endif -#ifdef MODEL_TS100 - return static_cast((FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS,LIS_INT2_SRC) >> 2) - 1); -#endif - } - static void getAxisReadings(int16_t& x, int16_t& y, int16_t& z); - -private: -}; - -#endif /* LIS2DH12_HPP_ */ +/* + * LIS2DH12.hpp + * + * Created on: 27Feb.,2018 + * Author: Ralim + */ + +#ifndef LIS2DH12_HPP_ +#define LIS2DH12_HPP_ +#include "stm32f1xx_hal.h" +#include "FRToSI2C.hpp" +#include "LIS2DH12_defines.hpp" +#include "hardware.h" + +#ifdef MODEL_TS80 +#define LIS_ORI_FLIP +#endif +class LIS2DH12 { +public: + static bool detect(); + static void initalize(); + //1 = rh, 2,=lh, 8=flat + static Orientation getOrientation() { +#ifdef LIS_ORI_FLIP + uint8_t val = (FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS, + LIS_INT2_SRC) >> 2); + if (val == 8) + val = 3; + else if (val == 1) + val = 1; + else if (val == 2) + val = 0; + else + val = 3; + return static_cast(val); +#endif +#ifdef MODEL_TS100 + return static_cast((FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS,LIS_INT2_SRC) >> 2) - 1); +#endif + } + static void getAxisReadings(int16_t& x, int16_t& y, int16_t& z); + +private: +}; + +#endif /* LIS2DH12_HPP_ */ diff --git a/workspace/TS100/Core/Inc/MMA8652FC.hpp b/workspace/TS100/Core/Inc/MMA8652FC.hpp index b6d2938e..7a3ec037 100644 --- a/workspace/TS100/Core/Inc/MMA8652FC.hpp +++ b/workspace/TS100/Core/Inc/MMA8652FC.hpp @@ -1,27 +1,28 @@ -/* - * MMA8652FC.h - * - * Created on: 31Aug.,2017 - * Author: Ben V. Brown - */ - -#ifndef MMA8652FC_HPP_ -#define MMA8652FC_HPP_ -#include "stm32f1xx_hal.h" -#include "MMA8652FC_defines.h" -#include "FRToSI2C.hpp" -#include "hardware.h" - -class MMA8652FC { - -public: - - - static void initalize(); // Initalize the system - static Orientation getOrientation();// Reads the I2C register and returns the orientation (true == left) - static void getAxisReadings(int16_t& x, int16_t& y, int16_t& z); - -private: -}; - -#endif /* MMA8652FC_HPP_ */ +/* + * MMA8652FC.h + * + * Created on: 31Aug.,2017 + * Author: Ben V. Brown + */ + +#ifndef MMA8652FC_HPP_ +#define MMA8652FC_HPP_ +#include "stm32f1xx_hal.h" +#include "MMA8652FC_defines.h" +#include "FRToSI2C.hpp" +#include "hardware.h" + +class MMA8652FC { + +public: + //Returns true if this accelerometer is detected + static bool detect(); + //Init any internal state + static void initalize(); + static Orientation getOrientation(); // Reads the I2C register and returns the orientation (true == left) + static void getAxisReadings(int16_t &x, int16_t &y, int16_t &z); + +private: +}; + +#endif /* MMA8652FC_HPP_ */ diff --git a/workspace/TS100/Core/Src/LIS2DH12.cpp b/workspace/TS100/Core/Src/LIS2DH12.cpp index b1d25703..f4fcbbfe 100644 --- a/workspace/TS100/Core/Src/LIS2DH12.cpp +++ b/workspace/TS100/Core/Src/LIS2DH12.cpp @@ -1,50 +1,60 @@ -/* - * LIS2DH12.cpp - * - * Created on: 27Feb.,2018 - * Author: Ralim - */ - -#include - -#include "LIS2DH12.hpp" -#include "cmsis_os.h" - -typedef struct { - const uint8_t reg; - const uint8_t value; -} LIS_REG; - -static const LIS_REG i2c_registers[] = { - {LIS_CTRL_REG1, 0x17}, // 25Hz - {LIS_CTRL_REG2, 0b00001000}, // Highpass filter off - {LIS_CTRL_REG3, 0b01100000}, // Setup interrupt pins - {LIS_CTRL_REG4, 0b00001000}, // Block update mode off, HR on - {LIS_CTRL_REG5, 0b00000010}, - {LIS_CTRL_REG6, 0b01100010}, - //Basically setup the unit to run, and enable 4D orientation detection - {LIS_INT2_CFG, 0b01111110}, //setup for movement detection - {LIS_INT2_THS, 0x28}, - {LIS_INT2_DURATION, 64}, - {LIS_INT1_CFG, 0b01111110}, - {LIS_INT1_THS, 0x28}, - {LIS_INT1_DURATION, 64} -}; - -void LIS2DH12::initalize() { - for (size_t index = 0; index < (sizeof(i2c_registers) / sizeof(i2c_registers[0])); index++) { - FRToSI2C::I2C_RegisterWrite(LIS2DH_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].value); - } -} - -void LIS2DH12::getAxisReadings(int16_t& x, int16_t& y, int16_t& z) { - std::array sensorData; - - FRToSI2C::Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8, I2C_MEMADD_SIZE_8BIT, - reinterpret_cast(sensorData.begin()), - sensorData.size() * sizeof(int16_t)); - - x = sensorData[0]; - y = sensorData[1]; - z = sensorData[2]; -} +/* + * LIS2DH12.cpp + * + * Created on: 27Feb.,2018 + * Author: Ralim + */ + +#include + +#include "LIS2DH12.hpp" +#include "cmsis_os.h" + +typedef struct { + const uint8_t reg; + const uint8_t value; +} LIS_REG; + +static const LIS_REG i2c_registers[] = + { { LIS_CTRL_REG1, 0x17 }, // 25Hz + { LIS_CTRL_REG2, 0b00001000 }, // Highpass filter off + { LIS_CTRL_REG3, 0b01100000 }, // Setup interrupt pins + { LIS_CTRL_REG4, 0b00001000 }, // Block update mode off, HR on + { LIS_CTRL_REG5, 0b00000010 }, { LIS_CTRL_REG6, 0b01100010 }, + //Basically setup the unit to run, and enable 4D orientation detection + { LIS_INT2_CFG, 0b01111110 }, //setup for movement detection + { LIS_INT2_THS, 0x28 }, { LIS_INT2_DURATION, 64 }, { + LIS_INT1_CFG, 0b01111110 }, { LIS_INT1_THS, 0x28 }, { + LIS_INT1_DURATION, 64 } }; + +void LIS2DH12::initalize() { + for (size_t index = 0; + index < (sizeof(i2c_registers) / sizeof(i2c_registers[0])); + index++) { + FRToSI2C::I2C_RegisterWrite(LIS2DH_I2C_ADDRESS, + i2c_registers[index].reg, i2c_registers[index].value); + } +} + +void LIS2DH12::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) { + std::array sensorData; + + FRToSI2C::Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8, I2C_MEMADD_SIZE_8BIT, + reinterpret_cast(sensorData.begin()), + sensorData.size() * sizeof(int16_t)); + + x = sensorData[0]; + y = sensorData[1]; + z = sensorData[2]; +} + +bool LIS2DH12::detect() { + uint8_t buffer[1]; + if (HAL_I2C_Mem_Read(&hi2c1, 25 << 1, 0x0F, I2C_MEMADD_SIZE_8BIT, buffer, 1, + 1000) == HAL_OK) { + //ACK'd + return true; + } + //NAK'd + return false; +} diff --git a/workspace/TS100/Core/Src/MMA8652FC.cpp b/workspace/TS100/Core/Src/MMA8652FC.cpp index ebe10568..bec2fcef 100644 --- a/workspace/TS100/Core/Src/MMA8652FC.cpp +++ b/workspace/TS100/Core/Src/MMA8652FC.cpp @@ -1,78 +1,95 @@ -/* - * MMA8652FC.cpp - * - * Created on: 31Aug.,2017 - * Author: Ben V. Brown - */ - -#include - -#include "MMA8652FC.hpp" -#include "cmsis_os.h" - -typedef struct { - const uint8_t reg; - const uint8_t val; -} MMA_REG; - -static const MMA_REG i2c_registers[] = { { CTRL_REG2, 0 }, //Normal mode - { CTRL_REG2, 0x40 }, // Reset all registers to POR values - { FF_MT_CFG_REG, 0x78 }, // Enable motion detection for X, Y, Z axis, latch disabled - { PL_CFG_REG, 0x40 }, //Enable the orientation detection - { PL_COUNT_REG, 200 }, //200 count debounce - { PL_BF_ZCOMP_REG, 0b01000111 }, //Set the threshold to 42 degrees - { P_L_THS_REG, 0b10011100 }, //Up the trip angles - { CTRL_REG4, 0x01 | (1 << 4) }, // Enable dataready interrupt & orientation interrupt - { CTRL_REG5, 0x01 }, // Route data ready interrupts to INT1 ->PB5 ->EXTI5, leaving orientation routed to INT2 - { CTRL_REG2, 0x12 }, //Set maximum resolution oversampling - { XYZ_DATA_CFG_REG, (1 << 4) }, //select high pass filtered data - { HP_FILTER_CUTOFF_REG, 0x03 }, //select high pass filtered data - { CTRL_REG1, 0x19 } // ODR=12 Hz, Active mode -}; - - -void MMA8652FC::initalize() { - size_t index = 0; - - //send all the init commands to the unit - - FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].val); - index++; - FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].val); - index++; - - HAL_Delay(2); // ~1ms delay - - while (index < (sizeof(i2c_registers) / sizeof(i2c_registers[0]))) { - FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].val); - index++; - } -} - -Orientation MMA8652FC::getOrientation() { - //First read the PL_STATUS register - uint8_t plStatus = FRToSI2C::I2C_RegisterRead(MMA8652FC_I2C_ADDRESS,PL_STATUS_REG); - if ((plStatus & 0b10000000) == 0b10000000) { - plStatus >>= 1; //We don't need the up/down bit - plStatus &= 0x03; //mask to the two lower bits - - //0 == left handed - //1 == right handed - - return static_cast(plStatus); - } - - return ORIENTATION_FLAT; -} - -void MMA8652FC::getAxisReadings(int16_t& x, int16_t& y, int16_t& z) { - std::array sensorData; - - FRToSI2C::Mem_Read(MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG, I2C_MEMADD_SIZE_8BIT, - reinterpret_cast(sensorData.begin()), - sensorData.size() * sizeof(int16_t)); - - x = static_cast(__builtin_bswap16(*reinterpret_cast(&sensorData[0]))); - y = static_cast(__builtin_bswap16(*reinterpret_cast(&sensorData[1]))); - z = static_cast(__builtin_bswap16(*reinterpret_cast(&sensorData[2]))); -} +/* + * MMA8652FC.cpp + * + * Created on: 31Aug.,2017 + * Author: Ben V. Brown + */ + +#include + +#include "MMA8652FC.hpp" +#include "cmsis_os.h" + +typedef struct { + const uint8_t reg; + const uint8_t val; +} MMA_REG; + +static const MMA_REG i2c_registers[] = { { CTRL_REG2, 0 }, //Normal mode + { CTRL_REG2, 0x40 }, // Reset all registers to POR values + { FF_MT_CFG_REG, 0x78 }, // Enable motion detection for X, Y, Z axis, latch disabled + { PL_CFG_REG, 0x40 }, //Enable the orientation detection + { PL_COUNT_REG, 200 }, //200 count debounce + { PL_BF_ZCOMP_REG, 0b01000111 }, //Set the threshold to 42 degrees + { P_L_THS_REG, 0b10011100 }, //Up the trip angles + { CTRL_REG4, 0x01 | (1 << 4) }, // Enable dataready interrupt & orientation interrupt + { CTRL_REG5, 0x01 }, // Route data ready interrupts to INT1 ->PB5 ->EXTI5, leaving orientation routed to INT2 + { CTRL_REG2, 0x12 }, //Set maximum resolution oversampling + { XYZ_DATA_CFG_REG, (1 << 4) }, //select high pass filtered data + { HP_FILTER_CUTOFF_REG, 0x03 }, //select high pass filtered data + { CTRL_REG1, 0x19 } // ODR=12 Hz, Active mode +}; + +void MMA8652FC::initalize() { + size_t index = 0; + + //send all the init commands to the unit + + FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS, i2c_registers[index].reg, + i2c_registers[index].val); + index++; + FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS, i2c_registers[index].reg, + i2c_registers[index].val); + index++; + + HAL_Delay(2); // ~1ms delay + + while (index < (sizeof(i2c_registers) / sizeof(i2c_registers[0]))) { + FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS, + i2c_registers[index].reg, i2c_registers[index].val); + index++; + } +} + +Orientation MMA8652FC::getOrientation() { + //First read the PL_STATUS register + uint8_t plStatus = FRToSI2C::I2C_RegisterRead(MMA8652FC_I2C_ADDRESS, + PL_STATUS_REG); + if ((plStatus & 0b10000000) == 0b10000000) { + plStatus >>= 1; //We don't need the up/down bit + plStatus &= 0x03; //mask to the two lower bits + + //0 == left handed + //1 == right handed + + return static_cast(plStatus); + } + + return ORIENTATION_FLAT; +} + +void MMA8652FC::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) { + std::array sensorData; + + FRToSI2C::Mem_Read(MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG, + I2C_MEMADD_SIZE_8BIT, reinterpret_cast(sensorData.begin()), + sensorData.size() * sizeof(int16_t)); + + x = static_cast(__builtin_bswap16( + *reinterpret_cast(&sensorData[0]))); + y = static_cast(__builtin_bswap16( + *reinterpret_cast(&sensorData[1]))); + z = static_cast(__builtin_bswap16( + *reinterpret_cast(&sensorData[2]))); +} + +bool MMA8652FC::detect() { + uint8_t buffer[1]; + if (HAL_I2C_Mem_Read(&hi2c1, 29 << 1, 0x0F, I2C_MEMADD_SIZE_8BIT, buffer, 1, + 1000) == HAL_OK) { + //The device ACK'd + return true; + } + //NAK'd + return false; +} diff --git a/workspace/TS100/Core/Src/main.cpp b/workspace/TS100/Core/Src/main.cpp index ad952611..d845c7ea 100644 --- a/workspace/TS100/Core/Src/main.cpp +++ b/workspace/TS100/Core/Src/main.cpp @@ -55,14 +55,11 @@ int main(void) { OLED::initialize(); // start up the LCD OLED::setFont(0); // default to bigger font // Testing for which accelerometer is mounted - uint8_t buffer[1]; - HAL_IWDG_Refresh(&hiwdg); - if (HAL_I2C_Mem_Read(&hi2c1, 29 << 1, 0x0F, I2C_MEMADD_SIZE_8BIT, buffer, 1, - 1000) == HAL_OK) { + resetWatchdog(); + if (MMA8652FC::detect()) { PCBVersion = 1; MMA8652FC::initalize(); // this sets up the I2C registers - } else if (HAL_I2C_Mem_Read(&hi2c1, 25 << 1, 0x0F, I2C_MEMADD_SIZE_8BIT, - buffer, 1, 1000) == HAL_OK) { + } else if (LIS2DH12::detect()) { PCBVersion = 2; // Setup the ST Accelerometer LIS2DH12::initalize(); // startup the accelerometer