#include "qma7981.h"
static QMA7981_data g_QMA7981;
#if defined(QMA7981_DOUBLE_TRIPLE_CLICK)
static unsigned int acc_data_curr[3];
static unsigned int acc_data[3];
static qst_click_check g_click;
#endif
#if defined(QMA7981_ABNORMAL_SHAKE_CHECK)
static qst_shake_check g_shake;
#endif
//========================================================================
// 描述: QMA7981写寄存器.
// 参数: none.
// 返回: none.
//========================================================================
void qma7981_write_reg(uint8 reg,uint8 _data)
{
uint8 data[2]={reg,_data};
hardiic_write_bytes(QMA7981_I2C_SLAVE_ADDR,&data[0],2);
}
//========================================================================
// 描述: QMA7981读寄存器.
// 参数: none.
// 返回: none.
//========================================================================
void qma7981_read_reg(uint8 reg,uint8 *buf, uint8 len)
{
hardiic_write_bytes(QMA7981_I2C_SLAVE_ADDR,®,1);
hardiic_read_bytes(QMA7981_I2C_SLAVE_ADDR,buf,len);
}
/*
qma7981 odr setting
0x10<2:0> ODR(Hz) Time(ms) | RANGE 0x0f<3:0>
000 43.3125 23.088 | 0001 2g 244ug/LSB
001 86.4453 11.568 | 0010 4g 488ug/LSB
002 172.1763 5.808 | 0100 8g 977ug/LSB
003 341.5300 2.928 | 1000 16g 1.95mg/LSB
004 672.0430 1.488 | 1111 32g 3.91mg/LSB
005 32.5013 30.768 | Others 2g 244ug/LSB
006 129.3995 7.728 |
007 257.2016 3.888 |
*/
const uint8 qma7981_init_tbl[][2] =
{
{0x11, 0x80}, //将设备设置为活动模式
{0x36, 0xb6},
{0xff, 5},
{0x36, 0x00},
{0x0f, QMA7981_RANGE_8G},
{0x10, 0xe1}, // ODR 130hz
//{0x4a, 0x08}, //Force I2C I2C uint32erface.SPI is disabled,SENB can be used as ATB
{0x20, 0x04}, //将int1设置为活动电平为逻辑低
{0x11, 0x80},
{0x5f, 0x80}, //enable test mode,take control the FSM
{0x5f, 0x00}, //normal mode
{0xff, 1},
};
//========================================================================
// 描述: QMA7981延时函数.
// 参数: none.
// 返回: none.
//========================================================================
void qma7981_delay(uint32 delay)
{
uint32 i,j;
for(i=0;i<delay;i++)
{
for(j=0;j<1000;j++)
{
;
}
}
}
//========================================================================
// 描述: QMA7981抬手唤醒配置函数.
// 参数: wake_sum:手部动作强度(0~31); diff:两次动作的微分值(0~15); period:唤醒时间(0~2047).
// timeout:唤醒超时时间(0~4095); hd_z:放下时的z阈值(0~7); hd_x:放下时的x阈值(0~7);
// 返回: none.
//========================================================================
void qma7981_raise_config(uint8 wake_sum, uint8 diff, uint16 period, uint16 timeout, uint8 hd_z, uint8 hd_x)
{
qma7981_write_reg(0x2a, ((diff&0x03)<<6)|(wake_sum&0x1f));
qma7981_write_reg(0x2b, ((hd_z&0x07)<<5)|((hd_x&0x07)<<2)|((diff&0x0c)>>2));
qma7981_write_reg(0x35, period&0x00ff);
qma7981_write_reg(0x3e, timeout&0x00ff);
qma7981_write_reg(0x3f, ((period&0x0700)>>4)|((timeout&0x0f00)>>8));
}
//========================================================================
// 描述: QMA7981初始化寄存器.
// 参数: none.
// 返回: none.
//========================================================================
uint8 qma7981_initialize()
{
uint32 ret = 0;
uint32 index, total;
uint8 _data[2] = {0};
uint8 reg_0x10 = 0;
uint8 reg_0x16 = 0;
uint8 reg_0x18 = 0;
uint8 reg_0x19 = 0;
uint8 reg_0x1a = 0;
#if defined(QMA7981_ANY_MOTION)||defined(QMA7981_NO_MOTION)
uint8 reg_0x2c = 0;
#endif
total = sizeof(qma7981_init_tbl)/sizeof(qma7981_init_tbl[0]);
for(index=0; index<total; index++)
{
_data[0] = qma7981_init_tbl[index][0];
_data[1] = qma7981_init_tbl[index][1];
if(_data[0] == 0xff)
{
qma7981_delay(_data[1]);
}
else
{
if(_data[0] == QMA7981_REG_RANGE)
{
if(_data[1] == QMA7981_RANGE_4G)
g_QMA7981.lsb_1g = 2048;
else if(_data[1] == QMA7981_RANGE_8G)
g_QMA7981.lsb_1g = 1024;
else if(_data[1] == QMA7981_RANGE_16G)
g_QMA7981.lsb_1g = 512;
else if(_data[1] == QMA7981_RANGE_32G)
g_QMA7981.lsb_1g = 256;
else
g_QMA7981.lsb_1g = 4096;
}
qma7981_write_reg(_data[0],_data[1]);
qma7981_delay(2);
}
}
// read reg
qma7981_read_reg(0x16, ®_0x16, 1);
qma7981_read_reg(0x18, ®_0x18, 1);
qma7981_read_reg(0x19, ®_0x19, 1);
qma7981_read_reg(0x1a, ®_0x1a, 1);
#if defined(QMA7981_ANY_MOTION)||defined(QMA7981_NO_MOTION)
qma7981_read_reg(0x2c, ®_0x2c, 1);
#endif
// read reg
reg_0x10 = QMA7981_BW_REG;
qma7981_write_reg(0x10, reg_0x10); //带宽设置
#if defined(QMA7981_STEPCOUNTER)
#if (QMA7981_BW_REG == 0xe0)
{
// ODR: 65hz 15.48 ms
qma7981_write_reg(0x12, QMA7981_REG_0X12);
qma7981_write_reg(0x13, 0x80); // clear step
qma7981_write_reg(0x13, QMA7981_REG_0X13); //
qma7981_write_reg(0x14, QMA7981_REG_0X14); // STEP_TIME_LOW<7:0>*(1/ODR)
qma7981_write_reg(0x15, QMA7981_REG_0X15); // STEP_TIME_UP<7:0>*8*(1/ODR)
}
#elif (QMA7981_BW_REG == 0xe1)
{
// ODR: 130hz 7.74 ms
qma7981_write_reg(0x12, QMA7981_REG_0X12);
qma7981_write_reg(0x13, 0x80); // clear step
qma7981_write_reg(0x13, QMA7981_REG_0X13); //
qma7981_write_reg(0x14, QMA7981_REG_0X14); // STEP_TIME_LOW<7:0>*(1/ODR)
qma7981_write_reg(0x15, QMA7981_REG_0X15); // STEP_TIME_UP<7:0>*8*(1/ODR)
}
#elif (QMA7981_BW_REG == 0xe2)
{
// ODR: 258Hz 3.87 ms
qma7981_write_reg(0x12, QMA7981_REG_0X12);
qma7981_write_reg(0x13, 0x80); // clear step
qma7981_write_reg(0x13, QMA7981_REG_0X13); //
qma7981_write_reg(0x14, QMA7981_REG_0X14); // STEP_TIME_LOW<7:0>*(1/ODR)
qma7981_write_reg(0x15, QMA7981_REG_0X15); // STEP_TIME_UP<7:0>*8*(1/ODR)
}
#endif
qma7981_write_reg(0x1f, QMA7981_REG_0X1f);
// step int
#if defined(QMA7981_STEP_INT)
reg_0x16 |= 0x08;
reg_0x19 |= 0x08;
qma7981_write_reg(0x16, reg_0x16);
qma7981_write_reg(0x19, reg_0x19);
#endif
#if defined(QMA7981_SIGNIFICANT_STEP)
qma7981_write_reg(0x1d, 0x26); //every 30 step
reg_0x16 |= 0x40;
reg_0x19 |= 0x40;
qma7981_write_reg(0x16, reg_0x16);
qma7981_write_reg(0x19, reg_0x19);
#endif
#endif
//RANGE<3:0> Acceleration range Resolution
//0001 2g 244ug/LSB
//0010 4g 488ug/LSB
//0100 8g 977ug/LSB
//1000 16g 1.95mg/LSB
//1111 32g 3.91mg/LSB
//Others 2g 244ug/LSB
//0x2c
//Duration = (NO_MOT_DUR<3:0> + 1) * 1s, if NO_MOT_DUR<5:4> =b00
//Duration = (NO_MOT_DUR<3:0> + 4) * 5s, if NO_MOT_DUR<5:4> =b01
//Duration = (NO_MOT_DUR<3:0> + 10) * 10s, if NO_MOT_DUR<5:4> =b1x
//ANY_MOT_DUR<1:0>: any motion interrupt will be triggered when slope > ANY_MOT_TH for (ANY_MOT_DUR<1:0> + 1) samples
//0x2e ANY MOTION MOT_CONF2
//TH= ANY_MOT_TH<7:0> * 16 * LSB
#if defined(QMA7981_ANY_MOTION)
reg_0x18 |= 0x07;
reg_0x1a |= 0x01;
reg_0x2c |= 0x00; //BIT[0-1] (ANY_MOT_DUR<1:0> + 1) samples
qma7981_write_reg(0x18, reg_0x18);
qma7981_write_reg(0x1a, reg_0x1a);
qma7981_write_reg(0x2c, reg_0x2c);
//qma7981_write_reg(0x2e, 0x14); // 0.488*16*20 = 156mg
//qma7981_write_reg(0x2e, 0x80); // 0.488*16*128 = 1g
//qma7981_write_reg(0x2e, 0xa0); // 0.488*16*160 = 1.25g
//qma7981_write_reg(0x2e, 0x60); // 0.488*16*96 = 750mg
//qma7981_write_reg(0x2e, 0x40); // 0.488*16*64 = 500mg
//qma7981_write_reg(0x2e, 0x20); // 0.488*16*32 = 250mg
qma7981_write_reg(0x2e, 0x40); // 0.488*16*64 = 500mg
#if defined(QMA7981_ABNORMAL_SHAKE_CHECK)
reg_0x10 = 0xe0; // ODR: 65hz 15.48 ms
qma7981_write_reg(0x10, reg_0x10);
QMA7981_set_range(QMA7981_RANGE_8G);
qma7981_write_reg(0x2e, 0x60); // 0.977*16*96 = 1500mg
#endif
#if defined(QMA7981_SIGNIFICANT_MOTION)
//SIG_MOT_TPROOF [BIT4-5]<1:0>: 00: T_PROOF=0.25s, 01: T_PROOF=0.5s, 10: T_PROOF=1s, 11: T_PROOF=2s
//SIG_MOT_TSKIP[BIT2-3]<1:0>: 00: T_SKIP=1.5s, 01: T_SKIP=3s, 10: T_SKIP=6s, 11: T_SKIP=12s
//SIG_MOT_SEL: 1: select significant motion interrupt , 0: select any motion interrupt
//qma7981_write_reg(0x2f, 0x0c|0x01);
qma7981_write_reg(0x2f, 0x01); // bit0 1 significant motion, 0: any motion.
reg_0x19 |= 0x01;
qma7981_write_reg(0x19, reg_0x19);
#e
华大HC32系列读取QMA7981.zip
5星 · 超过95%的资源 需积分: 47 77 浏览量
2021-02-15
11:44:54
上传
评论 4
收藏 7KB ZIP 举报
资深技术男
- 粉丝: 9
- 资源: 13
最新资源
- 2%EF%BC%9A%E9%99%95%E8%A5%BF%E
- yyspdz62_944.apk
- SAP公司间采购EDI配置-如何触发自动MIRO.docx
- python197基于图像识别的仪表实时监控系统.rar
- I2C驱动SHT30温湿度传感器和LCD12864使用例程(RSCG12864B)
- python193中学地理-中国的江河湖泊教学网(django).rar
- python191基于时间序列分析的大气污染预测软件(django).rar
- python190基于人脸识别智能化小区门禁管理系统.rar
- python189某医院体检挂号系统.rar
- python179的企业物流管理系统(django).rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论1