From c26476d253e95fc61d2786e5a1cdf48a2a914102 Mon Sep 17 00:00:00 2001
From: Giulia <giulia.ghirardini@skywarder.eu>
Date: Fri, 17 Mar 2023 17:25:37 +0100
Subject: [PATCH] [LIS2MDL] Changed init and sampleImpl configuration

---
 src/shared/sensors/LIS2MDL/LIS2MDL.cpp | 48 +++++++++++++++-----------
 src/shared/sensors/LIS2MDL/LIS2MDL.h   |  2 +-
 src/tests/sensors/test-lis2mdl.cpp     | 13 +++----
 3 files changed, 35 insertions(+), 28 deletions(-)

diff --git a/src/shared/sensors/LIS2MDL/LIS2MDL.cpp b/src/shared/sensors/LIS2MDL/LIS2MDL.cpp
index 4984c9d3b..bb69eafc4 100644
--- a/src/shared/sensors/LIS2MDL/LIS2MDL.cpp
+++ b/src/shared/sensors/LIS2MDL/LIS2MDL.cpp
@@ -23,6 +23,8 @@
 #include "LIS2MDL.h"
 
 #include <drivers/timer/TimestampTimer.h>
+#include <miosix.h>
+#include <utils/Debug.h>
 
 namespace Boardcore
 {
@@ -44,8 +46,11 @@ bool LIS2MDL::init()
     }
 
     {
+        // Important! It is imperative to get the 4WSPI enabled (set to the
+        // value of 1) due to the four-wire connection for SPI and the I2C_DIS
+        // must be disabled. In addiction, self test is enabled.
         SPITransaction spi(mSlave);
-        spi.writeRegister(CFG_REG_C, 4);
+        spi.writeRegister(CFG_REG_C, (1 << 2) | (1 << 5));
     }
 
     {
@@ -75,9 +80,8 @@ bool LIS2MDL::selfTest()
         lastError = NOT_INIT;
         return false;
     }
-    return true;
 
-    constexpr int NUM_SAMPLES = 5;
+    constexpr int NUM_SAMPLES = 50;
     constexpr int SLEEP_TIME  = 50;
 
     // Absolute value of extra tolerance
@@ -91,8 +95,10 @@ bool LIS2MDL::selfTest()
 
     {
         SPITransaction spi(mSlave);
-        spi.writeRegister(CFG_REG_C, 4);
+        uint16_t temp = spi.readRegister(CFG_REG_C) | (1 << 1);
+        spi.writeRegister(CFG_REG_C, temp);
     }
+    miosix::Thread::sleep(1);
 
     for (int i = 0; i < NUM_SAMPLES; ++i)
     {
@@ -124,36 +130,36 @@ bool LIS2MDL::selfTest()
             deltas[j] > (deltaRange[j][1] + t))
             passed = false;
 
-    if (!passed)
     {
-        // reset configuration, then return
-        applyConfig(mConfig);
+        SPITransaction spi(mSlave);
+        uint16_t temp = spi.readRegister(CFG_REG_C) & ~(1 << 1);
+        spi.writeRegister(CFG_REG_C, temp);
+    }
 
+    // reset configuration, then return
+    applyConfig(mConfig);
+
+    if (!passed)
+    {
         lastError = SELF_TEST_FAIL;
         return false;
     }
 
-    return applyConfig(mConfig);
+    return true;
 }
 
 bool LIS2MDL::applyConfig(Config config)
 {
     SPITransaction spi(mSlave);
-    uint8_t reg = 0, err = 0;
+    uint8_t reg = 0;
 
     // CFG_REG_A
     reg |= config.odr << 2;
     reg |= config.deviceMode;
-    reg |= (spi.readRegister(CFG_REG_A) & 0b11110000);
+    reg |= (1 << 7);
+    reg |= (spi.readRegister(CFG_REG_A) & 0b01110000);
     spi.writeRegister(CFG_REG_A, reg);
 
-    if (err)
-    {
-        LOG_ERR(logger, "Spi error");
-        lastError = BUS_FAULT;
-        return false;
-    }
-
     return true;
 }
 
@@ -185,7 +191,7 @@ LIS2MDLData LIS2MDL::sampleImpl()
         if (currDiv == 0)
         {
             val = spi.readRegister(TEMP_OUT_L_REG);
-            val |= spi.readRegister(TEMP_OUT_H_REG) << 8;
+            val |= ((uint16_t)spi.readRegister(TEMP_OUT_H_REG)) << 8;
 
             newData.temperatureTimestamp = TimestampTimer::getTimestamp();
             newData.temperature = static_cast<float>(val) / LSB_PER_CELSIUS +
@@ -203,15 +209,15 @@ LIS2MDLData LIS2MDL::sampleImpl()
     newData.magneticFieldTimestamp = TimestampTimer::getTimestamp();
 
     val = spi.readRegister(OUTX_L_REG);
-    val |= spi.readRegister(OUTX_H_REG) << 8;
+    val |= ((uint16_t)spi.readRegister(OUTX_H_REG)) << 8;
     newData.magneticFieldX = mUnit * val;
 
     val = spi.readRegister(OUTY_L_REG);
-    val |= spi.readRegister(OUTY_H_REG) << 8;
+    val |= ((uint16_t)spi.readRegister(OUTY_H_REG)) << 8;
     newData.magneticFieldY = mUnit * val;
 
     val = spi.readRegister(OUTZ_L_REG);
-    val |= spi.readRegister(OUTY_H_REG) << 8;
+    val |= ((uint16_t)spi.readRegister(OUTZ_H_REG)) << 8;
     newData.magneticFieldZ = mUnit * val;
 
     return newData;
diff --git a/src/shared/sensors/LIS2MDL/LIS2MDL.h b/src/shared/sensors/LIS2MDL/LIS2MDL.h
index 15cc0136b..c65c07b97 100644
--- a/src/shared/sensors/LIS2MDL/LIS2MDL.h
+++ b/src/shared/sensors/LIS2MDL/LIS2MDL.h
@@ -115,7 +115,7 @@ private:
 
     unsigned currDiv;
     bool isInitialized;
-    float mUnit = 0;
+    float mUnit = 1;  // TODO
 
     enum Registers : uint8_t
     {
diff --git a/src/tests/sensors/test-lis2mdl.cpp b/src/tests/sensors/test-lis2mdl.cpp
index 011a7407e..d0032fa7f 100644
--- a/src/tests/sensors/test-lis2mdl.cpp
+++ b/src/tests/sensors/test-lis2mdl.cpp
@@ -30,7 +30,7 @@ using namespace miosix;
 
 int main()
 {
-    GpioPin cs(GPIOA_BASE, 3), miso(GPIOA_BASE, 6), mosi(GPIOA_BASE, 7),
+    GpioPin cs(GPIOA_BASE, 15), miso(GPIOA_BASE, 6), mosi(GPIOA_BASE, 7),
         clk(GPIOA_BASE, 5);
 
     cs.mode(Mode::OUTPUT);
@@ -53,7 +53,8 @@ int main()
     busConfig.mode         = SPI::Mode::MODE_3;
 
     LIS2MDL::Config config;
-    config.odr = LIS2MDL::ODR_10_HZ;
+    config.odr        = LIS2MDL::ODR_10_HZ;
+    config.deviceMode = LIS2MDL::MD_CONTINUOUS;
     // config.scale              = LIS2MDL::FS_16_GAUSS;
     config.temperatureDivider = 5;
 
@@ -64,7 +65,7 @@ int main()
         TRACE("LIS2MDL: Init failed");
         return 1;
     }
-    TRACE("LIS2MDL: Init done");
+    TRACE("LIS2MDL: Init done\n");
 
     TRACE("Doing self test!\n");
     if (!sensor.selfTest())
@@ -78,9 +79,9 @@ int main()
     while (true)
     {
         sensor.sample();
-        LIS2MDLData data __attribute__((unused)) = sensor.getLastSample();
-        TRACE("%f C | x: %f | y: %f | z %f\n", data.temperature,
+        LIS2MDLData data = sensor.getLastSample();
+        TRACE("%f C | x: %f | y: %f | z: %f\n", data.temperature,
               data.magneticFieldX, data.magneticFieldY, data.magneticFieldZ);
-        miosix::Thread::sleep(2000);
+        miosix::Thread::sleep(100);
     }
 }
-- 
GitLab