You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
4.3 KiB

3 years ago
  1. /**
  2. * @file qma7981.c
  3. * @brief
  4. * @version 0.1
  5. * @date 2021-09-01
  6. *
  7. * @copyright Copyright (c) 2021
  8. *
  9. */
  10. // #include "bsp_i2c.h"
  11. #include "esp_err.h"
  12. #include "esp_log.h"
  13. #include "i2c_bus.h"
  14. #include "qma7981.h"
  15. #define QMA7981_REG_CHIP_ID 0x00
  16. #define QMA7981_REG_DX_L 0x01
  17. #define QMA7981_REG_DX_H 0x02
  18. #define QMA7981_REG_DY_L 0x03
  19. #define QMA7981_REG_DY_H 0x04
  20. #define QMA7981_REG_DZ_L 0x05
  21. #define QMA7981_REG_DZ_H 0x06
  22. #define QMA7981_REG_STEP_L 0x07
  23. #define QMA7981_REG_STEP_H 0x08
  24. #define QMA7981_REG_INT_STAT_0 0x0A
  25. #define QMA7981_REG_INT_STAT_1 0x0B
  26. #define QMA7981_REG_INT_STAT_4 0x0D
  27. #define QMA7981_REG_RANGE 0x0F
  28. #define QMA7981_REG_BAND_WIDTH 0x10
  29. #define QMA7981_REG_PWR_MANAGE 0x11
  30. #define QMA7981_REG_STEP_CONF_0 0x12
  31. #define QMA7981_REG_STEP_CONF_1 0x13
  32. #define QMA7981_REG_STEP_CONF_2 0x14
  33. #define QMA7981_REG_STEP_CONF_3 0x15
  34. #define QMA7981_REG_INT_EN_0 0x16
  35. #define QMA7981_REG_INT_EN_1 0x17
  36. #define QMA7981_REG_INT_MAP_0 0x19
  37. #define QMA7981_REG_INT_MAP_1 0x1A
  38. #define QMA7981_REG_INT_MAP_2 0x1B
  39. #define QMA7981_REG_INT_MAP_3 0x1C
  40. #define QMA7981_REG_SIG_STEP_TH 0x1D
  41. #define QMA7981_REG_STEP 0x1F
  42. static const char *TAG = "qma7981";
  43. static qma_range_t qma_range = QMA_RANGE_2G;
  44. static i2c_bus_device_handle_t qma7981_handle;
  45. static i2c_bus_handle_t i2c_bus_handle;
  46. /**
  47. * @brief
  48. *
  49. * @param reg_addr
  50. * @param data
  51. * @return esp_err_t
  52. */
  53. static esp_err_t qma7981_read_byte(uint8_t reg_addr, uint8_t *data)
  54. {
  55. return i2c_bus_read_byte(qma7981_handle, reg_addr, data);
  56. }
  57. static esp_err_t qma7981_write_byte(uint8_t reg_addr, uint8_t data)
  58. {
  59. return i2c_bus_write_byte(qma7981_handle, reg_addr, data);
  60. }
  61. static esp_err_t qma7981_read_bytes(uint8_t reg_addr, size_t data_len, uint8_t *data)
  62. {
  63. return i2c_bus_read_bytes(qma7981_handle, reg_addr, data_len, data);
  64. }
  65. esp_err_t qma7981_init(void)
  66. {
  67. if (NULL != qma7981_handle)
  68. {
  69. return ESP_FAIL;
  70. }
  71. esp_err_t ret_val = ESP_OK;
  72. uint32_t clk_speed = 400000;
  73. i2c_config_t conf = {
  74. .mode = I2C_MODE_MASTER,
  75. .scl_io_num = 5,
  76. .sda_io_num = 4,
  77. .scl_pullup_en = GPIO_PULLUP_ENABLE,
  78. .sda_pullup_en = GPIO_PULLUP_ENABLE,
  79. .master.clk_speed = clk_speed,
  80. };
  81. i2c_bus_handle = i2c_bus_create(0, &conf);
  82. assert(i2c_bus_handle != NULL);
  83. qma7981_handle = i2c_bus_device_create(i2c_bus_handle, 0x12, clk_speed);
  84. assert(qma7981_handle != NULL);
  85. uint8_t id = 0;
  86. ret_val |= qma7981_read_byte(0x00, &id);
  87. ESP_LOGW(TAG, "ID : %02X", id);
  88. /* ******************************** ******************************** */
  89. ret_val |= qma7981_write_byte(QMA7981_REG_PWR_MANAGE, 0xC0); /* Exit sleep mode*/
  90. vTaskDelay(pdMS_TO_TICKS(20));
  91. ret_val |= qma7981_write_byte(QMA7981_REG_RANGE, QMA_RANGE_2G); /* Set range */
  92. ret_val |= qma7981_write_byte(QMA7981_REG_BAND_WIDTH, QMA_BANDWIDTH_1024_HZ); /* Set bandwidth */
  93. /* ******************************** ******************************** */
  94. return ret_val;
  95. }
  96. esp_err_t qma7981_get_step(uint16_t *data)
  97. {
  98. esp_err_t ret_val = ESP_OK;
  99. uint8_t step_h = 0, step_l = 0;
  100. if (NULL == data)
  101. {
  102. return ESP_ERR_INVALID_ARG;
  103. }
  104. ret_val |= qma7981_read_byte(0x07, &step_l);
  105. ret_val |= qma7981_read_byte(0x08, &step_h);
  106. *data = (step_h << 8) + step_l;
  107. return ret_val;
  108. }
  109. /**
  110. * @brief
  111. *
  112. * @param range
  113. * @return esp_err_t
  114. */
  115. esp_err_t qma7981_set_range(qma_range_t range)
  116. {
  117. esp_err_t ret_val = qma7981_write_byte(QMA7981_REG_RANGE, range);
  118. qma_range = range;
  119. return ret_val;
  120. }
  121. /**
  122. * @brief
  123. *
  124. * @param x
  125. * @param y
  126. * @param z
  127. * @return esp_err_t
  128. */
  129. esp_err_t qma7981_get_acce(float *x, float *y, float *z)
  130. {
  131. float multiple = 2;
  132. esp_err_t ret_val = ESP_OK;
  133. struct qma_acce_data_t
  134. {
  135. int16_t x;
  136. int16_t y;
  137. int16_t z;
  138. } data;
  139. switch (qma_range)
  140. {
  141. case QMA_RANGE_2G:
  142. multiple = 2;
  143. break;
  144. case QMA_RANGE_4G:
  145. multiple = 4;
  146. break;
  147. case QMA_RANGE_8G:
  148. multiple = 8;
  149. break;
  150. case QMA_RANGE_16G:
  151. multiple = 16;
  152. break;
  153. case QMA_RANGE_32G:
  154. multiple = 32;
  155. break;
  156. default:
  157. multiple = 2;
  158. break;
  159. }
  160. ret_val |= qma7981_read_bytes(QMA7981_REG_DX_L, 6, &data);
  161. /* QMA7981's range is 14 bit. Adjust data format */
  162. data.x >>= 2;
  163. data.y >>= 2;
  164. data.z >>= 2;
  165. /* Convert to acceleration of gravity */
  166. *x = data.x / (float)(1 << 13) * multiple;
  167. *y = data.y / (float)(1 << 13) * multiple;
  168. *z = data.z / (float)(1 << 13) * multiple;
  169. return ret_val;
  170. }