Fixed algorithm to read 3 bytes of accelerometer data registers
Fork of COG4050_adxl355_adxl357 by
Diff: ADXL35x/ADXL355.cpp
- 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