From e60b066b8a257ffb7a8e984d7f50f11e2a47c797 Mon Sep 17 00:00:00 2001 From: Quency-D Date: Thu, 17 Nov 2022 14:19:36 +0800 Subject: [PATCH] Add DA217 sensor. Add DA217 sensor. --- .../DA217/da217_steps/da217_steps.ino | 54 +++ .../examples/DA217/da217_xyz/da217_xyz.ino | 29 ++ .../MultiSensorAutoRecognize.ino | 21 +- libraries/SensorBasic/src/da217.cpp | 274 ++++++++++++++ libraries/SensorBasic/src/da217.h | 355 ++++++++++++++++++ 5 files changed, 731 insertions(+), 2 deletions(-) create mode 100644 libraries/SensorBasic/examples/DA217/da217_steps/da217_steps.ino create mode 100644 libraries/SensorBasic/examples/DA217/da217_xyz/da217_xyz.ino create mode 100644 libraries/SensorBasic/src/da217.cpp create mode 100644 libraries/SensorBasic/src/da217.h diff --git a/libraries/SensorBasic/examples/DA217/da217_steps/da217_steps.ino b/libraries/SensorBasic/examples/DA217/da217_steps/da217_steps.ino new file mode 100644 index 00000000..7f7656f3 --- /dev/null +++ b/libraries/SensorBasic/examples/DA217/da217_steps/da217_steps.ino @@ -0,0 +1,54 @@ + + +#include "Arduino.h" +#include "da217.h" + +#define INT1_PIN GPIO0 +#define INT2_PIN GPIO1 +bool da217_int1_flag,da217_int2_flag; + +DA217 da217; +uint16_t step_num; +da217_step_status_t step_status; + + +void da217_int1_isr(void) +{ + da217_int1_flag =true; +} +void da217_int2_isr(void) +{ + da217_int2_flag =true; +} + +void setup() +{ + Serial.begin(115200); + PINMODE_INPUT_PULLDOWN(INT1_PIN); + PINMODE_INPUT_PULLDOWN(INT2_PIN); + attachInterrupt(INT1_PIN, da217_int1_isr, RISING); + attachInterrupt(INT2_PIN, da217_int2_isr, RISING); + pinMode(Vext,OUTPUT); + digitalWrite(Vext,LOW);//set vext to high + da217.da217_init(); + da217.da217_start_up_step_detect(true,true,5); +} + + +void loop() +{ + step_num = da217.da217_read_steps(); + step_status = da217.da217_read_step_status(); + Serial.printf("step_num = %d step_status =%d\r\n",step_num,step_status); + if( da217_int1_flag ) + { + Serial.println("da217_int1_flag"); + da217_int1_flag = false; + } + if(da217_int2_flag) + { + Serial.println("da217_int2_flag"); + da217_int2_flag = false; + } + delay(3000); +} diff --git a/libraries/SensorBasic/examples/DA217/da217_xyz/da217_xyz.ino b/libraries/SensorBasic/examples/DA217/da217_xyz/da217_xyz.ino new file mode 100644 index 00000000..cc4187e3 --- /dev/null +++ b/libraries/SensorBasic/examples/DA217/da217_xyz/da217_xyz.ino @@ -0,0 +1,29 @@ + + +#include "Arduino.h" +#include "da217.h" + + +DA217 da217; +uint16_t step_num; +uint16_t x_data,y_data,z_data; +void setup() +{ + Serial.begin(115200); + pinMode(Vext,OUTPUT); + digitalWrite(Vext,LOW);//set vext to high + da217.da217_init(); + da217.da217_set_odr_rate(DA217_ODR_500HZ); + da217.da217_set_fifo_mode(FIFO_MODE_FIFO); + da217.da217_set_full_scale(FS_FULL_SCALE_2g); + da217.da217_set_resolution(RESOLUTION_14_BIT); + da217.da217_start_xyz_axis(true,true,true); +} + + +void loop() +{ + da217.da217_read_xyz_data(&x_data,&y_data,&z_data); + Serial.printf("x_data=%d y_data=%d z_data=%d\r\n",x_data,y_data,z_data); + delay(3000); +} \ No newline at end of file diff --git a/libraries/SensorBasic/examples/MultiSensorAutoRecognize/MultiSensorAutoRecognize.ino b/libraries/SensorBasic/examples/MultiSensorAutoRecognize/MultiSensorAutoRecognize.ino index 95742b01..568cf441 100644 --- a/libraries/SensorBasic/examples/MultiSensorAutoRecognize/MultiSensorAutoRecognize.ino +++ b/libraries/SensorBasic/examples/MultiSensorAutoRecognize/MultiSensorAutoRecognize.ino @@ -26,15 +26,17 @@ #include "HDC1080.h" #include #include +#include "da217.h" BH1750 lightMeter; BMP085 bmp; HDC1080 hdc1080; MPU9250 mySensor; CCS811 ccs; - +DA217 da217; byte address; float aX, aY, aZ, aSqrt, gX, gY, gZ, mDirection, mX, mY, mZ; +uint16_t x_data,y_data,z_data; void I2C_Scan() { @@ -97,11 +99,20 @@ void setup() switch(address) { + case 0x27: + { + da217.da217_init(); + da217.da217_set_odr_rate(DA217_ODR_500HZ); + da217.da217_set_fifo_mode(FIFO_MODE_FIFO); + da217.da217_set_full_scale(FS_FULL_SCALE_2g); + da217.da217_set_resolution(RESOLUTION_14_BIT); + da217.da217_start_xyz_axis(true,true,true); + break; + } case 35: //0x23 -- BH1750 light sensor { lightMeter.begin(); Serial.println(F("BH1750 Test begin")); - break; } @@ -159,6 +170,12 @@ void loop() { switch(address) { + case 0x27: + { + da217.da217_read_xyz_data(&x_data,&y_data,&z_data); + Serial.printf("x_data=%d y_data=%d z_data=%d\r\n",x_data,y_data,z_data); + break; + } case 35: //0x23 -- BH1750 light sensor { float lux = lightMeter.readLightLevel(); diff --git a/libraries/SensorBasic/src/da217.cpp b/libraries/SensorBasic/src/da217.cpp new file mode 100644 index 00000000..76aa6179 --- /dev/null +++ b/libraries/SensorBasic/src/da217.cpp @@ -0,0 +1,274 @@ +#include + +#include +#include + +#include "da217.h" + + +#define FLOAT_TO_INT(x) ((x) >= 0 ? (int)((x) + 0.5) : (int)((x)-0.5)) + + +void DA217::da217_write_single_reg(uint8_t reg,uint8_t data) +{ + da217_write_multiple_reg(reg,&data,1); +} + + +void DA217::da217_write_multiple_reg(uint8_t reg_begin,uint8_t *data,uint8_t data_size) +{ + uint8_t num = 0; + Wire.beginTransmission(_address); + Wire.write(reg_begin); + while(num < data_size) + { + Wire.write(data[num++]); + } + Wire.endTransmission(); +} + + +uint8_t DA217::da217_read_single_reg(uint8_t reg) +{ + uint8_t data[2]; + da217_read_multiple_reg(reg,data,1); + return data[0]; +} +void DA217::da217_read_multiple_reg(uint8_t reg_begin,uint8_t* data,uint8_t data_size) +{ + uint8_t num = 0; + Wire.beginTransmission(_address); // start transmission to device + Wire.write(reg_begin); // sends register address to read from + Wire.endTransmission(0); // end transmission + + Wire.requestFrom((uint16_t)_address, (uint8_t)data_size,true);// send data n-bytes read + while(Wire.available() && (num < data_size)) + { + data[num++] = Wire.read(); // receive DATA + } +} + + +void DA217::da217_init(int sda,int scl ,uint32_t freq) +{ + uint8_t da217_id = 0; + _address = I2C_ADDRESS; + _freq = freq; + _sda = sda; + _scl = scl; + Wire.begin(); + da217_id = da217_read_single_reg(DA217_REG_WHO_AM_I); + if(da217_id != 0x13) + { + Serial.printf("da217_init failed! da217_id = %d \r\n",da217_id); + } + else + { + Serial.printf("da217_init successful! da217_id = 0x%x\r\n",da217_id); + } + da217_poweroff(); + delay(100); + da217_poweron(); + da217_enable_watchdog(); + +} + + +void DA217::da217_poweron(void) +{ + uint8_t temp; + temp = DA217_PWR_ON |DA217_BANDWIDTH_500HZ |DA217_AUTOSLEEP_EN; + da217_write_single_reg(DA217_REG_MODE_BW,temp); +} + +void DA217::da217_poweroff(void) +{ + uint8_t temp; + temp = ~DA217_PWR_ON & (~DA217_AUTOSLEEP_EN); + da217_write_single_reg(DA217_REG_MODE_BW,temp); +} + +void DA217::da217_start_up_step_detect(bool step_int_en,bool sm_int_en,uint8_t sm_threshold) +{ + uint8_t temp; + da217_write_single_reg(DA217_REG_STEP_FILTER,DA217_STEP_FILTER_EN); + da217_write_single_reg(DA217_REG_RESET_STEP,DA217_RESET_STEP); + delay(100); + da217_write_single_reg(DA217_REG_RESET_STEP,~DA217_RESET_STEP); + + if(step_int_en) + { + temp = da217_read_single_reg(DA217_REG_INT_SET0); + temp |= DA217_STEP_INT_EN; + da217_write_single_reg(DA217_REG_INT_SET0,temp); + + temp = da217_read_single_reg(DA217_REG_INTERRUPT_MAPPING3); + temp |= DA217_INT2_STEP; + da217_write_single_reg(DA217_REG_INTERRUPT_MAPPING3,temp); + + temp = da217_read_single_reg(DA217_REG_INTERRUPT_MAPPING1); + temp &= ~DA217_INT1_STEP; + da217_write_single_reg(DA217_REG_INTERRUPT_MAPPING1,temp); + + } + temp = da217_read_single_reg(DA217_REG_INTERRUPT_MAPPING3); + Serial.printf("DA217_REG_INTERRUPT_MAPPING3 = %d \r\n",temp); + if(sm_int_en) + { + temp = da217_read_single_reg(DA217_REG_INT_SET0); + temp |= DA217_SM_INT_EN; + da217_write_single_reg(DA217_REG_INT_SET0,temp); + da217_write_single_reg(DA217_REG_SM_THRESHOLD, sm_threshold); + + + + temp = da217_read_single_reg(DA217_REG_INTERRUPT_MAPPING1); + temp |= DA217_INT1_SM; + da217_write_single_reg(DA217_REG_INTERRUPT_MAPPING1,temp); + + temp = da217_read_single_reg(DA217_REG_INTERRUPT_MAPPING3); + temp &= ~DA217_INT2_SM; + Serial.printf("DA217_INT2_SM = %u \r\n",temp); + + da217_write_single_reg(DA217_REG_INTERRUPT_MAPPING3,temp); + } + da217_write_single_reg(DA217_REG_INT_LATCH,DA217_INT_LATCH_VALUE); + + + temp = da217_read_single_reg(DA217_REG_INTERRUPT_MAPPING3); + Serial.printf("DA217_REG_INTERRUPT_MAPPING3 = %d \r\n",temp); + temp = da217_read_single_reg(DA217_REG_INTERRUPT_MAPPING1); + Serial.printf("DA217_REG_INTERRUPT_MAPPING1 = %d \r\n",temp); + temp = da217_read_single_reg(DA217_REG_INT_SET0); + Serial.printf("DA217_REG_INT_SET0 = %d \r\n",temp); +} + + +void DA217::da217_stop_step_detect(void) +{ + uint8_t temp; + da217_write_single_reg(DA217_REG_STEP_FILTER,~DA217_STEP_FILTER_EN); + da217_write_single_reg(DA217_REG_RESET_STEP,DA217_RESET_STEP); + + temp = da217_read_single_reg(DA217_REG_INT_SET0); + temp &= ~DA217_STEP_INT_EN; + temp &= ~DA217_SM_INT_EN; + da217_write_single_reg(DA217_REG_INT_SET0,temp); +} + +uint16_t DA217::da217_read_steps(void) +{ + uint16_t step_num = 0; + step_num = da217_read_single_reg(DA217_REG_STEPS_MSB) << 8; //Step Counter + step_num += da217_read_single_reg(DA217_REG_STEPS_LSB); //Step Counter + return step_num; +} + +da217_step_status_t DA217::da217_read_step_status(void) +{ + uint8_t step_status,temp; + temp = da217_read_single_reg(DA217_ORIENT_STATUS) ; //Step Counter + step_status = temp & DA217_STEP_STATUS; + return (da217_step_status_t)step_status; +} + + + +void DA217::da217_enable_watchdog(void) +{ + uint8_t temp; + temp = da217_read_single_reg(DA217_REG_RESOLUTION_RANGE); + temp |= WATCHDOG_EN; + temp |= WATCHDOG_TIME_50MS; + da217_write_single_reg(DA217_REG_RESOLUTION_RANGE,temp); + temp = da217_read_single_reg(DA217_REG_RESOLUTION_RANGE); +} + +void DA217::da217_disable_watchdog(void) +{ + uint8_t temp; + temp = da217_read_single_reg(DA217_REG_RESOLUTION_RANGE); + temp &= ~WATCHDOG_EN; + da217_write_single_reg(DA217_REG_RESOLUTION_RANGE,temp); +} + + + +void DA217::da217_start_xyz_axis(bool x_en,bool y_en,bool z_en) +{ + uint8_t temp; + temp = da217_read_single_reg(DA217_REG_ODR_AXIS); + if(x_en) + { + temp &= ~DA217_X_AXIS_DIS; + } + else + { + temp |= DA217_X_AXIS_DIS; + } + + if(y_en) + { + temp &= ~DA217_Y_AXIS_DIS; + } + else + { + temp |= DA217_Y_AXIS_DIS; + } + + if(z_en) + { + temp &= ~DA217_Z_AXIS_DIS; + } + else + { + temp |= DA217_Z_AXIS_DIS; + } + da217_write_single_reg(DA217_REG_ODR_AXIS,temp); + +} + +void DA217::da217_set_odr_rate(da217_odr_rate_t odr_rate) +{ + uint8_t temp; + temp = da217_read_single_reg(DA217_REG_ODR_AXIS)&0xF0; + temp |= odr_rate; + da217_write_single_reg(DA217_REG_ODR_AXIS,temp); +} + +void DA217::da217_set_fifo_mode(da217_fifo_mode_t mode) +{ + uint8_t temp; + temp = da217_read_single_reg(DA217_REG_FIFO_CTRL) &0x3F; + temp |= mode; + da217_write_single_reg(DA217_REG_FIFO_CTRL,temp); +} + +void DA217::da217_set_full_scale(da217_full_scale_t fs) +{ + uint8_t temp; + temp = da217_read_single_reg(DA217_REG_RESOLUTION_RANGE) &0xFC; + temp |= fs; + da217_write_single_reg(DA217_REG_RESOLUTION_RANGE,temp); +} + +void DA217::da217_set_resolution(da217_resolution_t resolution) +{ + uint8_t temp; + temp = da217_read_single_reg(DA217_REG_RESOLUTION_RANGE) &0xF3; + temp |= resolution; + da217_write_single_reg(DA217_REG_RESOLUTION_RANGE,temp); +} + +void DA217::da217_read_xyz_data(uint16_t *x_data,uint16_t *y_data,uint16_t *z_data) +{ + uint8_t data[6]; + if(x_data ==NULL || y_data ==NULL || z_data ==NULL) + { + return; + } + da217_read_multiple_reg(DA217_REG_ACC_X_LSB,data,6); + *x_data = data[0]+ (data[1]<< 8); + *y_data = data[2]+ (data[3]<< 8); + *z_data = data[4]+ (data[5]<< 8); +} diff --git a/libraries/SensorBasic/src/da217.h b/libraries/SensorBasic/src/da217.h new file mode 100644 index 00000000..f02619c5 --- /dev/null +++ b/libraries/SensorBasic/src/da217.h @@ -0,0 +1,355 @@ +#ifndef __DA217_H_ +#define __DA217_H_ +#include "Arduino.h" +#include + + +//#define ORIENT_HYST (2CH) + +//DA217 registers start +// INT_SET0 0x15 +#define Tilt_int_en 0x10 +#define Watermark_int_en 0x08 +#define FIFO_full_int_en 0x04 +#define DA217_SM_INT_EN (0x01 <<1) +#define DA217_STEP_INT_EN (0x01 <<0) + +//INT_SET0 Tilt_int_en | FIFO_full_int_en + +#define INT_SET1 0x16 +#define INT_source_mask 0xC0 +#define INT_source_oversampling 00 //00: oversampling data (ODR_period =ODR*OSR) +#define INT_source_unfiltered 0x40 // 01: unfiltered data (ODR_period =ODR) +#define INT_source_filtered 0x80 // 10/11: filtered data (ODR_period =ODR IIR) +#define S_tap_int_en 0x20 +#define D_tap_int_en 0x10 +#define Orient_int_en 0x08 +#define Active_int_en_z 0x04 +#define Active_int_en_y 0x02 +#define Active_int_en_x 0x01 +//INT_SET1 INT_source_unfiltered | Orient_int_en + +#define INT_SET2 0x17 +#define Temporary_dis 0x80 // temporary disable all interrupts for a short time(configured by temp_dis_time) +#define Temp_dis_time_mask 0x60 +#define Temp_dis_time_100ms 0 //00://00:100ms +#define Temp_dis_time_1s 0x20 //01:1s +#define Temp_dis_time_2s 0x40 //10:2s +#define Temp_dis_time_4s 0x60 //11:4s +#define New_data_int_en 0x10 +#define Freefall_int_en 0x08 +// unused unused unused +// INT_SET2 0 + +// #define MOTION_FLAG 0x09 +#define DA217_STEP_INT (0x01 <<7) +#define DA217_ORIENT_INT (0x01 <<6) +#define DA217_S_TAP_INT (0x01 <<5) +#define DA217_D_TAP_INT (0x01 <<4) +#define DA217_SM_INT (0x01 <<3) +#define DA217_ACTIVE_INT (0x01 <<2) +#define DA217_TILT_INT (0x01 <<1) +#define DA217_FREEFALL_INT (0x01 <<0) + +#define Tilt_ths_value 0x10 +#define TAP_THS 0x2B + +#define INT_MAP1 0x19 +#define DA217_INT1_SM (0x01 <<7) +#define DA217_INT1_ORIENT (0x01 <<6) +#define DA217_INT1_S_TAP (0x01 <<5) +#define DA217_INT1_D_TAP (0x01 <<4) +#define DA217_INT1_TILT (0x01 <<3) +#define DA217_INT1_ACTIVE (0x01 <<2) +#define DA217_INT1_STEP (0x01 <<1) +#define DA217_INT1_FREEFALL (0x01 <<0) +// INT_MAP1 Int1_tilt | Int1_orient + +#define INT_MAP2 0x1A +#define Int2_new_data 0x80 +#define Int2_watermark 0x40 +#define Int2_FIFO_full 0x20 +//unused unused +#define Int1_FIFO_full 0x04 +#define Int1_watermark 0x02 +#define Int1_new_data 0x01 +//INT_MAP2 0 // Int2_FIFO_full + +// #define INT_MAP3 0x1B +#define DA217_INT2_SM (0x01 <<7) +#define DA217_INT2_ORIENT (0x01 <<6) +#define DA217_INT2_S_TAP (0x01 <<5) +#define DA217_INT2_D_TAP (0x01 <<4) +#define DA217_INT2_TILT (0x01 <<3) +#define DA217_INT2_ACTIVE (0x01 <<2) +#define DA217_INT2_STEP (0x01 <<1) +#define DA217_INT2_FREEFALL (0x01 <<0) +// INT_MAP3 0 + +#define INT_CONFIG 0x20 +#define Reset_int 0x80 +//unused unused unused +#define Int2_od 0x08 +#define Int2_lvl 0x04 +#define Int1_od 0x02 +#define Int1_lvl 0x01 +// INT_CONFIG Reset_int + +// #define INT_LATCH 0x21 +// INT_LATCH 0x11 int2:int1 0001: temporary latched 250ms +#define DA217_INT_LATCH_VALUE 0x00 + + +#define Z_BLOCK 0x2D + +#define DA217_ORIENT_STATUS 0x0C +//unused +#define OrientZ 0x40 +#define OrientXY 0x30 +//unused unused +#define DA217_STEP_STATUS 0x03 + +#define OrientZ_upward_looking 0 +#define OrientZ_downward_looking OrientZ +#define OrientXY_portrait_upright 0 +#define OrientXY_portrait_upside_down 0x10 +#define OrientXY_landscape_left 0x20 +#define OrientXY_landscape_right 0x30 + +#define Step_status_idle0 0 +#define Step_status_idle1 3 +#define Step_status_walk 1 +#define Step_status_run 2 + +#define ORIENT_HYST 0x2C +//unused Orient_hyst[2] Orient_hyst[1] Orient_hyst[0] Orient_block[1] Orient_block [0] Orient_mode [1] Orient_mode [0] +#define Orient_hyst_level_0 0 // a blocking value between 0g and 0.9375g with an LSB = 0.0625g. +#define Orient_hyst_level_1 0x010 +#define Orient_hyst_level_2 0x020 +#define Orient_hyst_level_3 0x030 +#define Orient_hyst_level_4 0x040 +#define Orient_hyst_level_5 0x050 +#define Orient_hyst_level_6 0x060 +#define Orient_hyst_level_7 0x070 +//Set the hysteresis of the orientation interrupt +//1LSB = 62.5mg. + +#define Orient_block_no_blocking1 0 +#define Orient_block_z_blocking 0x04 +#define Orient_block_z_blocking_with_slope 0x08 +#define Orient_block_no_blocking2 0x0c + +#define Orient_mode_symmetrical 0 +#define Orient_mode_high_asymmetrical 1 +#define Orient_mode_low_asymmetrical 2 +#define Orient_mode_synmmetrical 3 + +#define DA217_STEP_FILTER_EN (0X01 <<7) + +//Step_en unused unused unused unused unused unused unused +#define DA217_RESET_STEP 0x80 +//Reset_steps unused unused unused unused unused unused unused +// #define SM_THRESHOLD 0x34 +// SM_threshold[7:0] 0-255 step + + +// #define RESOLUTION_RANGE 0x0F +//HP_en Wdt_en Wdt_time unused Resolution[1] Resolution[0] FS[1] FS[0] +#define HP_EN (0x01 << 7) +#define WATCHDOG_EN (0x01 << 6) +#define WATCHDOG_TIME_1MS 0x00 +#define WATCHDOG_TIME_50MS (0x01 << 5) + + +//00: +/-2g +//01: +/-4g +//10:+/-8g +//11:+/-16 + +// #define ODR_AXIS 0x10 +//X-axis_disable Y-axis_disable Z-axis_disable unused ODR[3] ODR[2] ODR[1] ODR[0] +#define DA217_X_AXIS_DIS (0X01 <<7) +#define DA217_Y_AXIS_DIS (0X01 <<6) +#define DA217_Z_AXIS_DIS (0X01 <<5) + + +// #define MODE_BW 0x11 +//PWR_OFF unused unused unused unused BW[1] BW[0] autosleep_en +#define DA217_PWR_ON (0x00) + +#define DA217_BANDWIDTH_500HZ (0x00) +#define DA217_BANDWIDTH_250HZ (0x01 <<1) +#define DA217_BANDWIDTH_100HZ (0x01 <<2) +//00/11:500hz +//01:250 +//10:100 +#define DA217_AUTOSLEEP_EN (0x01 <<0) + +//0: working the current ODR state all the way +//1: Working at 12.5hz in inactive state, automatic switched to normal mode during active state + +#define SWAP_POLARITY 0x12 +#define ACC_Z_LSB 0x06 +#define ACC_Z_MSB 0x07 +#define FIFO_STATUS 0x08 + +// #define FIFO_CTRL 0x14 +/* +FIFO_mode[1] FIFO_mode[0] unused +Watermark_ +samples[4] +Watermark_ +samples[3] +Watermark_ +samples[2] +Watermark_ +samples[1] +Watermark_ +samples[0] +*/ + +#define Watermark_samples_31 0x1F + +#define NEWDATA_FLAG 0x0A + +#define TAP_ACTIVE_STATUS 0x0B + +#define ACTIVE_DUR 0x27 +//Inactive_dur[3] Inactive_dur[2] Inactive_dur[1] Inactive_dur[0] Active_dur[3] Active_dur[2] Active_dur[1] Active_dur[0] +#define Inactive_dur_4 0x40 // inactive duration time = (Inactive_dur + 1)* ODR_period +#define Inactive_dur_8 0x80 // inactive duration time = (Inactive_dur + 1)* ODR_period +#define Active_dur_4 0x04 // Active duration time = (Active_dur + 1)* ODR_period + +#define ACTIVE_THS 0x28 +//Active_th[7] Active_th [6] Active_th [5] Active_th[4] Active_th [3] Active_th [2] Active_th [1] Active_th [0] +#define Active_th_20 0x20 +//Threshold of active interrupt=Active_th*K(mg) +//K = 3.91(2g range), +//K =7.81(4g range), +//K=15.625(8g range), +//K=31.25(16g range) +//DA217 registers end + +/******************************************************************************* +Macro definitions - Register define for Gsensor asic +********************************************************************************/ +#define DA217_REG_SPI_I2C 0x00 +#define DA217_REG_WHO_AM_I 0x01 +#define DA217_REG_ACC_X_LSB 0x02 +#define DA217_REG_ACC_X_MSB 0x03 +#define DA217_REG_ACC_Y_LSB 0x04 +#define DA217_REG_ACC_Y_MSB 0x05 +#define DA217_REG_ACC_Z_LSB 0x06 +#define DA217_REG_ACC_Z_MSB 0x07 +#define DA217_REG_MOTION_FLAG 0x09 +#define DA217_REG_STEPS_MSB 0x0D +#define DA217_REG_STEPS_LSB 0x0E +#define DA217_REG_RESOLUTION_RANGE 0x0F +#define DA217_REG_ODR_AXIS 0x10 +#define DA217_REG_MODE_BW 0x11 +#define DA217_REG_SWAP_POLARITY 0x12 +#define DA217_REG_FIFO_CTRL 0x14 +#define DA217_REG_INT_SET0 0x15 +#define DA217_REG_INTERRUPT_SETTINGS1 0x16 +#define DA217_REG_INTERRUPT_SETTINGS2 0x17 +#define DA217_REG_INTERRUPT_MAPPING1 0x19 +#define DA217_REG_INTERRUPT_MAPPING2 0x1a +#define DA217_REG_INTERRUPT_MAPPING3 0x1b +#define DA217_REG_INT_PIN_CONFIG 0x20 +#define DA217_REG_INT_LATCH 0x21 +#define DA217_REG_ACTIVE_DURATION 0x27 +#define DA217_REG_ACTIVE_THRESHOLD 0x28 +#define DA217_REG_TAP_DURATION 0x2A +#define DA217_REG_TAP_THRESHOLD 0x2B +#define DA217_REG_RESET_STEP 0x2E +#define DA217_REG_STEP_CONFIG1 0x2F +#define DA217_REG_STEP_CONFIG2 0x30 +#define DA217_REG_STEP_CONFIG3 0x31 +#define DA217_REG_STEP_CONFIG4 0x32 +#define DA217_REG_STEP_FILTER 0x33 +#define DA217_REG_SM_THRESHOLD 0x34 + + +#define I2C_ADDRESS 0x27 + +typedef enum +{ + IDLE1 = 0x00, + WALK = 0x01, + RUN = 0x10, + IDLE2 = 0x11, +}da217_step_status_t; + + +typedef enum +{ + FIFO_MODE_BYPASS = 0x00, + FIFO_MODE_FIFO = 0x40, + FIFO_MODE_STREAM = 0x80, + FIFO_MODE_TRIGGER = 0xc0, +}da217_fifo_mode_t; + +typedef enum +{ + FS_FULL_SCALE_2g = 0, + FS_FULL_SCALE_4g = 1, + FS_FULL_SCALE_8g = 2, + FS_FULL_SCALE_16g = 3 +}da217_full_scale_t; + +typedef enum +{ + RESOLUTION_14_BIT = 0, + RESOLUTION_12_BIT = 4, + RESOLUTION_10_BIT = 8, + RESOLUTION_8_BIT = 0x0c +}da217_resolution_t; + + +typedef enum +{ + DA217_ODR_1HZ =0, + DA217_ODR_2HZ =1, + DA217_ODR_4HZ =2, + DA217_ODR_8HZ =3, + DA217_ODR_16HZ =4, + DA217_ODR_32HZ =5, + DA217_ODR_63HZ =6, + DA217_ODR_125HZ =7, + DA217_ODR_250HZ =8, + DA217_ODR_500HZ =9, +}da217_odr_rate_t; +class DA217 +{ +public: + void da217_init( int sda=3,int scl=4 ,uint32_t freq=50000); + void da217_start_up_step_detect( bool step_int_en = false,bool sm_int_en = false, uint8_t sm_threshold = 0xFF); + void da217_stop_step_detect(void); + uint16_t da217_read_steps(void); + da217_step_status_t da217_read_step_status(void); + + void da217_poweron(void); + void da217_poweroff(void); + void da217_enable_watchdog(void); + void da217_disable_watchdog(void); + void da217_start_xyz_axis(bool x_en,bool y_en,bool z_en); + void da217_set_odr_rate(da217_odr_rate_t odr_rate); + void da217_set_fifo_mode(da217_fifo_mode_t mode); + void da217_set_full_scale(da217_full_scale_t fs); + void da217_set_resolution(da217_resolution_t resolution); + void da217_read_xyz_data(uint16_t *x_data,uint16_t *y_data,uint16_t *z_data); + +private: + uint8_t _address; + int _sda; + int _scl; + uint32_t _freq; + void da217_write_single_reg(uint8_t reg,uint8_t data); + void da217_write_multiple_reg(uint8_t reg_begin,uint8_t *data,uint8_t data_size); + uint8_t da217_read_single_reg(uint8_t reg); + void da217_read_multiple_reg(uint8_t reg_begin,uint8_t* data,uint8_t data_size); + +}; + +#endif +