//////////////////////////////////////////////////////////////////////////// ///@copyright Copyright (c) 2017, 传控科技 All rights reserved. ///------------------------------------------------------------------------- /// @file msa300.c /// @brief msa300 driver app ///------------------------------------------------------------------------- /// @version 1.0 /// @author CC /// @date 20170122 /// @note cc_AS_stc01 ////////////////////////////////////////////////////////////////////////////// #ifndef _MSA300_H #define _MSA300_H #include "bsp_config.h" #include "msp_uart1.h" #include "msp_iicMx.h" #include "debug_drv.h" /*********************************************************************** U51(SDO=1) int2 P33 ----------------U10(SDO=0) int2 P32----------------MCU----USB 0x4c 0x4e AS1 AS2 **************************************************************************/ #define D_i2c_addr_AS1 0x4c // u51 //#define D_i2c_addr_AS2 0x4e /* Register define for NSA asic */ #define MSA_REG_SPI_I2C 0x00 #define MSA_REG_WHO_AM_I 0x01 #define MSA_REG_ACC_X_LSB 0x02 #define MSA_REG_ACC_X_MSB 0x03 #define MSA_REG_ACC_Y_LSB 0x04 #define MSA_REG_ACC_Y_MSB 0x05 #define MSA_REG_ACC_Z_LSB 0x06 #define MSA_REG_ACC_Z_MSB 0x07 #define MSA_REG_Tape_Active_Status 0x0B #define MSA_REG_G_RANGE 0x0f #define MSA_REG_ODR_AXIS_DISABLE 0x10 #define MSA_REG_POWERMODE_BW 0x11 #define MSA_REG_SWAP_POLARITY 0x12 #define MSA_REG_FIFO_CTRL 0x14 #define MSA_REG_INTERRUPT_SETTINGS1 0x16 #define MSA_REG_INTERRUPT_SETTINGS2 0x17 #define MSA_REG_INTERRUPT_MAPPING1 0x19 #define MSA_REG_INTERRUPT_MAPPING2 0x1a #define MSA_REG_INTERRUPT_MAPPING3 0x1b #define MSA_REG_INT_PIN_CONFIG 0x20 #define MSA_REG_INT_LATCH 0x21 #define MSA_REG_ACTIVE_DURATION 0x27 #define MSA_REG_ACTIVE_THRESHOLD 0x28 #define MSA_REG_TAP_DURATION 0x2A #define MSA_REG_TAP_THRESHOLD 0x2B #define MSA_REG_CUSTOM_OFFSET_X 0x38 #define MSA_REG_CUSTOM_OFFSET_Y 0x39 #define MSA_REG_CUSTOM_OFFSET_Z 0x3a #define MSA_REG_ENGINEERING_MODE 0x7f #define MSA_REG_SENSITIVITY_TRIM_X 0x80 #define MSA_REG_SENSITIVITY_TRIM_Y 0x81 #define MSA_REG_SENSITIVITY_TRIM_Z 0x82 #define MSA_REG_COARSE_OFFSET_TRIM_X 0x83 #define MSA_REG_COARSE_OFFSET_TRIM_Y 0x84 #define MSA_REG_COARSE_OFFSET_TRIM_Z 0x85 #define MSA_REG_FINE_OFFSET_TRIM_X 0x86 #define MSA_REG_FINE_OFFSET_TRIM_Y 0x87 #define MSA_REG_FINE_OFFSET_TRIM_Z 0x88 #define MSA_REG_SENS_COMP 0x8c #define MSA_REG_MEMS_OPTION 0x8f #define MSA_REG_CHIP_INFO 0xc0 #define MSA_REG_CHIP_INFO_SECOND 0xc1 #define MSA_REG_SENS_COARSE_TRIM 0xd1 /************* ------------------------------------------------------------------- Reg 0x0F(Resolution/Range):Read/Write Bit7 Bit6 Bit5 Bit4 |Bit3 Bit2 |Bit1 Bit0 | Default |RESOLUTION[1:0] | FS[1:0] | 0X00 RESOLUTION[1:0]: resolution of x/y/z axes, 00:14bit, 01:12bit, 10:10bit, 11:8bit FS[1:0]: acceleration range of x/y/z axes, 00:+/-2g, 01:+/-4g, 10:+/-8g, 11:+/-16g *********/ #define D_MSA_8BIT B0000_1100 #define D_MSA_12BIT B0000_0100 #define D_MSA_10BIT B0000_1000 #define D_MSA_14BIT B0000_0000 #define D_MSA_16G B0000_0011 #define D_MSA_8G B0000_0001 #define D_MSA_4G B0000_0010 #define D_MSA_2G B0000_0000 /********** ODR Output data rate 1 1000 Hz Reg0x10(ODR) :Read/Write Default 0X0F Bit7 Bit6 Bit5 X_AXIS_DIS Y_AXIS_DIS Z_AXIS_DIS Bit4 Bit3 Bit2 Bit1 Bit0 ODR[3:0] X_AXIS_DIS: 0:enable, 1:disable Y_AXIS_DIS: 0:enable, 1:disable Z_AXIS_DIS: 0:enable, 1:disable ODR[3:0]: 0000:1Hz (not available in normal mode) 0001:1.95Hz (not available in normal mode) 0010:3.9Hz 0011:7.81Hz 0100:15.63Hz 0101: 31.25Hz 0110: 62.5Hz 0111: 125Hz 1000: 250Hz 1001: 500Hz (not available in low power mode) 1010-1111: (not available in low power mode) Table 5: bandwidth under different ODR and BW settings in normal mode ODR BW 1000Hz (1010-1111) 500Hz 500Hz (1001) 250Hz 250Hz (1000) 125Hz 125Hz (0111) 62.5Hz 62.5Hz (0110) 31.25Hz 31.25Hz (0101) 15.63Hz 15.63Hz (0100) 7.81Hz 7.81Hz (0011) 3.9Hz 3.9Hz (0010) 1.95Hz MSA300 supports four different acceleration measurement ranges, it is selected ODR BW 15.63Hz (0100) 7.81Hz *********/ /// fixme: 实测和规格书不一致 #define D_AXIS_DIS_Y B1000_0000 #define D_AXIS_DIS_X B0100_0000 #define D_AXIS_DIS_Z B0010_0000 #define D_ODR_31Hz25 0x05 #define D_ODR_250Hz 0x08 #define D_ODR_125Hz 0x0f #define D_ODR_15P63Hz B0000_0100 /********** Reg0x11(Power Mode/Bandwidth) : Read/Write ------------------------------------------------------------------ Bit7 Bit6 |Bit5 Bit4 Bit3 Bit2 Bit1 |Bit0 Default 0X9E ---------------------------------------------------------------------- PWR_MODE | LOW_POWER_BW[3:0] | -------------------------------------------------------------------- PWR_MODE: 00:normal mode, 01:low power mode, 10/11 suspend mode LOW_POWER_BW[3:0]: 0000-0010:1.95Hz 0011:3.9Hz, 0100:7.81Hz 0101:15.63Hz, 0110: 31.25Hz, 0111: 62.5Hz, 1000: 125Hz, 1001: 250Hz, 1010-1111:500Hz ***********/ //#define D_PowerMode_normal 0x00 //#define D_PowerMode_low 0x40 //#define D_PowerMode_suspend 0x80 #define D_lowPower_BW (0x0F<<1) #define D_PowerMode_normal B0000_0000 #define D_PowerMode_suspend B1000_0000 #define D_PowerMode_lowpower B0100_0000 #define D_gs_LPBW1H9 (0<<1) #define D_gs_LPBW3H9 (3<<1) #define D_gs_LPBW7H8 (4<<1) #define D_gs_LPBW15H (5<<1) #define D_gs_LPBW31H (6<<1) #define D_gs_LPBW62H (7<<1) #define D_gs_LPBW125H (8<<1) #define D_gs_LPBW250H (9<<1) #define D_gs_LPBW500H (10<<1) /********** /************************************** Reg 0x1B (Int_Map_2) :Read/Write Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default Bit6 INT2_ORIENT Bit5 INT2_S_TAP Bit4 INT2_D_TAP Bit2 INT2_ACTIVE Bit1 RESERVED Bit0 INT2_FREEFALL 0X00 INT2_ORIENT: map orientation interrupt to INT2, 0:disable, 1:enable INT2_S_TAP: map single tap interrupt to INT2, 0:disable, 1:enable INT2_D_TAP: map double tap interrupt to INT2, 0:disable, 1:enable INT2_ACTIVE: map active interrupt to INT2, 0:disable, 1:enable INT2_FREEFALL: map freefall interrupt to INT2, 0:disable, 1:enable ***************************************/ #define D_INT2_ORIENT BITN6 #define D_INT2_S_TAP BITN5 #define D_INT2_D_TAP BITN4 #define D_INT2_ACTIVE BITN2 #define D_INT2_FREEFALL BITN1 /********************************************** Reg 0x20 (Int_Map_2) :Read/Write Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default 0X00 Bit3 INT2_OD Bit2 NT2_LVL Bit1 IINT1_OD Bit0 INT1_LVL INT2_OD: select output for INT2, 0: push-pull, 1:OD INT2_LVL: select active level for INT2, 0: low, 1:high INT1_OD: select output for INT1, 0: push-pull, 1:OD INT1_LVL: select active level for INT1, 0: low, 1:high ***************************************/ #define D_INT2_pull 0 #define D_INT2_OD BITN3 #define D_INT2_LVL_high BITN2 #define D_INT2_LVL_low 0 #define D_INT1_pull 0 #define D_INT1_OD BITN1 #define D_INT1_LVL_high BITN0 #define D_INT1_LVL_low 0 /************************************************************* U51(SDO=1) int2 P33 ----------------U10(SDO=0) int2 P32----------------MCU----USB 0x4c 0x4e AS1 AS2 -------------------------------------------------------------------- Reg 0x16(Int_Set_0) : Read/Write Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default 0X00 ------------------------------------------------------------------- 象限应该 是 方位识别 Tap 功能 双击和单击 使能单击 s_tap_en 使能双击d_tap_en 中断状态保存: )s_tap_int , d_tap_int 通过检查加速度斜率是否超过设定的阈值来判断是否有单击事件 Bit6 ORIENT_INT_EN Bit5 S_TAP_INT_EN Bit4 D_TAP_INT_EN Bit2 ACTIVE_INT_EN_Z Bit1 ACTIVE_INT_EN_Y Bit0 ACTIVE_INT_EN_X ------------------------------------------------------------------- ORIENT_INT_EN: orient interrupt, 0:disable, 1:enable S_TAP_INT_EN: single tap interrupt, 0:disable, 1:enable D_TAP_INT_EN: double tap interrupt, 0:disable, 1:enable ACTIVE_INT_EN_Z: active interrupt for the z axis, 0:disable, 1:enable ACTIVE_INT_EN_Y: active interrupt for the y axis, 0:disable, 1:enable ACTIVE_INT_EN_X: active interrupt for the x axis, 0:disable, 1:enable reg 0x16对应的Reg 0x19 ------------------------------------------------------------------- Reg 0x19(Int_Map_0) : Read/Write Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default ------------------------------------------------------------------- INT1_ORIENT INT1_S_TAP INT1_D_TAP INT1_ACTIVE INT1_FREEFALL 0X00 ------------------------------------------------------------------- INT1_ORIENT: map orientation interrupt to INT1, 0:disable, 1:enable INT1_S_TAP: map single tap interrupt to INT1, 0:disable, 1:enable INT1_D_TAP: map double tap interrupt to INT1, 0:disable, 1:enable INT1_ACTIVE: map active interrupt to INT1, 0:disable, 1:enable INT1_FREEFALL: map freefall interrupt to INT1, 0:disable, 1:enable ------------------------------------------------------------------- Reg 0x27 (Active_Dur) : Read/Write Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default ACTIVE_DUR[1:0] 0X00 ACTIVE_DUR[1:0]: active duration time is (ACTIVE_DUR[1:0]+1)ms ------------------------------------------------------------------- Reg 0x28(Active_Th) : Read/Write Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default ACTIVE_TH[7:0] 0X14 ACTIVE_TH[7:0]: threshold of active interrupt 3.91mg/LSB(2g range) 7.81mg/LSB(4g range) 15.625mg/LSB(8g range) 31.25mg/LSB(16g range) **************************************************************************/ #define ACTIVE_INT_EN_Z BITN2 #define ACTIVE_INT_EN_Y BITN1 #define ACTIVE_INT_EN_X BITN0 /*************************************** 0x21 RESET_INT LATCH_INT[3:0] 0x00 latch_int Interrupt mode 0000 non-latched 0001 temporary latched 250ms 0010 temporary latched 500ms 0011 temporary latched 1s 0100 temporary latched 2s 0101 temporary latched 4s 0110 temporary latched 8s 0111 Latched 1000 non-latched 1001 temporary latched 1ms 1010 temporary latched 1ms 1011 temporary latched 2ms 1100 temporary latched 25ms 1101 temporary latched 50ms 1110 temporary latched 100ms 1111 Latched _______/``latch period````\_______ ****************************************/ #define D_no_latched 0x01 #define D_latch_250ms 0x01 #define D_latch_500ms 0x02 #define D_latch_1s 0x03 #define D_latch_2s 0x04 #define D_latch_4s 0x05 #define D_latch_8s 0x06 #define D_latched 0x07 #define D_no_latched2 0x08 #define D_latch_1ms 0x09 #define D_latch_1ms2 0x0a #define D_latch_2ms 0x0B #define D_latch_25ms 0x0C #define D_latch_50ms 0x0D #define D_latch_100ms 0x0E #define D_latched2 0x0f /**************************************************** Reg 0x09(Motion_Interrupt) :Read only Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default 0X00 Bit6 ORIENT_INT Bit5 S_TAP_INT Bit4 D_TAP_INT Bit2 ACTIVE_INT Bit0 FREEFALL_INT 运输的时候不停的动怎么办 需要方位判定?? 如果图像不是黑暗中 则 运输的动静大 需要关闭 也就是有大的动静时需要5s以上之后再工作 如果动静大 再休息5秒 这样把耗电 降到最小 ORIENT_INT: orientation interrupt status,0:inactive,1:active S_TAP_INT: single tap interrupt status,0:inactive,1:active D_TAP_INT: double tap interrupt status,0:inactive,1:active ACTIVE_INT: active interrupt status,0:inactive,1:active FREEFALL_INT: freefall interrupt status,0:inactive,1:active ------------------------------------------------------------------- Reg 0x0B(Tape_Active_Status) :Read only Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default TAP_SIGN TAP_FIRST_X TAP_FIRST_Y TAP_FIRST_Z ACTIVE_SIGN ACTIVE_FIRST_X ACTIVE_FIRST_Y ACTIVE_FIRST_Z 0X00 ------------------------------------------------------------------- TAP_SIGN: sign of tap triggering signal, 0:positive,1:negative TAP_FIRST_X: tap interrupt triggered by x axis, 1:positive,0:negative TAP_FIRST_Y: tap interrupt triggered by y axis, 1:positive,0:negative TAP_FIRST_Z: tap interrupt triggered by z axis, 1:positive,0:negative ACTIVE_SIGN: sign of active interrupt, 0:positive,1:negative ACTIVE_FIRST_X: active interrupt triggered by x axis, 1:positive,0:negative ACTIVE_FIRST_Y: active interrupt triggered by y axis, 1:positive,0:negative ACTIVE_FIRST_Z: active interrupt triggered by z axis, 1:positive,0:negative ***************************************************/ #define INT1_S_TAP_INT BITN5 ///单击中断 #define INT1_D_TAP_INT BITN4 ///双击中断 #define INT1_ACTIVE BITN2 /// 振动中断 #define D_Active_TH 0x28 #define D_Active_Dur 0x27 #define D_i2c_addr_AS1 0x4c // u51 #define D_i2c_addr_AS2 0x4e #define D_i2c_addr_Gsensor 0x4c // u51 #define D_i2c_addr_AS1 0x4c // u51 #define D_i2c_addr_AS2 0x4e /******************************************************************************/ /***************************** Include Files **********************************/ /******************************************************************************/ // 最高400Khz 1/400 ms 2.5us //Symbol Parameter Condition Min Max Unit //fscl Clock frequency 400 kHz #define D_as_ch_mun 1 struct _s_gsens_ {//8byte U8 d[6]; U8 powermode;/// // U16 x; // U16 y; // U16 z; }; extern struct _s_gsens_ s_as; extern void L1_msa300_reg_init(void); #define L1_ms300_reg_set(reg,dat) L2_IICMx_WriteCmd(D_iicch_MSA,D_i2c_addr_Gsensor,reg,dat) ////#define L1_ms300_reg_get(x,y) L2_I2C_ReadReg(D_i2c_addr_Gsensor,(x),1) #define DL_ms300_int_open(); L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,D_INT2_S_TAP|D_INT2_ACTIVE); #define DL_ms300_int_close(); L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,0); #define L1_ms300_xyz_read(dat,num) L2_IICMx_ReadReg(D_iicch_MSA,D_i2c_addr_Gsensor,MSA_REG_ACC_X_LSB,dat,num) /********* extern void L1_as_readXYZ(unsigned char CH); extern void L3_msa300_fun(U8 *pPara); extern void L1_as_action(void); extern void L1_as_WorkStatus(unsigned char d); ///L1_msa300_power(D_sleep); extern void L1_msa300_power(U8 mode); //读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) void L2_IICMx_ReadReg(vtype ch,unsigned char sla,unsigned char reg, unsigned char *r,unsigned char n) #define L1_max30102_WB(reg,dat) L2_IICMx_WriteCmd(D_iicch_MSA,D_i2c_addr_Gsensor,reg,dat) #define IIC_Read_Byte(adr,reg) L2_IICMx_Read1Reg1D(D_iicch_MSA,adr,reg) #define L1_max30102_Read(adr,reg) L2_IICMx_Read1Reg1D(D_iicch_MSA,D_i2c_addr_Gsensor,reg) #define L1_max30102_Read_Array(reg,dat,n) L2_IICMx_ReadReg(D_iicch_MSA,D_i2c_addr_Gsensor,reg,dat,n) *******/ ///#define D_PowerMode_low 0x5e ///#define D_PowerMode_low (0x50|D_gs_LPBW1H9) //#define D_PowerMode_low 0x5e///(0x40|D_gs_LPBW62H) #define LD_gsensor_power(Pmode) L2_IICMx_WriteCmd(D_iicch_MSA,D_i2c_addr_Gsensor,MSA_REG_POWERMODE_BW,Pmode);s_as.powermode=Pmode #endif // #ifndef _MSA300_H