Fixed algorithm to read 3 bytes of accelerometer data registers

Fork of COG4050_adxl355_adxl357 by valeria toffoli

Revision:
10:e054891b3598
Parent:
8:9e6ead2ee8d7
--- a/ADXL35x/ADXL355.cpp	Mon Sep 03 10:39:56 2018 +0000
+++ b/ADXL35x/ADXL355.cpp	Mon Sep 10 10:01:49 2018 +0000
@@ -64,7 +64,8 @@
     cs = true;
     return ret_val;
 }
-uint16_t ADXL355::read_reg_u16(ADXL355_register_t reg){
+uint16_t ADXL355::read_reg_u16(ADXL355_register_t reg)
+{
     uint16_t ret_val = 0;
     adxl355.format(8, _SPI_MODE);
     cs = false;
@@ -74,86 +75,112 @@
     cs = true;
     return ret_val;
 }
-uint32_t ADXL355::read_reg_u20(ADXL355_register_t reg){
-    uint32_t ret_val = 0;
+uint32_t ADXL355::read_reg_u20(ADXL355_register_t reg)
+{
+    uint32_t ret_val = 0, valueH= 0, valueM= 0, valueL= 0;
+    
     adxl355.format(8, _SPI_MODE);
     cs = false;
-    adxl355.write((reg<<1) | _READ_REG_CMD);
-    ret_val = 0x0f & adxl355.write(_DUMMY_BYTE);
+    adxl355.write((reg<<1) | _READ_REG_CMD); //dummy read
+    /*
+    //alternative method from ADICUP360 ADXL355 code
+    valueH = adxl355.write(_DUMMY_BYTE);
+    valueM = adxl355.write(_DUMMY_BYTE);
+    valueL = adxl355.write(_DUMMY_BYTE);
+    
+    ret_val = ((valueH << 16)| (valueM << 8)| valueL);
+    ret_val = ret_val >> 4;
+    */
+    //Valeria's method version 2.0
+    ret_val = adxl355.write(_DUMMY_BYTE);
     ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE);
-    ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE);
+    ret_val = (ret_val<<4) | (adxl355.write(_DUMMY_BYTE) >> 4); 
+    
     cs = true;
     return ret_val;
 }
 /** ----------------------------------- */
 /** Sets the CTL registers              */
 /** ----------------------------------- */
-void ADXL355::set_power_ctl_reg(uint8_t data){
-     write_reg(POWER_CTL, data);
+void ADXL355::set_power_ctl_reg(uint8_t data)
+{
+    write_reg(POWER_CTL, data);
 }
-void ADXL355::set_filter_ctl_reg(ADXL355_filter_ctl_t hpf, ADXL355_filter_ctl_t odr){
+void ADXL355::set_filter_ctl_reg(ADXL355_filter_ctl_t hpf, ADXL355_filter_ctl_t odr)
+{
     write_reg(FILTER, static_cast<uint8_t>(hpf|odr));
 }
-void ADXL355::set_clk(ADXL355_sync_ctl_t data) {
+void ADXL355::set_clk(ADXL355_sync_ctl_t data)
+{
     write_reg(SYNC, static_cast<uint8_t>(data));
 }
-void ADXL355::set_device(ADXL355_range_ctl_t range) {
+void ADXL355::set_device(ADXL355_range_ctl_t range)
+{
     write_reg(RANGE, static_cast<uint8_t>(range));
-    switch(range){
+    switch(range) {
         case 0x01:
             axis355_sens = 3.9e-6;
-            axis357_sens = 19.5e-6;
+            axis357_sens = 19.5e-6; //scale factor g per LSB
             break;
         case 0x02:
             axis355_sens = 7.8e-6;
-            axis357_sens = 39e-6;
+            axis357_sens = 39e-6; //scale factor g per LSB
             break;
         case 0x03:
             axis355_sens = 15.6e-6;
-            axis357_sens = 78e-6;
+            axis357_sens = 78e-6; //scale factor g per LSB
             break;
-        }
+    }
 }
 /** ----------------------------------- */
 /** Read the STATUS registers           */
 /** ----------------------------------- */
-uint8_t ADXL355::read_status(){
+uint8_t ADXL355::read_status()
+{
     return read_reg(STATUS);
 }
 /** ----------------------------------- */
 /** ADXL must be set in measurement     */
 /** mode to read the data registers     */
 /** ----------------------------------- */
-uint32_t ADXL355::scanx(){
+uint32_t ADXL355::scanx()
+{
     return read_reg_u20(XDATA3);
 }
-uint32_t ADXL355::scany(){
+uint32_t ADXL355::scany()
+{
     return read_reg_u20(YDATA3);
 }
-uint32_t ADXL355::scanz(){
+uint32_t ADXL355::scanz()
+{
     return read_reg_u20(ZDATA3);
 }
-uint16_t ADXL355::scant(){
+uint16_t ADXL355::scant()
+{
     return read_reg_u16(TEMP2);
 }
 /** ----------------------------------- */
 /** Activity SetUp - the measured       */
-/** acceleration on any axis is above   */ 
+/** acceleration on any axis is above   */
 /** the ACT_THRESH bits for ACT_COUNT   */
 /** consecutive measurements.           */
 /** ----------------------------------- */
 
-void ADXL355::set_activity_axis(ADXL355_act_ctl_t axis) {
+void ADXL355::set_activity_axis(ADXL355_act_ctl_t axis)
+{
     write_reg(ACT_EN, axis);
 }
-void ADXL355::set_activity_cnt(uint8_t count) {
+void ADXL355::set_activity_cnt(uint8_t count)
+{
     write_reg(ACT_COUNT, count);
 }
-void ADXL355::set_activity_threshold(uint8_t data_h, uint8_t data_l) {
+void ADXL355::set_activity_threshold(uint8_t data_h, uint8_t data_l)
+{
     uint16_t ret_val = static_cast<uint16_t>((data_h<<8)|data_l);
     write_reg_u16(ACT_THRESH_H, ret_val);
 }
-void ADXL355::set_inactivity() {
+void ADXL355::set_inactivity()
+{
     write_reg(ACT_EN, 0x00);
 }
 /** ----------------------------------- */
@@ -171,16 +198,19 @@
 /** ----------------------------------- */
 /** FIFO set up and read operation      */
 /** ----------------------------------- */
-uint8_t ADXL355::fifo_read_nr_of_entries(){
+uint8_t ADXL355::fifo_read_nr_of_entries()
+{
     return read_reg(FIFO_ENTRIES);
 }
-void ADXL355::fifo_setup(uint8_t nr_of_entries){
+void ADXL355::fifo_setup(uint8_t nr_of_entries)
+{
     if (nr_of_entries > 0x60) {
         nr_of_entries = nr_of_entries;
     }
     write_reg(FIFO_SAMPLES, nr_of_entries);
-}    
-uint32_t ADXL355::fifo_read_u32() {
+}
+uint32_t ADXL355::fifo_read_u32()
+{
     uint32_t ret_val = 0;
     adxl355.format(8, _SPI_MODE);
     cs = false;
@@ -190,8 +220,9 @@
     ret_val = (ret_val<<4) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)>>4);
     cs = true;
     return ret_val;
-    }
-uint64_t ADXL355::fifo_scan() {
+}
+uint64_t ADXL355::fifo_scan()
+{
     uint64_t ret_val = 0;
     uint32_t x = 0, y = 0, z = 0, dummy;
     adxl355.format(8, _SPI_MODE);
@@ -213,7 +244,7 @@
                 z = dummy;
                 break;
         }
-    } 
+    }
     cs = true;
     // format (24)xx(24)yy(24)zz
     ret_val = static_cast<uint64_t> (x) << 48;
@@ -223,14 +254,18 @@
 }
 /** ----------------------------------- */
 /** CALIBRATION AND CONVERSION          */
-/** ----------------------------------- */    
-float ADXL355::convert(uint32_t data){
+/** ----------------------------------- */
+float ADXL355::convert(uint32_t data)
+{
+    float result = 0;
+    
     // If a positive value, return it
-    if ((data & 0x80000) == 0)
-    {
-        return float(data);
+    if ((data & 0x80000) == 0) {
+        result= float(data);
+    } else {
+        // Otherwise perform the 2's complement math on the value
+        result = float((~(data - 0x01)) & 0xfffff) * -1;
     }
-    //uint32_t rawValue = data<<(32-nbit);
-    // Otherwise perform the 2's complement math on the value
-    return float((~(data - 0x01)) & 0xfffff) * -1;
+
+    return result;
 }
\ No newline at end of file