From 730f7cf41567a2b3fbc6b9187d30c57bbdeac470 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 12 Feb 2022 11:13:41 +1100 Subject: [PATCH] SC7A20 handle address --- source/Core/Drivers/SC7A20.cpp | 20 ++++++-- source/Core/Drivers/SC7A20.hpp | 3 +- source/Core/Drivers/SC7A20_defines.h | 74 +++++++++++++++------------- 3 files changed, 58 insertions(+), 39 deletions(-) diff --git a/source/Core/Drivers/SC7A20.cpp b/source/Core/Drivers/SC7A20.cpp index b6b7ee4f..cd37e584 100644 --- a/source/Core/Drivers/SC7A20.cpp +++ b/source/Core/Drivers/SC7A20.cpp @@ -9,15 +9,29 @@ #include #include +uint8_t SC7A20::activeAddress; + 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; + if (id == SC7A20_WHO_AM_I_VALUE) { + activeAddress = SC7A20_ADDRESS; + return true; + } + } + } + if (FRToSI2C::probe(SC7A20_ADDRESS2)) { + // Read chip id to ensure its not an address collision + uint8_t id = 0; + if (FRToSI2C::Mem_Read(SC7A20_ADDRESS2, SC7A20_WHO_AMI_I, &id, 1)) { + if (id == SC7A20_WHO_AM_I_VALUE) { + activeAddress = SC7A20_ADDRESS2; + return true; + } } } - return false; } @@ -50,7 +64,7 @@ bool SC7A20::initalize() { // 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])); + return FRToSI2C::writeRegistersBulk(activeAddress, i2c_registers, sizeof(i2c_registers) / sizeof(i2c_registers[0])); } void SC7A20::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) { diff --git a/source/Core/Drivers/SC7A20.hpp b/source/Core/Drivers/SC7A20.hpp index f7bba230..f7cd9776 100644 --- a/source/Core/Drivers/SC7A20.hpp +++ b/source/Core/Drivers/SC7A20.hpp @@ -17,7 +17,7 @@ public: static bool initalize(); // 1 = rh, 2,=lh, 8=flat static Orientation getOrientation() { - uint8_t val = ((FRToSI2C::I2C_RegisterRead(SC7A20_ADDRESS, SC7A20_INT2_SOURCE) >> 2) - 1); + uint8_t val = ((FRToSI2C::I2C_RegisterRead(activeAddress, SC7A20_INT2_SOURCE) >> 2) - 1); if (val == 1) return Orientation::ORIENTATION_LEFT_HAND; else if (val == 4 || val == 0) @@ -28,6 +28,7 @@ public: static void getAxisReadings(int16_t &x, int16_t &y, int16_t &z); private: + static uint8_t activeAddress; }; #endif /* CORE_DRIVERS_BMA223_HPP_ */ diff --git a/source/Core/Drivers/SC7A20_defines.h b/source/Core/Drivers/SC7A20_defines.h index fc3d6d6d..85fc5720 100644 --- a/source/Core/Drivers/SC7A20_defines.h +++ b/source/Core/Drivers/SC7A20_defines.h @@ -1,5 +1,5 @@ /* - * BMA223_defines.h + * SC7A20_defines.h * * Created on: 18 Sep. 2020 * Author: Ralim @@ -8,39 +8,43 @@ #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 +#define SC7A20_ADDRESS 0x18 << 1 +// Sometimes the SC7A20 turns up programmed to impersonate the LIS2DH12 +#define SC7A20_ADDRESS2 (25 << 1) + +#define SC7A20_WHO_AM_I_VALUE (0b00010001) +#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_ */