KX022-1020(罗姆-加速度传感器)示例

概述
        做个笔录,最近项目使用了此款gsensor,实现了简单示例

一、环境
        硬件平台(RTL8762DK)
        IDE:keil5.29

1)、原理图
  

二、代码:
1、kx022.h

#include "rtl876x_i2c_wristband.h"
#include "os_timer.h"
#include "os_sched.h"
#include "stdio.h"
#define        KX022_7BITI2C_ADDRESS     0x1E
#define        KX022_CHIP_ID            0x0F
#define        KX022_XOUT_L            0x06    
#define        KX022_CNTL1                0x18
#define        KX022_CNTL2                0x3B
#define        KX022_CNTL3                0x1A
#define      KX022_ODCNTL            0x1B
#define        KX022_CTRL_REG1            0x19
#define      KX022_TILT_TIMER        0x22
#define      KX022_WUFC                0x23
 
#define      KX022_INS2                0x13
#define      KX022_INT_REL            0x17
#define      KX022_INC1                0x1C
#define      KX022_INC2                0x1D
#define      KX022_INC4                0x1F
#define      KX022_ATH                0x30

2、kx022.c

void KX022_1020_Delay_ms(uint16_t delay_time)
{
    os_delay(delay_time);
}
 
uint8_t KX022_1020_I2C_Write(uint8_t reg, uint8_t dat)
{
    uint8_t I2C_WriteBuf[2] = {0x0, 0x0};
    I2C_WriteBuf[0] = reg;
    I2C_WriteBuf[1] = dat;
    uint32_t time_out = SYSTEM_IIC_TIMEROUT;
    while ((I2C_GetFlagState(HRS_I2C_BUS, I2C_FLAG_TFE) == RESET) && (--time_out != 0));
    time_out = SYSTEM_IIC_TIMEROUT;
    while ((I2C_GetFlagState(HRS_I2C_BUS, I2C_FLAG_MST_ACTIVITY) == SET) && (--time_out != 0));
    I2C_SetSlaveAddress(HRS_I2C_BUS, KX022_7BITI2C_ADDRESS);
    I2C_MasterWrite(HRS_I2C_BUS, I2C_WriteBuf, 2);
    
    if (time_out == 0) {
        RtkWristbandSys.flag_field.i2c_bus_lock = true;
    }
    return 0;
}
 
uint8_t KX022_1020_I2C_Read(uint8_t reg, uint8_t *buf, uint8_t len)
{
    uint8_t tmp_buffer[1] = {0};
    uint32_t time_out = SYSTEM_IIC_TIMEROUT;
    
    tmp_buffer[0] = reg;
    while ((I2C_GetFlagState(HRS_I2C_BUS, I2C_FLAG_TFE) == RESET) && (--time_out != 0));
    time_out = SYSTEM_IIC_TIMEROUT;
    while ((I2C_GetFlagState(HRS_I2C_BUS, I2C_FLAG_MST_ACTIVITY) == SET) && (--time_out != 0));
    
    I2C_SetSlaveAddress(HRS_I2C_BUS, KX022_7BITI2C_ADDRESS);
        
    I2C_Status ret = I2C_RepeatRead(HRS_I2C_BUS, tmp_buffer, 1, buf, len);
    
    if (time_out == 0) {
        RtkWristbandSys.flag_field.i2c_bus_lock = true;
    }
    
    if (ret != I2C_Success) {
        return 1;
    }
    return 0;
}
 
uint8_t KX022_1020_Write_Reg(uint8_t regAddr, uint8_t data)
{
    return KX022_1020_I2C_Write(regAddr, data);
}
 
uint8_t KX022_1020_Read_Reg(uint8_t regAddr, uint8_t *buf)
{
    return KX022_1020_I2C_Read(regAddr, buf, 1);
}
 
uint8_t KX022_1020_MultiRead_Reg(uint8_t regAddr, uint8_t *buf, uint8_t len)
{    
    return KX022_1020_I2C_Read(regAddr, buf, len);
}
 
void * m_kx022_gsensor_timer = NULL;
#define     ACCELERATION    16384                //In terms of acceleration
 
void kx022_getData(int16_t *outData)
{
    uint8_t  data_reg[6] = {0};
            
    /* Read register data */
    KX022_1020_MultiRead_Reg(KX022_XOUT_L, data_reg, 6);
    
    /* Get high 16bits data */
    outData[0] = (int16_t)(data_reg[0] | data_reg[1] << 8);    
    outData[1] = (int16_t)(data_reg[2] | data_reg[3] << 8);            
    outData[2] = (int16_t)(data_reg[4] | data_reg[5] << 8); 
}
 
 
static void kx022_timerout_handler(void *pxTimer)
{    
    #if 0
    T_IO_MSG sensor_msg = {.type = HUB_MSG_GSENSOR, .subtype = GSENSOR_MSG_DEBUG,};
    send_msg_to_hub_task(&sensor_msg, __LINE__);
    #else
    
    float accX;
    float accY;
    float accZ;
    int16_t acc_data[3] = {0};
    
    kx022_getData(acc_data);
    
    DBG_LOG("*2* acc_x:%d, acc_y:%d, acc_z:%d", acc_data[0], acc_data[1], acc_data[2]);    
 
    accX = (float)acc_data[0]/ACCELERATION;    
    accY = (float)acc_data[1]/ACCELERATION;    
    accZ = (float)acc_data[2]/ACCELERATION;    
        
    DBG_LOG("*3* ax:%f, ay:%f, az:%f", accX, accY, accZ);    
    
    #endif
}
 
static void kx022_wake_up_init(void)
{
    uint8_t int_rel;
    DBG_LOG("kx02x wake_up_init init");
    KX022_1020_Write_Reg(KX022_CNTL1,0x00);   //CNTL1 0x18 standby
    KX022_1020_Delay_ms(30);          // delay 30ms
    KX022_1020_Write_Reg(KX022_CNTL3,0x06); //CNTL3 0x1A 0x06  motion detect 50HZ ODR
    KX022_1020_Write_Reg(KX022_INC2,0x7f);  //INC2 0x1D  0x7F enable 6
    KX022_1020_Write_Reg(KX022_WUFC,0x02);  //WUFC 0x23 0x02  wakeup delay time
    KX022_1020_Write_Reg(KX022_ATH,0x02);   //ATH  0x30 0x02  wakeup 
    KX022_1020_Write_Reg(KX022_INC1,0x30);  //INC1 0x1C 0x30  enable INT1 pin
    KX022_1020_Write_Reg(KX022_INC4,0x02);  //INC4 0x1F 0x02  wakeup INT1 pin
    KX022_1020_Read_Reg(KX022_INT_REL, &int_rel);  //INT_REL 0x17 
    KX022_1020_Write_Reg(KX022_CNTL1,0xc2); //CNTL1 0x18 0xc2, ,+/-2g, enable wakeup 
}
 
static void kx022_wake_up_check(void)
{
    uint8_t ins2_value, int_rel;
    
    KX022_1020_Read_Reg(KX022_INS2, &ins2_value);  //INS2(0x13),bit1 1:0
    DBG_LOG("ins2_value = %d", ins2_value);
 
    if(ins2_value & 0x02) {
        DBG_LOG("ins2_value = %d", ins2_value);
    }
    
    KX022_1020_Read_Reg(KX022_INT_REL, &int_rel);  //INT_REL 0x17 
}
 
static void kx022_sleep(void)
{
    
}
 
static void kx022_gsensor_init(void)
{
    uint8_t KX022_ID = 0;
    KX022_1020_Read_Reg(KX022_CHIP_ID, &KX022_ID);
    
    if (KX022_ID != 0x14) {
        DBG_LOG("* gsensor kx022_chip_Fail: 0x%x", KX022_ID);    
    } 
    
    DBG_LOG("* gsensor kx022_chip_id: 0x%x", KX022_ID);    
 
    DBG_LOG("testData:%f, %.2f, %.2f, %.2f", 1.222, -0.121, 0.001123, 100.0011333);
 
 
    #if 0
    KX022_1020_Write_Reg(KX022_CNTL1, 0x00);
    KX022_1020_Delay_ms(30);
    KX022_1020_Write_Reg(KX022_ODCNTL, 0x03);
    KX022_1020_Write_Reg(KX022_CNTL1, 0xc0);
    KX022_1020_Delay_ms(50);    
    #else
    KX022_1020_Write_Reg(KX022_CNTL1, 0x00);
    KX022_1020_Delay_ms(30);
    KX022_1020_Write_Reg(KX022_CNTL1, 0x41);//2g
    KX022_1020_Delay_ms(5);
    KX022_1020_Write_Reg(KX022_ODCNTL, 0x02);
    KX022_1020_Delay_ms(5);
    KX022_1020_Write_Reg(KX022_CNTL3, 0xD8);
    KX022_1020_Delay_ms(5);
    KX022_1020_Write_Reg(KX022_TILT_TIMER, 0x01);
    KX022_1020_Delay_ms(5);
    KX022_1020_Write_Reg(KX022_CNTL1, 0xc1);
    KX022_1020_Delay_ms(30);    
    #endif
}
 
static void kx022_gsensor_timer_create(void)
{
    if (m_kx022_gsensor_timer == NULL) {
        os_timer_create(&m_kx022_gsensor_timer, "m_kx022_gsensor_timer", 1, 500, true, kx022_timerout_handler);
    }
    os_timer_start(&m_kx022_gsensor_timer);
}

三、运行结果:


四、总结
        希望能帮助到有用的人。
————————————————
版权声明:本文为CSDN博主「Ch_champion」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36075612/article/details/123410833

现代人几乎人手都一大串的钥匙, 家里门锁钥匙、汽车钥匙、机车钥匙、防盗锁钥匙…等, 非常的重!!如果不小心遗失了, 重打钥匙也是一件很累人的事。蓝芽E-Lock应用, 利用现在人手一支的手机, 搭配APP与蓝芽遥控器方式来取代传统钥匙锁。减少了带一大串钥匙的麻烦, 遗失状况发生时, 再透过手机APP的使用者认证就可回复继续使用。 规格及功能 操作:下载APP软体, 搜寻柜锁并设定名称&密码, 无限授权其他人使用 增加遥控器控制功能,每组柜锁可以选配“16只遥控器(需配对)” 纪录:可纪录开关锁次数达2048笔 耗电量:约80uA 安全性:三道解密程序 忘记密码:锁内部有一颗还原KEY, 用来回复原厂设定 具有通讯传输资料加密解密,密码为16 bytes长度每byte资料范围为0x00~0xFF 1组主管理密码可以管理4组副使用者密码,副使用者不可更改主管理者密码与自身密码,做到完全防盗与超高安全性 ► 产品实体图 ► 方案方块图 ► 核心技术优势 CPU处理器 - ARM Cortex-M0@53MHz 更大的暂存容量 - 64KByte RAM - 256kByte Embedded Flash - 384kByte ROM - 2kByte Efuse 高速的传输能力与更好的RF敏感度 - Throughput:Up to 75KB/s - RX Sensitivity : -95dBm@3V 更小的包装与更低的功耗 - Chip Size : 5 x 5 mm - Power Consumption : Less than 1uA 更多的GPIOs(x16)设置 - Key Scan / IR (TX&RX) / Quad Dec / RTC / LPCOMP - I2C x 2 / SPI x 2 / Timer x 6 - ADC / GDMA / WDT - UART (Data、HCI、Log) 蓝牙规范 - Support BlueTooth 4.2 Low Energy ► 方案规格 蓝牙标准(Bluetooth Standard) - V4.2 LE Specifcation 调变方式(Modulation Scheme) - GFSK、MSK 资料速率(Data Rate) - 1Mbps、2Mbps 资料加密(Data Encryption) - AES 128 bit 射频频率范围(RF Frequency Range) - 2.402 ~ 2.480 GHz 功耗(Power Consumption) - RX : 17.5 mA - TX : 18.3 mA(0dbm) - 4us Wake-Up : 270uA - Sleep Timer On : 1uA - External Interrupts : 0.5uA 温度(Temperature) - Storage : -30 ~ 85°C - Operating : 0 ~ 70°C 方案来源于大大通。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值