Fixed algorithm to read 3 bytes of accelerometer data registers

Fork of COG4050_adxl355_adxl357 by valeria toffoli

Committer:
nfathurr
Date:
Mon Sep 10 10:01:49 2018 +0000
Revision:
10:e054891b3598
Parent:
8:9e6ead2ee8d7
Fixed algorithm to read 3 bytes of accelerometer data registers

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vtoffoli 2:14dc1ec57f3b 1 #include <stdint.h>
vtoffoli 2:14dc1ec57f3b 2 #include "mbed.h"
vtoffoli 2:14dc1ec57f3b 3 #include "ADXL355.h"
vtoffoli 2:14dc1ec57f3b 4
vtoffoli 2:14dc1ec57f3b 5
vtoffoli 2:14dc1ec57f3b 6 //DigitalOut int1; ///< DigitalOut instance for the chipselect of the ADXL
vtoffoli 2:14dc1ec57f3b 7 //DigitalOut int2; ///< DigitalOut instance for the chipselect of the ADXL
vtoffoli 3:ee052fdb4331 8
vtoffoli 7:5aaa09c40283 9 /** ----------------------------------- */
vtoffoli 7:5aaa09c40283 10 /** SPI (MAX 10MHZ) and reset */
vtoffoli 7:5aaa09c40283 11 /** ----------------------------------- */
vtoffoli 3:ee052fdb4331 12 ADXL355::ADXL355(PinName cs_pin, PinName MOSI, PinName MISO, PinName SCK): adxl355(MOSI, MISO, SCK), cs(cs_pin)
vtoffoli 3:ee052fdb4331 13 {
vtoffoli 2:14dc1ec57f3b 14 cs = 1;
vtoffoli 2:14dc1ec57f3b 15 adxl355.format(8,_SPI_MODE);
vtoffoli 2:14dc1ec57f3b 16 adxl355.lock();
vtoffoli 6:45d2393ef468 17 axis355_sens = 3.9e-6;
vtoffoli 6:45d2393ef468 18 axis357_sens = 19.5e-6;
vtoffoli 2:14dc1ec57f3b 19 }
vtoffoli 3:ee052fdb4331 20 void ADXL355::frequency(int hz)
vtoffoli 3:ee052fdb4331 21 {
vtoffoli 2:14dc1ec57f3b 22 adxl355.frequency(hz);
vtoffoli 2:14dc1ec57f3b 23 }
vtoffoli 3:ee052fdb4331 24 void ADXL355::reset(void)
vtoffoli 3:ee052fdb4331 25 {
vtoffoli 2:14dc1ec57f3b 26 adxl355.format(8, _SPI_MODE);
vtoffoli 2:14dc1ec57f3b 27 cs = false;
vtoffoli 2:14dc1ec57f3b 28 // Writing Code 0x52 (representing the letter, R, in ASCII or unicode) to this register immediately resets the ADXL362.
vtoffoli 2:14dc1ec57f3b 29 write_reg(RESET, _RESET);
vtoffoli 2:14dc1ec57f3b 30 cs = true;
vtoffoli 6:45d2393ef468 31 axis355_sens = 3.9e-6;
vtoffoli 6:45d2393ef468 32 axis357_sens = 19.5e-6;
vtoffoli 2:14dc1ec57f3b 33 }
vtoffoli 3:ee052fdb4331 34 /** ----------------------------------- */
vtoffoli 3:ee052fdb4331 35 /** Writes the reg register with data */
vtoffoli 3:ee052fdb4331 36 /** ----------------------------------- */
vtoffoli 3:ee052fdb4331 37 void ADXL355::write_reg(ADXL355_register_t reg, uint8_t data)
vtoffoli 3:ee052fdb4331 38 {
vtoffoli 2:14dc1ec57f3b 39 adxl355.format(8, _SPI_MODE);
vtoffoli 2:14dc1ec57f3b 40 cs = false;
vtoffoli 3:ee052fdb4331 41 adxl355.write(static_cast<uint8_t>(reg<<1) | _WRITE_REG_CMD);
vtoffoli 2:14dc1ec57f3b 42 adxl355.write(data);
vtoffoli 2:14dc1ec57f3b 43 cs = true;
vtoffoli 2:14dc1ec57f3b 44 }
vtoffoli 3:ee052fdb4331 45 void ADXL355::write_reg_u16(ADXL355_register_t reg, uint16_t data)
vtoffoli 3:ee052fdb4331 46 {
vtoffoli 3:ee052fdb4331 47 adxl355.format(8, _SPI_MODE);
vtoffoli 3:ee052fdb4331 48 cs = false;
vtoffoli 3:ee052fdb4331 49 adxl355.write(static_cast<uint8_t>(reg<<1) | _WRITE_REG_CMD);
vtoffoli 3:ee052fdb4331 50 adxl355.write(static_cast<uint8_t>(data & 0xff));
vtoffoli 3:ee052fdb4331 51 adxl355.write(static_cast<uint8_t>((data & 0xff00) >> 8));
vtoffoli 3:ee052fdb4331 52 cs = true;
vtoffoli 3:ee052fdb4331 53 }
vtoffoli 3:ee052fdb4331 54 /** ----------------------------------- */
vtoffoli 2:14dc1ec57f3b 55 /** Reads the reg register */
vtoffoli 3:ee052fdb4331 56 /** ----------------------------------- */
vtoffoli 3:ee052fdb4331 57 uint8_t ADXL355::read_reg(ADXL355_register_t reg)
vtoffoli 3:ee052fdb4331 58 {
vtoffoli 2:14dc1ec57f3b 59 uint8_t ret_val;
vtoffoli 2:14dc1ec57f3b 60 adxl355.format(8, _SPI_MODE);
vtoffoli 2:14dc1ec57f3b 61 cs = false;
vtoffoli 3:ee052fdb4331 62 adxl355.write(static_cast<uint8_t>(reg<<1) | _READ_REG_CMD);
vtoffoli 2:14dc1ec57f3b 63 ret_val = adxl355.write(_DUMMY_BYTE);
vtoffoli 2:14dc1ec57f3b 64 cs = true;
vtoffoli 2:14dc1ec57f3b 65 return ret_val;
vtoffoli 2:14dc1ec57f3b 66 }
nfathurr 10:e054891b3598 67 uint16_t ADXL355::read_reg_u16(ADXL355_register_t reg)
nfathurr 10:e054891b3598 68 {
vtoffoli 3:ee052fdb4331 69 uint16_t ret_val = 0;
vtoffoli 3:ee052fdb4331 70 adxl355.format(8, _SPI_MODE);
vtoffoli 3:ee052fdb4331 71 cs = false;
vtoffoli 3:ee052fdb4331 72 adxl355.write(static_cast<uint8_t>(reg<<1) | _READ_REG_CMD);
vtoffoli 3:ee052fdb4331 73 ret_val = adxl355.write(_DUMMY_BYTE);
vtoffoli 3:ee052fdb4331 74 ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE);
vtoffoli 3:ee052fdb4331 75 cs = true;
vtoffoli 3:ee052fdb4331 76 return ret_val;
vtoffoli 3:ee052fdb4331 77 }
nfathurr 10:e054891b3598 78 uint32_t ADXL355::read_reg_u20(ADXL355_register_t reg)
nfathurr 10:e054891b3598 79 {
nfathurr 10:e054891b3598 80 uint32_t ret_val = 0, valueH= 0, valueM= 0, valueL= 0;
nfathurr 10:e054891b3598 81
vtoffoli 3:ee052fdb4331 82 adxl355.format(8, _SPI_MODE);
vtoffoli 3:ee052fdb4331 83 cs = false;
nfathurr 10:e054891b3598 84 adxl355.write((reg<<1) | _READ_REG_CMD); //dummy read
nfathurr 10:e054891b3598 85 /*
nfathurr 10:e054891b3598 86 //alternative method from ADICUP360 ADXL355 code
nfathurr 10:e054891b3598 87 valueH = adxl355.write(_DUMMY_BYTE);
nfathurr 10:e054891b3598 88 valueM = adxl355.write(_DUMMY_BYTE);
nfathurr 10:e054891b3598 89 valueL = adxl355.write(_DUMMY_BYTE);
nfathurr 10:e054891b3598 90
nfathurr 10:e054891b3598 91 ret_val = ((valueH << 16)| (valueM << 8)| valueL);
nfathurr 10:e054891b3598 92 ret_val = ret_val >> 4;
nfathurr 10:e054891b3598 93 */
nfathurr 10:e054891b3598 94 //Valeria's method version 2.0
nfathurr 10:e054891b3598 95 ret_val = adxl355.write(_DUMMY_BYTE);
vtoffoli 3:ee052fdb4331 96 ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE);
nfathurr 10:e054891b3598 97 ret_val = (ret_val<<4) | (adxl355.write(_DUMMY_BYTE) >> 4);
nfathurr 10:e054891b3598 98
vtoffoli 3:ee052fdb4331 99 cs = true;
vtoffoli 3:ee052fdb4331 100 return ret_val;
vtoffoli 3:ee052fdb4331 101 }
vtoffoli 3:ee052fdb4331 102 /** ----------------------------------- */
vtoffoli 3:ee052fdb4331 103 /** Sets the CTL registers */
vtoffoli 3:ee052fdb4331 104 /** ----------------------------------- */
nfathurr 10:e054891b3598 105 void ADXL355::set_power_ctl_reg(uint8_t data)
nfathurr 10:e054891b3598 106 {
nfathurr 10:e054891b3598 107 write_reg(POWER_CTL, data);
vtoffoli 3:ee052fdb4331 108 }
nfathurr 10:e054891b3598 109 void ADXL355::set_filter_ctl_reg(ADXL355_filter_ctl_t hpf, ADXL355_filter_ctl_t odr)
nfathurr 10:e054891b3598 110 {
vtoffoli 3:ee052fdb4331 111 write_reg(FILTER, static_cast<uint8_t>(hpf|odr));
vtoffoli 3:ee052fdb4331 112 }
nfathurr 10:e054891b3598 113 void ADXL355::set_clk(ADXL355_sync_ctl_t data)
nfathurr 10:e054891b3598 114 {
vtoffoli 3:ee052fdb4331 115 write_reg(SYNC, static_cast<uint8_t>(data));
vtoffoli 3:ee052fdb4331 116 }
nfathurr 10:e054891b3598 117 void ADXL355::set_device(ADXL355_range_ctl_t range)
nfathurr 10:e054891b3598 118 {
vtoffoli 3:ee052fdb4331 119 write_reg(RANGE, static_cast<uint8_t>(range));
nfathurr 10:e054891b3598 120 switch(range) {
vtoffoli 6:45d2393ef468 121 case 0x01:
vtoffoli 6:45d2393ef468 122 axis355_sens = 3.9e-6;
nfathurr 10:e054891b3598 123 axis357_sens = 19.5e-6; //scale factor g per LSB
vtoffoli 6:45d2393ef468 124 break;
vtoffoli 6:45d2393ef468 125 case 0x02:
vtoffoli 6:45d2393ef468 126 axis355_sens = 7.8e-6;
nfathurr 10:e054891b3598 127 axis357_sens = 39e-6; //scale factor g per LSB
vtoffoli 6:45d2393ef468 128 break;
vtoffoli 6:45d2393ef468 129 case 0x03:
vtoffoli 6:45d2393ef468 130 axis355_sens = 15.6e-6;
nfathurr 10:e054891b3598 131 axis357_sens = 78e-6; //scale factor g per LSB
vtoffoli 6:45d2393ef468 132 break;
nfathurr 10:e054891b3598 133 }
vtoffoli 3:ee052fdb4331 134 }
vtoffoli 3:ee052fdb4331 135 /** ----------------------------------- */
vtoffoli 3:ee052fdb4331 136 /** Read the STATUS registers */
vtoffoli 3:ee052fdb4331 137 /** ----------------------------------- */
nfathurr 10:e054891b3598 138 uint8_t ADXL355::read_status()
nfathurr 10:e054891b3598 139 {
vtoffoli 3:ee052fdb4331 140 return read_reg(STATUS);
vtoffoli 3:ee052fdb4331 141 }
vtoffoli 3:ee052fdb4331 142 /** ----------------------------------- */
vtoffoli 3:ee052fdb4331 143 /** ADXL must be set in measurement */
vtoffoli 3:ee052fdb4331 144 /** mode to read the data registers */
vtoffoli 3:ee052fdb4331 145 /** ----------------------------------- */
nfathurr 10:e054891b3598 146 uint32_t ADXL355::scanx()
nfathurr 10:e054891b3598 147 {
vtoffoli 6:45d2393ef468 148 return read_reg_u20(XDATA3);
vtoffoli 3:ee052fdb4331 149 }
nfathurr 10:e054891b3598 150 uint32_t ADXL355::scany()
nfathurr 10:e054891b3598 151 {
vtoffoli 6:45d2393ef468 152 return read_reg_u20(YDATA3);
vtoffoli 3:ee052fdb4331 153 }
nfathurr 10:e054891b3598 154 uint32_t ADXL355::scanz()
nfathurr 10:e054891b3598 155 {
vtoffoli 6:45d2393ef468 156 return read_reg_u20(ZDATA3);
vtoffoli 3:ee052fdb4331 157 }
nfathurr 10:e054891b3598 158 uint16_t ADXL355::scant()
nfathurr 10:e054891b3598 159 {
vtoffoli 3:ee052fdb4331 160 return read_reg_u16(TEMP2);
vtoffoli 3:ee052fdb4331 161 }
vtoffoli 3:ee052fdb4331 162 /** ----------------------------------- */
vtoffoli 6:45d2393ef468 163 /** Activity SetUp - the measured */
nfathurr 10:e054891b3598 164 /** acceleration on any axis is above */
vtoffoli 6:45d2393ef468 165 /** the ACT_THRESH bits for ACT_COUNT */
vtoffoli 6:45d2393ef468 166 /** consecutive measurements. */
vtoffoli 3:ee052fdb4331 167 /** ----------------------------------- */
vtoffoli 6:45d2393ef468 168
nfathurr 10:e054891b3598 169 void ADXL355::set_activity_axis(ADXL355_act_ctl_t axis)
nfathurr 10:e054891b3598 170 {
vtoffoli 6:45d2393ef468 171 write_reg(ACT_EN, axis);
vtoffoli 6:45d2393ef468 172 }
nfathurr 10:e054891b3598 173 void ADXL355::set_activity_cnt(uint8_t count)
nfathurr 10:e054891b3598 174 {
vtoffoli 6:45d2393ef468 175 write_reg(ACT_COUNT, count);
vtoffoli 6:45d2393ef468 176 }
nfathurr 10:e054891b3598 177 void ADXL355::set_activity_threshold(uint8_t data_h, uint8_t data_l)
nfathurr 10:e054891b3598 178 {
vtoffoli 3:ee052fdb4331 179 uint16_t ret_val = static_cast<uint16_t>((data_h<<8)|data_l);
vtoffoli 3:ee052fdb4331 180 write_reg_u16(ACT_THRESH_H, ret_val);
vtoffoli 3:ee052fdb4331 181 }
nfathurr 10:e054891b3598 182 void ADXL355::set_inactivity()
nfathurr 10:e054891b3598 183 {
vtoffoli 6:45d2393ef468 184 write_reg(ACT_EN, 0x00);
vtoffoli 6:45d2393ef468 185 }
vtoffoli 3:ee052fdb4331 186 /** ----------------------------------- */
vtoffoli 3:ee052fdb4331 187 /** ----------------------------------- */
vtoffoli 3:ee052fdb4331 188 void ADXL355::set_interrupt1_pin(PinName in, ADXL355_intmap_ctl_t mode) {}
vtoffoli 3:ee052fdb4331 189 void ADXL355::set_interrupt2_pin(PinName in, ADXL355_intmap_ctl_t mode) {}
vtoffoli 3:ee052fdb4331 190 void ADXL355::enable_interrupt1() {}
vtoffoli 3:ee052fdb4331 191 void ADXL355::enable_interrupt2() {}
vtoffoli 3:ee052fdb4331 192 void ADXL355::disable_interrupt1() {}
vtoffoli 3:ee052fdb4331 193 void ADXL355::disable_interrupt2() {}
vtoffoli 3:ee052fdb4331 194 void ADXL355::set_polling_interrupt1_pin(uint8_t data) {}
vtoffoli 3:ee052fdb4331 195 void ADXL355::set_polling_interrupt2_pin(uint8_t data) {}
vtoffoli 3:ee052fdb4331 196 bool get_int1() {}
vtoffoli 3:ee052fdb4331 197 bool get_int2() {}
vtoffoli 3:ee052fdb4331 198 /** ----------------------------------- */
vtoffoli 3:ee052fdb4331 199 /** FIFO set up and read operation */
vtoffoli 3:ee052fdb4331 200 /** ----------------------------------- */
nfathurr 10:e054891b3598 201 uint8_t ADXL355::fifo_read_nr_of_entries()
nfathurr 10:e054891b3598 202 {
vtoffoli 3:ee052fdb4331 203 return read_reg(FIFO_ENTRIES);
vtoffoli 3:ee052fdb4331 204 }
nfathurr 10:e054891b3598 205 void ADXL355::fifo_setup(uint8_t nr_of_entries)
nfathurr 10:e054891b3598 206 {
vtoffoli 3:ee052fdb4331 207 if (nr_of_entries > 0x60) {
vtoffoli 3:ee052fdb4331 208 nr_of_entries = nr_of_entries;
vtoffoli 3:ee052fdb4331 209 }
vtoffoli 3:ee052fdb4331 210 write_reg(FIFO_SAMPLES, nr_of_entries);
nfathurr 10:e054891b3598 211 }
nfathurr 10:e054891b3598 212 uint32_t ADXL355::fifo_read_u32()
nfathurr 10:e054891b3598 213 {
vtoffoli 3:ee052fdb4331 214 uint32_t ret_val = 0;
vtoffoli 3:ee052fdb4331 215 adxl355.format(8, _SPI_MODE);
vtoffoli 3:ee052fdb4331 216 cs = false;
vtoffoli 3:ee052fdb4331 217 adxl355.write(_READ_FIFO_CMD);
vtoffoli 3:ee052fdb4331 218 ret_val = adxl355.write(_DUMMY_BYTE);
vtoffoli 3:ee052fdb4331 219 ret_val = (ret_val<<8) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE));
vtoffoli 3:ee052fdb4331 220 ret_val = (ret_val<<4) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)>>4);
vtoffoli 3:ee052fdb4331 221 cs = true;
vtoffoli 3:ee052fdb4331 222 return ret_val;
nfathurr 10:e054891b3598 223 }
nfathurr 10:e054891b3598 224 uint64_t ADXL355::fifo_scan()
nfathurr 10:e054891b3598 225 {
vtoffoli 3:ee052fdb4331 226 uint64_t ret_val = 0;
vtoffoli 3:ee052fdb4331 227 uint32_t x = 0, y = 0, z = 0, dummy;
vtoffoli 3:ee052fdb4331 228 adxl355.format(8, _SPI_MODE);
vtoffoli 3:ee052fdb4331 229 cs = false;
vtoffoli 3:ee052fdb4331 230 adxl355.write(_READ_FIFO_CMD);
vtoffoli 3:ee052fdb4331 231 for(uint8_t i = 0; i < 3; i++) {
vtoffoli 3:ee052fdb4331 232 dummy = adxl355.write(_DUMMY_BYTE);
vtoffoli 3:ee052fdb4331 233 dummy = (dummy<<8) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE));
vtoffoli 3:ee052fdb4331 234 dummy = (dummy<<4) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)>>4);
vtoffoli 3:ee052fdb4331 235 dummy = dummy & 0xffff;
vtoffoli 3:ee052fdb4331 236 switch(i) {
vtoffoli 3:ee052fdb4331 237 case 0: // x
vtoffoli 3:ee052fdb4331 238 x = dummy;
vtoffoli 3:ee052fdb4331 239 break;
vtoffoli 3:ee052fdb4331 240 case 1: // y
vtoffoli 3:ee052fdb4331 241 y = dummy;
vtoffoli 3:ee052fdb4331 242 break;
vtoffoli 3:ee052fdb4331 243 case 2: // z
vtoffoli 3:ee052fdb4331 244 z = dummy;
vtoffoli 3:ee052fdb4331 245 break;
vtoffoli 3:ee052fdb4331 246 }
nfathurr 10:e054891b3598 247 }
vtoffoli 3:ee052fdb4331 248 cs = true;
vtoffoli 3:ee052fdb4331 249 // format (24)xx(24)yy(24)zz
vtoffoli 3:ee052fdb4331 250 ret_val = static_cast<uint64_t> (x) << 48;
vtoffoli 3:ee052fdb4331 251 ret_val |= static_cast<uint64_t>(y) << 24;
vtoffoli 3:ee052fdb4331 252 ret_val |= static_cast<uint64_t>(z) ;
vtoffoli 3:ee052fdb4331 253 return ret_val;
vtoffoli 8:9e6ead2ee8d7 254 }
vtoffoli 7:5aaa09c40283 255 /** ----------------------------------- */
vtoffoli 7:5aaa09c40283 256 /** CALIBRATION AND CONVERSION */
nfathurr 10:e054891b3598 257 /** ----------------------------------- */
nfathurr 10:e054891b3598 258 float ADXL355::convert(uint32_t data)
nfathurr 10:e054891b3598 259 {
nfathurr 10:e054891b3598 260 float result = 0;
nfathurr 10:e054891b3598 261
vtoffoli 7:5aaa09c40283 262 // If a positive value, return it
nfathurr 10:e054891b3598 263 if ((data & 0x80000) == 0) {
nfathurr 10:e054891b3598 264 result= float(data);
nfathurr 10:e054891b3598 265 } else {
nfathurr 10:e054891b3598 266 // Otherwise perform the 2's complement math on the value
nfathurr 10:e054891b3598 267 result = float((~(data - 0x01)) & 0xfffff) * -1;
vtoffoli 7:5aaa09c40283 268 }
nfathurr 10:e054891b3598 269
nfathurr 10:e054891b3598 270 return result;
vtoffoli 8:9e6ead2ee8d7 271 }