|
|
/**
* @file qma7981.c * @brief * @version 0.1 * @date 2021-09-01 * * @copyright Copyright (c) 2021 * */
// #include "bsp_i2c.h"
#include "esp_err.h"
#include "esp_log.h"
#include "i2c_bus.h"
#include "qma7981.h"
#define QMA7981_REG_CHIP_ID 0x00
#define QMA7981_REG_DX_L 0x01
#define QMA7981_REG_DX_H 0x02
#define QMA7981_REG_DY_L 0x03
#define QMA7981_REG_DY_H 0x04
#define QMA7981_REG_DZ_L 0x05
#define QMA7981_REG_DZ_H 0x06
#define QMA7981_REG_STEP_L 0x07
#define QMA7981_REG_STEP_H 0x08
#define QMA7981_REG_INT_STAT_0 0x0A
#define QMA7981_REG_INT_STAT_1 0x0B
#define QMA7981_REG_INT_STAT_4 0x0D
#define QMA7981_REG_RANGE 0x0F
#define QMA7981_REG_BAND_WIDTH 0x10
#define QMA7981_REG_PWR_MANAGE 0x11
#define QMA7981_REG_STEP_CONF_0 0x12
#define QMA7981_REG_STEP_CONF_1 0x13
#define QMA7981_REG_STEP_CONF_2 0x14
#define QMA7981_REG_STEP_CONF_3 0x15
#define QMA7981_REG_INT_EN_0 0x16
#define QMA7981_REG_INT_EN_1 0x17
#define QMA7981_REG_INT_MAP_0 0x19
#define QMA7981_REG_INT_MAP_1 0x1A
#define QMA7981_REG_INT_MAP_2 0x1B
#define QMA7981_REG_INT_MAP_3 0x1C
#define QMA7981_REG_SIG_STEP_TH 0x1D
#define QMA7981_REG_STEP 0x1F
static const char *TAG = "qma7981"; static qma_range_t qma_range = QMA_RANGE_2G; static i2c_bus_device_handle_t qma7981_handle; static i2c_bus_handle_t i2c_bus_handle;
/**
* @brief * * @param reg_addr * @param data * @return esp_err_t */ static esp_err_t qma7981_read_byte(uint8_t reg_addr, uint8_t *data) { return i2c_bus_read_byte(qma7981_handle, reg_addr, data); }
static esp_err_t qma7981_write_byte(uint8_t reg_addr, uint8_t data) { return i2c_bus_write_byte(qma7981_handle, reg_addr, data); }
static esp_err_t qma7981_read_bytes(uint8_t reg_addr, size_t data_len, uint8_t *data) { return i2c_bus_read_bytes(qma7981_handle, reg_addr, data_len, data); }
esp_err_t qma7981_init(void) { if (NULL != qma7981_handle) { return ESP_FAIL; }
esp_err_t ret_val = ESP_OK;
uint32_t clk_speed = 400000;
i2c_config_t conf = { .mode = I2C_MODE_MASTER, .scl_io_num = 5, .sda_io_num = 4, .scl_pullup_en = GPIO_PULLUP_ENABLE, .sda_pullup_en = GPIO_PULLUP_ENABLE, .master.clk_speed = clk_speed, };
i2c_bus_handle = i2c_bus_create(0, &conf); assert(i2c_bus_handle != NULL);
qma7981_handle = i2c_bus_device_create(i2c_bus_handle, 0x12, clk_speed); assert(qma7981_handle != NULL);
uint8_t id = 0; ret_val |= qma7981_read_byte(0x00, &id); ESP_LOGW(TAG, "ID : %02X", id);
/* ******************************** ******************************** */ ret_val |= qma7981_write_byte(QMA7981_REG_PWR_MANAGE, 0xC0); /* Exit sleep mode*/ vTaskDelay(pdMS_TO_TICKS(20)); ret_val |= qma7981_write_byte(QMA7981_REG_RANGE, QMA_RANGE_2G); /* Set range */ ret_val |= qma7981_write_byte(QMA7981_REG_BAND_WIDTH, QMA_BANDWIDTH_1024_HZ); /* Set bandwidth */ /* ******************************** ******************************** */
return ret_val; }
esp_err_t qma7981_get_step(uint16_t *data) { esp_err_t ret_val = ESP_OK; uint8_t step_h = 0, step_l = 0;
if (NULL == data) { return ESP_ERR_INVALID_ARG; }
ret_val |= qma7981_read_byte(0x07, &step_l); ret_val |= qma7981_read_byte(0x08, &step_h);
*data = (step_h << 8) + step_l;
return ret_val; }
/**
* @brief * * @param range * @return esp_err_t */ esp_err_t qma7981_set_range(qma_range_t range) { esp_err_t ret_val = qma7981_write_byte(QMA7981_REG_RANGE, range); qma_range = range;
return ret_val; }
/**
* @brief * * @param x * @param y * @param z * @return esp_err_t */ esp_err_t qma7981_get_acce(float *x, float *y, float *z) { float multiple = 2; esp_err_t ret_val = ESP_OK; struct qma_acce_data_t { int16_t x; int16_t y; int16_t z; } data;
switch (qma_range) { case QMA_RANGE_2G: multiple = 2; break; case QMA_RANGE_4G: multiple = 4; break; case QMA_RANGE_8G: multiple = 8; break; case QMA_RANGE_16G: multiple = 16; break; case QMA_RANGE_32G: multiple = 32; break; default: multiple = 2; break; }
ret_val |= qma7981_read_bytes(QMA7981_REG_DX_L, 6, &data);
/* QMA7981's range is 14 bit. Adjust data format */ data.x >>= 2; data.y >>= 2; data.z >>= 2;
/* Convert to acceleration of gravity */ *x = data.x / (float)(1 << 13) * multiple; *y = data.y / (float)(1 << 13) * multiple; *z = data.z / (float)(1 << 13) * multiple;
return ret_val; }
|