Fixed algorithm to read 3 bytes of accelerometer data registers
Fork of COG4050_adxl355_adxl357 by
ADXL35x/ADXL355.cpp@10:e054891b3598, 2018-09-10 (annotated)
- 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?
User | Revision | Line number | New 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 | } |