Analog Devices 3-axis accelerometer. I2C interface

Committer:
kenjiArai
Date:
Sat Sep 23 22:21:33 2017 +0000
Revision:
0:21a3f84ad1c9
1st rev. I2C interface. Analog Devices 3-axis accelerometer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:21a3f84ad1c9 1 /*
kenjiArai 0:21a3f84ad1c9 2 * mbed library program
kenjiArai 0:21a3f84ad1c9 3 * ADXL345: 3-axis accelerometer, made by Analog Devices
kenjiArai 0:21a3f84ad1c9 4 * http://www.analog.com/static/imported-files/data_sheets/ADXL345.pdf
kenjiArai 0:21a3f84ad1c9 5 *
kenjiArai 0:21a3f84ad1c9 6 * Copyright (c) 2017 Kenji Arai / JH1PJL
kenjiArai 0:21a3f84ad1c9 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:21a3f84ad1c9 8 * http://mbed.org/users/kenjiArai/
kenjiArai 0:21a3f84ad1c9 9 * Modify: August 13th, 2017
kenjiArai 0:21a3f84ad1c9 10 * Revised: September 23rd, 2017
kenjiArai 0:21a3f84ad1c9 11 *
kenjiArai 0:21a3f84ad1c9 12 */
kenjiArai 0:21a3f84ad1c9 13
kenjiArai 0:21a3f84ad1c9 14 #include "ADXL345.h"
kenjiArai 0:21a3f84ad1c9 15
kenjiArai 0:21a3f84ad1c9 16 // definition for Nomalization
kenjiArai 0:21a3f84ad1c9 17 #define ADXL345_SENSITIVITY_2G 4.0f
kenjiArai 0:21a3f84ad1c9 18 #define ADXL345_SENSITIVITY_4G 8.0f
kenjiArai 0:21a3f84ad1c9 19 #define ADXL345_SENSITIVITY_8G 16.0f
kenjiArai 0:21a3f84ad1c9 20 #define ADXL345_SENSITIVITY_16G 32.0f
kenjiArai 0:21a3f84ad1c9 21 #define ADXL345_SEN_FULL_RES 4.0f
kenjiArai 0:21a3f84ad1c9 22
kenjiArai 0:21a3f84ad1c9 23 //Gravity at Earth's surface in m/s/s
kenjiArai 0:21a3f84ad1c9 24 #define GRAVITY (9.80665f / 1000)
kenjiArai 0:21a3f84ad1c9 25
kenjiArai 0:21a3f84ad1c9 26 #if MBED_MAJOR_VERSION == 2
kenjiArai 0:21a3f84ad1c9 27 #define WAIT_MS(x) wait_ms(x)
kenjiArai 0:21a3f84ad1c9 28 #elif MBED_MAJOR_VERSION == 5
kenjiArai 0:21a3f84ad1c9 29 #define WAIT_MS(x) Thread::wait(x)
kenjiArai 0:21a3f84ad1c9 30 #else
kenjiArai 0:21a3f84ad1c9 31 #error "Running on Unknown OS"
kenjiArai 0:21a3f84ad1c9 32 #endif
kenjiArai 0:21a3f84ad1c9 33
kenjiArai 0:21a3f84ad1c9 34 ADXL345::ADXL345 (PinName p_sda, PinName p_scl,
kenjiArai 0:21a3f84ad1c9 35 uint8_t addr, uint8_t data_rate, uint8_t fullscale) :
kenjiArai 0:21a3f84ad1c9 36 _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:21a3f84ad1c9 37 {
kenjiArai 0:21a3f84ad1c9 38 _i2c.frequency(400000);
kenjiArai 0:21a3f84ad1c9 39 initialize (addr, data_rate, fullscale);
kenjiArai 0:21a3f84ad1c9 40 }
kenjiArai 0:21a3f84ad1c9 41
kenjiArai 0:21a3f84ad1c9 42 ADXL345::ADXL345 (PinName p_sda, PinName p_scl, uint8_t addr) :
kenjiArai 0:21a3f84ad1c9 43 _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:21a3f84ad1c9 44 {
kenjiArai 0:21a3f84ad1c9 45 _i2c.frequency(400000);
kenjiArai 0:21a3f84ad1c9 46 initialize (addr, ADXL345_DR_200HZ, ADXL345_FULL_RES_16G);
kenjiArai 0:21a3f84ad1c9 47 }
kenjiArai 0:21a3f84ad1c9 48
kenjiArai 0:21a3f84ad1c9 49 ADXL345::ADXL345 (PinName p_sda, PinName p_scl) :
kenjiArai 0:21a3f84ad1c9 50 _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:21a3f84ad1c9 51 {
kenjiArai 0:21a3f84ad1c9 52 _i2c.frequency(400000);
kenjiArai 0:21a3f84ad1c9 53 initialize(ADXL345_V_CHIP_ADDR, ADXL345_DR_200HZ, ADXL345_FULL_RES_16G);
kenjiArai 0:21a3f84ad1c9 54 if (acc_ready == false){
kenjiArai 0:21a3f84ad1c9 55 initialize(ADXL345_G_CHIP_ADDR, ADXL345_DR_200HZ, ADXL345_FULL_RES_16G);
kenjiArai 0:21a3f84ad1c9 56 }
kenjiArai 0:21a3f84ad1c9 57 }
kenjiArai 0:21a3f84ad1c9 58
kenjiArai 0:21a3f84ad1c9 59 ADXL345::ADXL345 (I2C& p_i2c,
kenjiArai 0:21a3f84ad1c9 60 uint8_t addr, uint8_t data_rate, uint8_t fullscale) : _i2c(p_i2c)
kenjiArai 0:21a3f84ad1c9 61 {
kenjiArai 0:21a3f84ad1c9 62 _i2c.frequency(400000);
kenjiArai 0:21a3f84ad1c9 63 initialize (addr, data_rate, fullscale);
kenjiArai 0:21a3f84ad1c9 64 }
kenjiArai 0:21a3f84ad1c9 65
kenjiArai 0:21a3f84ad1c9 66 ADXL345::ADXL345 (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c)
kenjiArai 0:21a3f84ad1c9 67 {
kenjiArai 0:21a3f84ad1c9 68 _i2c.frequency(400000);
kenjiArai 0:21a3f84ad1c9 69 initialize (addr, ADXL345_DR_200HZ, ADXL345_FULL_RES_16G);
kenjiArai 0:21a3f84ad1c9 70 }
kenjiArai 0:21a3f84ad1c9 71
kenjiArai 0:21a3f84ad1c9 72 ADXL345::ADXL345 (I2C& p_i2c) : _i2c(p_i2c)
kenjiArai 0:21a3f84ad1c9 73 {
kenjiArai 0:21a3f84ad1c9 74 _i2c.frequency(400000);
kenjiArai 0:21a3f84ad1c9 75 initialize(ADXL345_V_CHIP_ADDR, ADXL345_DR_200HZ, ADXL345_FULL_RES_16G);
kenjiArai 0:21a3f84ad1c9 76 if (acc_ready == false){
kenjiArai 0:21a3f84ad1c9 77 initialize(ADXL345_G_CHIP_ADDR, ADXL345_DR_200HZ, ADXL345_FULL_RES_16G);
kenjiArai 0:21a3f84ad1c9 78 }
kenjiArai 0:21a3f84ad1c9 79 }
kenjiArai 0:21a3f84ad1c9 80
kenjiArai 0:21a3f84ad1c9 81 void ADXL345::initialize (uint8_t addr, uint8_t data_rate, uint8_t fullscale)
kenjiArai 0:21a3f84ad1c9 82 {
kenjiArai 0:21a3f84ad1c9 83 // Check acc is available or not
kenjiArai 0:21a3f84ad1c9 84 acc_addr = addr;
kenjiArai 0:21a3f84ad1c9 85 dt[0] = ADXL345_DEVID;
kenjiArai 0:21a3f84ad1c9 86 _i2c.write(acc_addr, dt, 1, true);
kenjiArai 0:21a3f84ad1c9 87 _i2c.read(acc_addr, dt, 1, false);
kenjiArai 0:21a3f84ad1c9 88 if (dt[0] == ADXL345_DEVICE_ID){
kenjiArai 0:21a3f84ad1c9 89 acc_ready = true;
kenjiArai 0:21a3f84ad1c9 90 } else {
kenjiArai 0:21a3f84ad1c9 91 acc_ready = false;
kenjiArai 0:21a3f84ad1c9 92 return; // acc chip is NOT on I2C line then terminate
kenjiArai 0:21a3f84ad1c9 93 }
kenjiArai 0:21a3f84ad1c9 94 // BW Rate
kenjiArai 0:21a3f84ad1c9 95 dt[0] = ADXL345_BW_RATE;
kenjiArai 0:21a3f84ad1c9 96 dt[1] = data_rate | ADXL345_NOT_LOW_PWR; // normal(not low power mode)
kenjiArai 0:21a3f84ad1c9 97 setting_data[0] = dt[1];
kenjiArai 0:21a3f84ad1c9 98 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 99 // Data format (measurement range)
kenjiArai 0:21a3f84ad1c9 100 dt[0] = ADXL345_DATA_FORMAT;
kenjiArai 0:21a3f84ad1c9 101 dt[1] = fullscale;
kenjiArai 0:21a3f84ad1c9 102 setting_data[1] = dt[1];
kenjiArai 0:21a3f84ad1c9 103 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 104 switch (fullscale){
kenjiArai 0:21a3f84ad1c9 105 case ADXL345_FS_2G:
kenjiArai 0:21a3f84ad1c9 106 fs_factor = ADXL345_SENSITIVITY_2G;
kenjiArai 0:21a3f84ad1c9 107 break;
kenjiArai 0:21a3f84ad1c9 108 case ADXL345_FS_4G:
kenjiArai 0:21a3f84ad1c9 109 fs_factor = ADXL345_SENSITIVITY_4G;
kenjiArai 0:21a3f84ad1c9 110 break;
kenjiArai 0:21a3f84ad1c9 111 case ADXL345_FS_8G:
kenjiArai 0:21a3f84ad1c9 112 fs_factor = ADXL345_SENSITIVITY_8G;
kenjiArai 0:21a3f84ad1c9 113 break;
kenjiArai 0:21a3f84ad1c9 114 case ADXL345_FS_16G:
kenjiArai 0:21a3f84ad1c9 115 fs_factor = ADXL345_SENSITIVITY_16G;
kenjiArai 0:21a3f84ad1c9 116 break;
kenjiArai 0:21a3f84ad1c9 117 case ADXL345_FULL_RES_16G:
kenjiArai 0:21a3f84ad1c9 118 fs_factor = ADXL345_SEN_FULL_RES;
kenjiArai 0:21a3f84ad1c9 119 break;
kenjiArai 0:21a3f84ad1c9 120 default:
kenjiArai 0:21a3f84ad1c9 121 fs_factor = 1.0f;
kenjiArai 0:21a3f84ad1c9 122 break;
kenjiArai 0:21a3f84ad1c9 123 }
kenjiArai 0:21a3f84ad1c9 124 // Data ready flag
kenjiArai 0:21a3f84ad1c9 125 dt[0] = ADXL345_INT_ENABLE;
kenjiArai 0:21a3f84ad1c9 126 dt[1] = 0x80;
kenjiArai 0:21a3f84ad1c9 127 setting_data[2] = dt[1];
kenjiArai 0:21a3f84ad1c9 128 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 129 // Start measurement mode
kenjiArai 0:21a3f84ad1c9 130 dt[0] = ADXL345_POWER_CTL;
kenjiArai 0:21a3f84ad1c9 131 dt[1] = 0x08;
kenjiArai 0:21a3f84ad1c9 132 setting_data[3] = dt[1];
kenjiArai 0:21a3f84ad1c9 133 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 134 // offset compensation
kenjiArai 0:21a3f84ad1c9 135 dt[0] = ADXL345_OFSX;
kenjiArai 0:21a3f84ad1c9 136 dt[1] = 0x01;
kenjiArai 0:21a3f84ad1c9 137 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 138 dt[0] = ADXL345_OFSY;
kenjiArai 0:21a3f84ad1c9 139 dt[1] = 0x00;
kenjiArai 0:21a3f84ad1c9 140 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 141 dt[0] = ADXL345_OFSZ;
kenjiArai 0:21a3f84ad1c9 142 dt[1] = 0x00;
kenjiArai 0:21a3f84ad1c9 143 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 144 }
kenjiArai 0:21a3f84ad1c9 145
kenjiArai 0:21a3f84ad1c9 146 void ADXL345::read_reg_data(char *data)
kenjiArai 0:21a3f84ad1c9 147 {
kenjiArai 0:21a3f84ad1c9 148 // read all of X,Y & Z
kenjiArai 0:21a3f84ad1c9 149 dt[0] = ADXL345_DATAX0;
kenjiArai 0:21a3f84ad1c9 150 _i2c.write(acc_addr, dt, 1, true);
kenjiArai 0:21a3f84ad1c9 151 _i2c.read(acc_addr, data, 6, false);
kenjiArai 0:21a3f84ad1c9 152 }
kenjiArai 0:21a3f84ad1c9 153
kenjiArai 0:21a3f84ad1c9 154 void ADXL345::read_mg_data(float *dt_usr)
kenjiArai 0:21a3f84ad1c9 155 {
kenjiArai 0:21a3f84ad1c9 156 return read_mg_g_data(dt_usr, 0);
kenjiArai 0:21a3f84ad1c9 157 }
kenjiArai 0:21a3f84ad1c9 158
kenjiArai 0:21a3f84ad1c9 159 void ADXL345::read_g_data(float *dt_usr)
kenjiArai 0:21a3f84ad1c9 160 {
kenjiArai 0:21a3f84ad1c9 161 return read_mg_g_data(dt_usr, 1);
kenjiArai 0:21a3f84ad1c9 162 }
kenjiArai 0:21a3f84ad1c9 163
kenjiArai 0:21a3f84ad1c9 164 void ADXL345::read_data(float *dt_usr)
kenjiArai 0:21a3f84ad1c9 165 {
kenjiArai 0:21a3f84ad1c9 166 return read_mg_g_data(dt_usr, 2);
kenjiArai 0:21a3f84ad1c9 167 }
kenjiArai 0:21a3f84ad1c9 168
kenjiArai 0:21a3f84ad1c9 169 void ADXL345::read_mg_g_data(float *dt_usr, uint8_t n)
kenjiArai 0:21a3f84ad1c9 170 {
kenjiArai 0:21a3f84ad1c9 171 char data[6];
kenjiArai 0:21a3f84ad1c9 172 float fct;
kenjiArai 0:21a3f84ad1c9 173
kenjiArai 0:21a3f84ad1c9 174 if (acc_ready == false){
kenjiArai 0:21a3f84ad1c9 175 dt_usr[0] = 0;
kenjiArai 0:21a3f84ad1c9 176 dt_usr[1] = 0;
kenjiArai 0:21a3f84ad1c9 177 dt_usr[2] = 0;
kenjiArai 0:21a3f84ad1c9 178 return;
kenjiArai 0:21a3f84ad1c9 179 }
kenjiArai 0:21a3f84ad1c9 180 read_reg_data(data);
kenjiArai 0:21a3f84ad1c9 181 if (n == 0){
kenjiArai 0:21a3f84ad1c9 182 fct = fs_factor;
kenjiArai 0:21a3f84ad1c9 183 } else if (n == 1){
kenjiArai 0:21a3f84ad1c9 184 fct = fs_factor / 1000.0f;
kenjiArai 0:21a3f84ad1c9 185 } else {
kenjiArai 0:21a3f84ad1c9 186 fct = fs_factor * GRAVITY;
kenjiArai 0:21a3f84ad1c9 187 }
kenjiArai 0:21a3f84ad1c9 188 // change data type
kenjiArai 0:21a3f84ad1c9 189 dt_usr[0] = float(int16_t((data[1] << 8) | data[0])) * fct;
kenjiArai 0:21a3f84ad1c9 190 dt_usr[1] = float(int16_t((data[3] << 8) | data[2])) * fct;
kenjiArai 0:21a3f84ad1c9 191 dt_usr[2] = float(int16_t((data[5] << 8) | data[4])) * fct;
kenjiArai 0:21a3f84ad1c9 192 }
kenjiArai 0:21a3f84ad1c9 193
kenjiArai 0:21a3f84ad1c9 194 uint8_t ADXL345::read_id()
kenjiArai 0:21a3f84ad1c9 195 {
kenjiArai 0:21a3f84ad1c9 196 dt[0] = ADXL345_DEVID;
kenjiArai 0:21a3f84ad1c9 197 _i2c.write(acc_addr, dt, 1, true);
kenjiArai 0:21a3f84ad1c9 198 _i2c.read(acc_addr, dt, 1, false);
kenjiArai 0:21a3f84ad1c9 199 return (uint8_t)dt[0];
kenjiArai 0:21a3f84ad1c9 200 }
kenjiArai 0:21a3f84ad1c9 201
kenjiArai 0:21a3f84ad1c9 202 bool ADXL345::data_ready()
kenjiArai 0:21a3f84ad1c9 203 {
kenjiArai 0:21a3f84ad1c9 204 if (acc_ready == true){
kenjiArai 0:21a3f84ad1c9 205 dt[0] = ADXL345_INT_SOURCE;
kenjiArai 0:21a3f84ad1c9 206 _i2c.write(acc_addr, dt, 1, true);
kenjiArai 0:21a3f84ad1c9 207 _i2c.read(acc_addr, dt, 1, false);
kenjiArai 0:21a3f84ad1c9 208 if (dt[0] & 0x80){ // Check ready bit
kenjiArai 0:21a3f84ad1c9 209 return true;
kenjiArai 0:21a3f84ad1c9 210 } else {
kenjiArai 0:21a3f84ad1c9 211 return false;
kenjiArai 0:21a3f84ad1c9 212 }
kenjiArai 0:21a3f84ad1c9 213 }
kenjiArai 0:21a3f84ad1c9 214 return false;
kenjiArai 0:21a3f84ad1c9 215 }
kenjiArai 0:21a3f84ad1c9 216
kenjiArai 0:21a3f84ad1c9 217 void ADXL345::frequency(int hz)
kenjiArai 0:21a3f84ad1c9 218 {
kenjiArai 0:21a3f84ad1c9 219 _i2c.frequency(hz);
kenjiArai 0:21a3f84ad1c9 220 }
kenjiArai 0:21a3f84ad1c9 221
kenjiArai 0:21a3f84ad1c9 222 uint8_t ADXL345::read_reg(uint8_t addr)
kenjiArai 0:21a3f84ad1c9 223 {
kenjiArai 0:21a3f84ad1c9 224 if (acc_ready == true){
kenjiArai 0:21a3f84ad1c9 225 dt[0] = addr;
kenjiArai 0:21a3f84ad1c9 226 _i2c.write(acc_addr, dt, 1, true);
kenjiArai 0:21a3f84ad1c9 227 _i2c.read(acc_addr, dt, 1, false);
kenjiArai 0:21a3f84ad1c9 228 } else {
kenjiArai 0:21a3f84ad1c9 229 dt[0] = 0xff;
kenjiArai 0:21a3f84ad1c9 230 }
kenjiArai 0:21a3f84ad1c9 231 return (uint8_t)dt[0];
kenjiArai 0:21a3f84ad1c9 232 }
kenjiArai 0:21a3f84ad1c9 233
kenjiArai 0:21a3f84ad1c9 234 void ADXL345::write_reg(uint8_t addr, uint8_t data)
kenjiArai 0:21a3f84ad1c9 235 {
kenjiArai 0:21a3f84ad1c9 236 if (acc_ready == true){
kenjiArai 0:21a3f84ad1c9 237 dt[0] = addr;
kenjiArai 0:21a3f84ad1c9 238 dt[1] = data;
kenjiArai 0:21a3f84ad1c9 239 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 240 }
kenjiArai 0:21a3f84ad1c9 241 }
kenjiArai 0:21a3f84ad1c9 242
kenjiArai 0:21a3f84ad1c9 243 void ADXL345::debug_print(void)
kenjiArai 0:21a3f84ad1c9 244 {
kenjiArai 0:21a3f84ad1c9 245 printf("ADXL345 3-axes accelerometer\r\n");
kenjiArai 0:21a3f84ad1c9 246 printf(" DEVID=0x%02x\r\n", read_reg(ADXL345_DEVID));
kenjiArai 0:21a3f84ad1c9 247 printf(" THRESH_TAP=0x%02x\r\n", read_reg(ADXL345_THRESH_TAP));
kenjiArai 0:21a3f84ad1c9 248 printf(" OFSX=0x%02x,", read_reg(ADXL345_OFSX));
kenjiArai 0:21a3f84ad1c9 249 printf(" OFSY=0x%02x,", read_reg(ADXL345_OFSY));
kenjiArai 0:21a3f84ad1c9 250 printf(" OFSZ=0x%02x\r\n", read_reg(ADXL345_OFSZ));
kenjiArai 0:21a3f84ad1c9 251 printf(" DUR=0x%02x,", read_reg(ADXL345_DUR));
kenjiArai 0:21a3f84ad1c9 252 printf(" LATENT=0x%02x,", read_reg(ADXL345_LATENT));
kenjiArai 0:21a3f84ad1c9 253 printf(" WINDOW=0x%02x\r\n", read_reg(ADXL345_WINDOW));
kenjiArai 0:21a3f84ad1c9 254 printf(" THRESH_ACT=0x%02x,", read_reg(ADXL345_THRESH_ACT));
kenjiArai 0:21a3f84ad1c9 255 printf(" THRESH_INACT=0x%02x\r\n", read_reg(ADXL345_THRESH_INACT));
kenjiArai 0:21a3f84ad1c9 256 printf(" TIME_INACT=0x%02x,", read_reg(ADXL345_TIME_INACT));
kenjiArai 0:21a3f84ad1c9 257 printf(" ACT_INACT_CTL=0x%02x\r\n",
kenjiArai 0:21a3f84ad1c9 258 read_reg(ADXL345_ACT_INACT_CTL));
kenjiArai 0:21a3f84ad1c9 259 printf(" THRESH_FF=0x%02x,", read_reg(ADXL345_THRESH_FF));
kenjiArai 0:21a3f84ad1c9 260 printf(" TIME_FF=0x%02x,", read_reg(ADXL345_TIME_FF));
kenjiArai 0:21a3f84ad1c9 261 printf(" TAP_AXES=0x%02x,", read_reg(ADXL345_TAP_AXES));
kenjiArai 0:21a3f84ad1c9 262 printf(" ACT_TAP_STATUS=0x%02x\r\n",
kenjiArai 0:21a3f84ad1c9 263 read_reg(ADXL345_ACT_TAP_STATUS));
kenjiArai 0:21a3f84ad1c9 264 printf(" BW_RATE=0x%02x\r\n", read_reg(ADXL345_BW_RATE));
kenjiArai 0:21a3f84ad1c9 265 printf(" POWER_CTL=0x%02x\r\n", read_reg(ADXL345_POWER_CTL));
kenjiArai 0:21a3f84ad1c9 266 printf(" INT_ENABLE=0x%02x,", read_reg(ADXL345_INT_ENABLE));
kenjiArai 0:21a3f84ad1c9 267 printf(" INT_MAP=0x%02x,", read_reg(ADXL345_INT_MAP));
kenjiArai 0:21a3f84ad1c9 268 printf(" INT_SOURCE=0x%02x\r\n", read_reg(ADXL345_INT_SOURCE));
kenjiArai 0:21a3f84ad1c9 269 printf(" DATA_FORMAT=0x%02x\r\n", read_reg(ADXL345_DATA_FORMAT));
kenjiArai 0:21a3f84ad1c9 270 printf(" DATAX0=0x%02x,", read_reg(ADXL345_DATAX0));
kenjiArai 0:21a3f84ad1c9 271 printf(" 1=0x%02x,", read_reg(ADXL345_DATAX1));
kenjiArai 0:21a3f84ad1c9 272 printf(" DATAY0=0x%02x,", read_reg(ADXL345_DATAY0));
kenjiArai 0:21a3f84ad1c9 273 printf(" 1=0x%02x,", read_reg(ADXL345_DATAY1));
kenjiArai 0:21a3f84ad1c9 274 printf(" DATAZ0=0x%02x,", read_reg(ADXL345_DATAZ0));
kenjiArai 0:21a3f84ad1c9 275 printf(" 1=0x%02x\r\n", read_reg(ADXL345_DATAZ1));
kenjiArai 0:21a3f84ad1c9 276 printf(" FIFO_CTL=0x%02x,", read_reg(ADXL345_FIFO_CTL));
kenjiArai 0:21a3f84ad1c9 277 printf(" FIFO_STATUS=0x%02x\r\n", read_reg(ADXL345_FIFO_STATUS));
kenjiArai 0:21a3f84ad1c9 278 // internal data
kenjiArai 0:21a3f84ad1c9 279 printf(" ---- fs_factor=%f, acc_addr=0x%02x\r\n", fs_factor, acc_addr);
kenjiArai 0:21a3f84ad1c9 280 }
kenjiArai 0:21a3f84ad1c9 281
kenjiArai 0:21a3f84ad1c9 282 void ADXL345::self_test(void)
kenjiArai 0:21a3f84ad1c9 283 {
kenjiArai 0:21a3f84ad1c9 284 float dt0[3] ={0};
kenjiArai 0:21a3f84ad1c9 285 float dt1[3] ={0};
kenjiArai 0:21a3f84ad1c9 286 float dt2[3];
kenjiArai 0:21a3f84ad1c9 287
kenjiArai 0:21a3f84ad1c9 288 dt[0] = ADXL345_DATA_FORMAT;
kenjiArai 0:21a3f84ad1c9 289 dt[1] = 0x0B;
kenjiArai 0:21a3f84ad1c9 290 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 291 dt[0] = ADXL345_POWER_CTL;
kenjiArai 0:21a3f84ad1c9 292 dt[1] = 0x08;
kenjiArai 0:21a3f84ad1c9 293 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 294 dt[0] = ADXL345_INT_ENABLE;
kenjiArai 0:21a3f84ad1c9 295 dt[1] = 0x80;
kenjiArai 0:21a3f84ad1c9 296 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 297 WAIT_MS(40);
kenjiArai 0:21a3f84ad1c9 298 for(uint8_t n = 0; n < 100; n++){
kenjiArai 0:21a3f84ad1c9 299 read_data(dt2);
kenjiArai 0:21a3f84ad1c9 300 dt0[0] += dt2[0];
kenjiArai 0:21a3f84ad1c9 301 dt0[1] += dt2[1];
kenjiArai 0:21a3f84ad1c9 302 dt0[2] += dt2[2];
kenjiArai 0:21a3f84ad1c9 303 }
kenjiArai 0:21a3f84ad1c9 304 dt0[0] /= 100;
kenjiArai 0:21a3f84ad1c9 305 dt0[1] /= 100;
kenjiArai 0:21a3f84ad1c9 306 dt0[2] /= 100;
kenjiArai 0:21a3f84ad1c9 307 //
kenjiArai 0:21a3f84ad1c9 308 dt[0] = ADXL345_DATA_FORMAT;
kenjiArai 0:21a3f84ad1c9 309 dt[1] = 0x8B;
kenjiArai 0:21a3f84ad1c9 310 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 311 WAIT_MS(40);
kenjiArai 0:21a3f84ad1c9 312 for(uint8_t n = 0; n < 100; n++){
kenjiArai 0:21a3f84ad1c9 313 read_data(dt2);
kenjiArai 0:21a3f84ad1c9 314 dt1[0] += dt2[0];
kenjiArai 0:21a3f84ad1c9 315 dt1[1] += dt2[1];
kenjiArai 0:21a3f84ad1c9 316 dt1[2] += dt2[2];
kenjiArai 0:21a3f84ad1c9 317 }
kenjiArai 0:21a3f84ad1c9 318 dt1[0] /= 100;
kenjiArai 0:21a3f84ad1c9 319 dt1[1] /= 100;
kenjiArai 0:21a3f84ad1c9 320 dt1[2] /= 100;
kenjiArai 0:21a3f84ad1c9 321 printf("X, 1st, %+8.4f, 2nd, %+8.4f, diff, %+8.4f\r\n",
kenjiArai 0:21a3f84ad1c9 322 dt0[0], dt1[0], dt0[0] - dt1[0]);
kenjiArai 0:21a3f84ad1c9 323 printf("Y, 1st, %+8.4f, 2nd, %+8.4f, diff, %+8.4f\r\n",
kenjiArai 0:21a3f84ad1c9 324 dt0[1], dt1[1], dt0[1] - dt1[1]);
kenjiArai 0:21a3f84ad1c9 325 printf("Z, 1st, %+8.4f, 2nd, %+8.4f, diff, %+8.4f\r\n",
kenjiArai 0:21a3f84ad1c9 326 dt0[2], dt1[2], dt0[2] - dt1[2]);
kenjiArai 0:21a3f84ad1c9 327 //Recover original setting
kenjiArai 0:21a3f84ad1c9 328 // BW Rate
kenjiArai 0:21a3f84ad1c9 329 dt[0] = ADXL345_BW_RATE;
kenjiArai 0:21a3f84ad1c9 330 dt[1] = setting_data[0];
kenjiArai 0:21a3f84ad1c9 331 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 332 // Data format (measurement range)
kenjiArai 0:21a3f84ad1c9 333 dt[0] = ADXL345_DATA_FORMAT;
kenjiArai 0:21a3f84ad1c9 334 dt[1] = setting_data[1];
kenjiArai 0:21a3f84ad1c9 335 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 336 // Data ready flag
kenjiArai 0:21a3f84ad1c9 337 dt[0] = ADXL345_INT_ENABLE;
kenjiArai 0:21a3f84ad1c9 338 dt[1] = setting_data[2];
kenjiArai 0:21a3f84ad1c9 339 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 340 // Start measurement mode
kenjiArai 0:21a3f84ad1c9 341 dt[0] = ADXL345_POWER_CTL;
kenjiArai 0:21a3f84ad1c9 342 dt[1] = setting_data[3];
kenjiArai 0:21a3f84ad1c9 343 _i2c.write(acc_addr, dt, 2, false);
kenjiArai 0:21a3f84ad1c9 344 WAIT_MS(40);
kenjiArai 0:21a3f84ad1c9 345 read_data(dt2); // dummy read
kenjiArai 0:21a3f84ad1c9 346 }