bmi055_sensor.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. /*
  2. * File : bmi055_sensor.h
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2014, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2015-1-11 RT_learning the first version
  13. */
  14. #ifndef __BMI055_H__
  15. #define __BMI055_H__
  16. #include <sensor.h>
  17. /**************************************************************************************************/
  18. /************************************Register map accelerometer************************************/
  19. #define BMI055_ACC_I2C_ADDR1 0x18 //SDO is low(GND)
  20. #define BMI055_ACC_I2C_ADDR2 0x19 //SDO is high(VCC)
  21. #define BMI055_ACC_DEFAULT_ADDRESS BMI055_ACC_I2C_ADDR2 //in the LPC54102 SPM-S
  22. #define BMI055_ACC_BGW_CHIPID_VALUE 0xFA
  23. #define BMI055_ACC_BGW_CHIPID 0x00
  24. /**<Address of ACC Chip ID Register */
  25. #define BMI055_ACCD_X_LSB 0x02
  26. /**< Address of X axis ACC LSB Register */
  27. #define BMI055_ACCD_X_MSB 0x03
  28. /**< Address of X axis ACC MSB Register */
  29. #define BMI055_ACCD_Y_LSB 0x04
  30. /**< Address of Y axis ACC LSB Register */
  31. #define BMI055_ACCD_Y_MSB 0x05
  32. /**< Address of Y axis ACC MSB Register */
  33. #define BMI055_ACCD_Z_LSB 0x06
  34. /**< Address of Z axis ACC LSB Register */
  35. #define BMI055_ACCD_Z_MSB 0x07
  36. /**< Address of Z axis ACC MSB Register */
  37. #define BMI055_ACCD_TEMP 0x08
  38. /**< Address of Temperature Data Register */
  39. /* Status Register */
  40. #define BMI055_INT_STATUS_0 0x09
  41. /**< Address of Interrupt status Register 0 */
  42. #define BMI055_INT_STATUS_1 0x0A
  43. /**< Address of Interrupt status Register 1 */
  44. #define BMI055_INT_STATUS_2 0x0B
  45. /**< Address of Interrupt status Register 2 */
  46. #define BMI055_INT_STATUS_3 0x0C
  47. /**< Address of Interrupt status Register 3 */
  48. #define BMI055_FIFO_STATUS 0x0E
  49. /**< Address of FIFO status Register */
  50. /* Control Register */
  51. #define BMI055_PMU_RANGE 0x0F
  52. /**< Address of Range address Register */
  53. #define BMI055_PMU_BW 0x10
  54. /**< Address of Bandwidth Register */
  55. #define BMI055_PMU_LPW 0x11
  56. /**< Address of PMU LPW */
  57. #define BMI055_PMU_LOW_POWER 0x12
  58. /**< Address of PMU LOW POWER */
  59. #define BMI055_ACCD_HBW 0x13
  60. /**< Address of ACCD HBW */
  61. #define BMI055_BGW_SOFTRESET 0x14
  62. /**< Address of BGW SOFTRESET */
  63. #define BMI055_INT_EN_0 0x16
  64. /**< Address of interrupt engines in group 0 */
  65. #define BMI055_INT_EN_1 0x17
  66. /**< Address of interrupt engines in group 1 */
  67. #define BMI055_INT_EN_2 0x18
  68. /**< Address of interrupt engines in group 2 */
  69. #define BMI055_INT_MAP_0 0x19
  70. /**< Address of Interrupt MAP 0 */
  71. #define BMI055_INT_MAP_1 0x1A
  72. /**< Address of Interrupt MAP 1 */
  73. #define BMI055_INT_MAP_2 0x1B
  74. /**< Address of Interrupt MAP 2 */
  75. #define BMI055_INT_SRC 0x1E
  76. /**< Address of Interrupt source */
  77. #define BMI055_INT_OUT_CTRL 0x20
  78. /**< Address of Interrupt Register */
  79. #define BMI055_INT_RST_LATCH 0x21
  80. /**< Address of Interrupt reset and mode Register */
  81. #define BMI055_INT_0 0x22
  82. /**< Address of low-g Interrupt delay time Register */
  83. #define BMI055_INT_1 0x23
  84. /**< Address of low-g Interrupt threshold Register */
  85. #define BMI055_INT_2 0x24
  86. /**< Address of Interrupt 2 Register */
  87. #define BMI055_INT_3 0x25
  88. /**< Address of high-g Interrupt delay time Register */
  89. #define BMI055_INT_4 0x26
  90. /**< Address of high-g Interrupt threshold Register */
  91. #define BMI055_INT_5 0x27
  92. /**< Address of high-g Interrupt 5 Register */
  93. #define BMI055_INT_6 0x28
  94. /**< Address of any-motion Interrupt threshold Register */
  95. #define BMI055_INT_7 0x29
  96. /**< Address of slow/no-motion interrupt threshold Register */
  97. #define BMI055_INT_8 0x2A
  98. /**< Address of high-g Interrupt 8 Register */
  99. #define BMI055_INT_9 0x2B
  100. /**< Address of high-g Interrupt 9 Register */
  101. #define BMI055_INT_A 0x2C
  102. /**< Address of Interrupt A Register */
  103. #define BMI055_INT_B 0x2D
  104. /**< Address of Interrupt B Register */
  105. #define BMI055_INT_C 0x2E
  106. /**< Address of Interrupt C Register */
  107. #define BMI055_INT_D 0x2F
  108. /**< Address of Interrupt D Register */
  109. #define BMI055_FIFO_CONFIG_0 0x30
  110. /**< Address of FIFO CONFIG 0 Register */
  111. #define BMI055_PMU_SELF_TEST 0x32
  112. /**< Address of PMU SELF TEST Register */
  113. #define BMI055_TRIM_NVM_CTRL 0x33
  114. /**< Address of TRIM NVM CTRL Register */
  115. #define BMI055_BGW_SPI3_WDT 0x34
  116. /**< Address of BGW SPI3 WDT Register */
  117. #define BMI055_OFC_CTRL 0x36
  118. /**< Address of OFC CTRL Register */
  119. #define BMI055_OFC_SETTING 0x37
  120. /**< Address of OFC SETTING Register */
  121. #define BMI055_OFC_OFFSET_X 0x38
  122. /**< Address of OFC OFFSET X Register */
  123. #define BMI055_OFC_OFFSET_Y 0x39
  124. /**< Address of OFC OFFSET Y Register */
  125. #define BMI055_OFC_OFFSET_Z 0x3A
  126. /**< Address of OFC OFFSET Z Register */
  127. /* Trim Register */
  128. #define BMI055_TRIM_GP0 0x3B
  129. /**< Address of TRIM GP0 Register */
  130. #define BMI055_TRIM_GP1 0x3C
  131. /**< Address of TRIM GP1 Register */
  132. /* Control Register */
  133. #define BMI055_FIFO_CONFIG_1 0x3E
  134. /**< Address of FIFO CONFIG 1 Register */
  135. /* Data Register */
  136. #define BMI055_FIFO_DATA 0x3F
  137. /**< Address of FIFO DATA Register */
  138. /**************************************************************************************************/
  139. /**************************************************************************************************/
  140. /************************************Register map gyroscope****************************************/
  141. /**< This refers BMI055 return type as signed */
  142. // #define BMI055_I2C_ADDR1 0x68 //SDO is low(GND)
  143. // #define BMI055_I2C_ADDR2 0x69 //SDO is high(VCC)
  144. #define BMI055_GYRO_I2C_ADDR1 0x68 //SDO is low(GND)
  145. #define BMI055_GYRO_I2C_ADDR2 0x69 //SDO is high(VCC)
  146. #define BMI055_GYRO_DEFAULT_ADDRESS BMI055_GYRO_I2C_ADDR2
  147. #define BMI055_GRRO_CHIP_ID 0x0F
  148. /*Define of registers*/
  149. /* Hard Wired */
  150. #define BMI055_CHIP_ID_ADDR 0x00
  151. /**<Address of Chip ID Register*/
  152. /* Data Register */
  153. #define BMI055_RATE_X_LSB_ADDR 0x02
  154. /**< Address of X axis Rate LSB Register */
  155. #define BMI055_RATE_X_MSB_ADDR 0x03
  156. /**< Address of X axis Rate MSB Register */
  157. #define BMI055_RATE_Y_LSB_ADDR 0x04
  158. /**< Address of Y axis Rate LSB Register */
  159. #define BMI055_RATE_Y_MSB_ADDR 0x05
  160. /**< Address of Y axis Rate MSB Register */
  161. #define BMI055_RATE_Z_LSB_ADDR 0x06
  162. /**< Address of Z axis Rate LSB Register */
  163. #define BMI055_RATE_Z_MSB_ADDR 0x07
  164. /**< Address of Z axis Rate MSB Register */
  165. #define BMI055_TEMP_ADDR 0x08
  166. /**< Address of Temperature Data LSB Register */
  167. /* Status Register */
  168. #define BMI055_INTR_STAT0_ADDR 0x09
  169. /**< Address of Interrupt status Register 0 */
  170. #define BMI055_INTR_STAT1_ADDR 0x0A
  171. /**< Address of Interrupt status Register 1 */
  172. #define BMI055_INTR_STAT2_ADDR 0x0B
  173. /**< Address of Interrupt status Register 2 */
  174. #define BMI055_INTR_STAT3_ADDR 0x0C
  175. /**< Address of Interrupt status Register 3 */
  176. #define BMI055_FIFO_STAT_ADDR 0x0E
  177. /**< Address of FIFO status Register */
  178. /* Control Register */
  179. #define BMI055_RANGE_ADDR 0x0F
  180. /**< Address of Range address Register */
  181. #define BMI055_BW_ADDR 0x10
  182. /**< Address of Bandwidth Register */
  183. #define BMI055_MODE_LPM1_ADDR 0x11
  184. /**< Address of Mode LPM1 Register */
  185. #define BMI055_MODE_LPM2_ADDR 0x12
  186. /**< Address of Mode LPM2 Register */
  187. #define BMI055_HIGH_BW_ADDR 0x13
  188. /**< Address of Rate HIGH_BW Register */
  189. #define BMI055_BGW_SOFT_RST_ADDR 0x14
  190. /**< Address of BGW Softreset Register */
  191. #define BMI055_INTR_ENABLE0_ADDR 0x15
  192. /**< Address of Interrupt Enable 0 */
  193. #define BMI055_INTR_ENABLE1_ADDR 0x16
  194. /**< Address of Interrupt Enable 1 */
  195. #define BMI055_INTR_MAP_ZERO_ADDR 0x17
  196. /**< Address of Interrupt MAP 0 */
  197. #define BMI055_INTR_MAP_ONE_ADDR 0x18
  198. /**< Address of Interrupt MAP 1 */
  199. #define BMI055_INTR_MAP_TWO_ADDR 0x19
  200. /**< Address of Interrupt MAP 2 */
  201. #define BMI055_INTR_ZERO_ADDR 0x1A
  202. /**< Address of Interrupt 0 register */
  203. #define BMI055_INTR_ONE_ADDR 0x1B
  204. /**< Address of Interrupt 1 register */
  205. #define BMI055_INTR_TWO_ADDR 0x1C
  206. /**< Address of Interrupt 2 register */
  207. #define BMI055_INTR_4_ADDR 0x1E
  208. /**< Address of Interrupt 4 register */
  209. #define BMI055_RST_LATCH_ADDR 0x21
  210. /**< Address of Reset Latch Register */
  211. #define BMI055_HIGHRATE_THRES_X_ADDR 0x22
  212. /**< Address of High Th x Address register */
  213. #define BMI055_HIGHRATE_DURN_X_ADDR 0x23
  214. /**< Address of High Dur x Address register */
  215. #define BMI055_HIGHRATE_THRES_Y_ADDR 0x24
  216. /**< Address of High Th y Address register */
  217. #define BMI055_HIGHRATE_DURN_Y_ADDR 0x25
  218. /**< Address of High Dur y Address register */
  219. #define BMI055_HIGHRATE_THRES_Z_ADDR 0x26
  220. /**< Address of High Th z Address register */
  221. #define BMI055_HIGHRATE_DURN_Z_ADDR 0x27
  222. /**< Address of High Dur z Address register */
  223. #define BMI055_SOC_ADDR 0x31
  224. /**< Address of SOC register */
  225. #define BMI055_A_FOC_ADDR 0x32
  226. /**< Address of A_FOC Register */
  227. #define BMI055_TRIM_NVM_CTRL_ADDR 0x33
  228. /**< Address of Trim NVM control register */
  229. #define BMI055_BGW_SPI3_WDT_ADDR 0x34
  230. /**< Address of BGW SPI3,WDT Register */
  231. /* Trim Register */
  232. #define BMI055_OFC1_ADDR 0x36
  233. /**< Address of OFC1 Register */
  234. #define BMI055_OFC2_ADDR 0x37
  235. /**< Address of OFC2 Register */
  236. #define BMI055_OFC3_ADDR 0x38
  237. /**< Address of OFC3 Register */
  238. #define BMI055_OFC4_ADDR 0x39
  239. /**< Address of OFC4 Register */
  240. #define BMI055_TRIM_GP0_ADDR 0x3A
  241. /**< Address of Trim GP0 Register */
  242. #define BMI055_TRIM_GP1_ADDR 0x3B
  243. /**< Address of Trim GP1 Register */
  244. #define BMI055_SELECTF_TEST_ADDR 0x3C
  245. /**< Address of BGW Self test Register */
  246. /* Control Register */
  247. #define BMI055_FIFO_CGF1_ADDR 0x3D
  248. /**< Address of FIFO CGF0 Register */
  249. #define BMI055_FIFO_CGF0_ADDR 0x3E
  250. /**< Address of FIFO CGF1 Register */
  251. /* Data Register */
  252. #define BMI055_FIFO_DATA_ADDR 0x3F
  253. /**< Address of FIFO Data Register */
  254. /**************************************************************************************************/
  255. class BMI055 :public SensorBase
  256. {
  257. public:
  258. BMI055(int sensor_type, const char* iic_bus, int addr);
  259. int read_reg(rt_uint8_t reg, rt_uint8_t* value);
  260. int write_reg(rt_uint8_t reg, rt_uint8_t value);
  261. int read_buffer(rt_uint8_t reg, rt_uint8_t* value, rt_size_t size);
  262. private:
  263. struct rt_i2c_bus_device *i2c_bus;
  264. int i2c_addr;
  265. };
  266. class BMI055_Accelerometer:public BMI055
  267. {
  268. public:
  269. BMI055_Accelerometer(const char* iic_name, int addr);
  270. virtual int configure(SensorConfig *config);
  271. virtual int activate(int enable);
  272. virtual int poll(sensors_event_t *event);
  273. virtual void getSensor(sensor_t *sensor);
  274. private:
  275. rt_int16_t x_offset, y_offset, z_offset;
  276. rt_bool_t enable;
  277. float sensitivity;
  278. };
  279. class BMI055_Gyroscope:public BMI055
  280. {
  281. public:
  282. BMI055_Gyroscope(const char* iic_name, int addr);
  283. virtual int configure(SensorConfig *config);
  284. virtual int activate(int enable);
  285. virtual int poll(sensors_event_t *event);
  286. virtual void getSensor(sensor_t *sensor);
  287. private:
  288. rt_int16_t x_offset, y_offset, z_offset;
  289. rt_bool_t enable;
  290. float sensitivity;
  291. };
  292. #endif