H3LIS331DL.cpp 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368
  1. /*
  2. H3LIS331DL.cpp
  3. A library for 3-Axis Digital Accelerometer(±400g)
  4. Copyright (c) 2014 seeed technology inc.
  5. Website : www.seeed.cc
  6. Author : lawliet zou
  7. Create Time: April 2014
  8. Change Log :
  9. The MIT License (MIT)
  10. Permission is hereby granted, free of charge, to any person obtaining a copy
  11. of this software and associated documentation files (the "Software"), to deal
  12. in the Software without restriction, including without limitation the rights
  13. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  14. copies of the Software, and to permit persons to whom the Software is
  15. furnished to do so, subject to the following conditions:
  16. The above copyright notice and this permission notice shall be included in
  17. all copies or substantial portions of the Software.
  18. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  21. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  24. THE SOFTWARE.
  25. */
  26. #include "H3LIS331DL.h"
  27. #include <Wire.h>
  28. void H3LIS331DL::init(H3LIS331DL_ODR_t odr, H3LIS331DL_Mode_t mode, H3LIS331DL_Fullscale_t fullScale) {
  29. Wire.begin();
  30. //set output data rate
  31. setODR(odr);
  32. //set PowerMode
  33. setMode(mode);
  34. //set Fullscale
  35. setFullScale(fullScale);
  36. //set axis Enable
  37. setAxis(H3LIS331DL_X_ENABLE | H3LIS331DL_Y_ENABLE | H3LIS331DL_Z_ENABLE);
  38. }
  39. void H3LIS331DL::importPara(int16_t val_x, int16_t val_y, int16_t val_z) {
  40. _adjVal[0] = val_x;
  41. _adjVal[1] = val_y;
  42. _adjVal[2] = val_z;
  43. }
  44. void H3LIS331DL::readXYZ(int16_t* x, int16_t* y, int16_t* z) {
  45. //get Acceleration Raw data
  46. AxesRaw_t data;
  47. status_t response = getAccAxesRaw(&data);
  48. if (MEMS_SUCCESS == response) {
  49. *x = (data.AXIS_X - _adjVal[0]);
  50. *y = (data.AXIS_Y - _adjVal[1]);
  51. *z = (data.AXIS_Z - _adjVal[2]);
  52. }
  53. }
  54. void H3LIS331DL::getAcceleration(double* xyz) {
  55. AxesRaw_t data;
  56. double gains = 0.003;
  57. getAccAxesRaw(&data);
  58. xyz[0] = (data.AXIS_X - _adjVal[0]) * gains;
  59. xyz[1] = (data.AXIS_Y - _adjVal[1]) * gains;
  60. xyz[2] = (data.AXIS_Z - _adjVal[2]) * gains;
  61. }
  62. /*******************************************************************************
  63. Function Name : getWHO_AM_I
  64. Description : Read identification code from H3LIS331DL::WHO_AM_I register
  65. Input : char to be filled with the Device identification Value
  66. Output : None
  67. Return : Status [value of FSS]
  68. *******************************************************************************/
  69. status_t H3LIS331DL::getWHO_AM_I(byte* val) {
  70. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_WHO_AM_I, val)) {
  71. return MEMS_ERROR;
  72. }
  73. return MEMS_SUCCESS;
  74. }
  75. /*******************************************************************************
  76. Function Name : setODR
  77. Description : Sets H3LIS331DL Accelerometer Output Data Rate
  78. Input : Output Data Rate
  79. Output : None
  80. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  81. *******************************************************************************/
  82. status_t H3LIS331DL::setODR(H3LIS331DL_ODR_t dr) {
  83. byte value;
  84. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG1, &value)) {
  85. return MEMS_ERROR;
  86. }
  87. value &= 0xE7;
  88. value |= dr << H3LIS331DL_DR;
  89. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG1, value)) {
  90. return MEMS_ERROR;
  91. }
  92. return MEMS_SUCCESS;
  93. }
  94. /*******************************************************************************
  95. Function Name : setMode
  96. Description : Sets H3LIS331DLH Accelerometer Operating Mode
  97. Input : Modality (H3LIS331DL_LOW_POWER, H3LIS331DL_NORMAL, H3LIS331DL_POWER_DOWN...)
  98. Output : None
  99. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  100. *******************************************************************************/
  101. status_t H3LIS331DL::setMode(H3LIS331DL_Mode_t pm) {
  102. byte value;
  103. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG1, &value)) {
  104. return MEMS_ERROR;
  105. }
  106. value &= 0x1F;
  107. value |= (pm << H3LIS331DL_PM);
  108. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG1, value)) {
  109. return MEMS_ERROR;
  110. }
  111. return MEMS_SUCCESS;
  112. }
  113. /*******************************************************************************
  114. Function Name : setAxis
  115. Description : Enable/Disable LIS331DLH Axis
  116. Input : H3LIS331DL_X_ENABLE/H3LIS331DL_X_DISABLE | H3LIS331DL_Y_ENABLE/H3LIS331DL_Y_DISABLE
  117. | H3LIS331DL_Z_ENABLE/H3LIS331DL_Z_DISABLE
  118. Output : None
  119. Note : You MUST use all input variable in the argument, as example
  120. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  121. *******************************************************************************/
  122. status_t H3LIS331DL::setAxis(H3LIS331DL_Axis_t axis) {
  123. byte value;
  124. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG1, &value)) {
  125. return MEMS_ERROR;
  126. }
  127. value &= 0xF8;
  128. value |= (0x07 & axis);
  129. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG1, value)) {
  130. return MEMS_ERROR;
  131. }
  132. return MEMS_SUCCESS;
  133. }
  134. /*******************************************************************************
  135. Function Name : setFullScale
  136. Description : Sets the LIS331DLH FullScale
  137. Input : H3LIS331DL_FULLSCALE_2/H3LIS331DL_FULLSCALE_4/H3LIS331DL_FULLSCALE_8
  138. Output : None
  139. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  140. *******************************************************************************/
  141. status_t H3LIS331DL::setFullScale(H3LIS331DL_Fullscale_t fs) {
  142. byte value;
  143. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, &value)) {
  144. return MEMS_ERROR;
  145. }
  146. value &= 0xCF;
  147. value |= (fs << H3LIS331DL_FS);
  148. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, value)) {
  149. return MEMS_ERROR;
  150. }
  151. return MEMS_SUCCESS;
  152. }
  153. /*******************************************************************************
  154. Function Name : setBDU
  155. Description : Enable/Disable Block Data Update Functionality
  156. Input : MEMS_ENABLE/MEMS_DISABLE
  157. Output : None
  158. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  159. *******************************************************************************/
  160. status_t H3LIS331DL::setBDU(State_t bdu) {
  161. byte value;
  162. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, &value)) {
  163. return MEMS_ERROR;
  164. }
  165. value &= 0x7F;
  166. value |= (bdu << H3LIS331DL_BDU);
  167. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, value)) {
  168. return MEMS_ERROR;
  169. }
  170. return MEMS_SUCCESS;
  171. }
  172. /*******************************************************************************
  173. Function Name : setBLE
  174. Description : Set Endianess (MSB/LSB)
  175. Input : H3LIS331DL_BLE_LSB / H3LIS331DL_BLE_MSB
  176. Output : None
  177. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  178. *******************************************************************************/
  179. status_t H3LIS331DL::setBLE(H3LIS331DL_Endianess_t ble) {
  180. byte value;
  181. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, &value)) {
  182. return MEMS_ERROR;
  183. }
  184. value &= 0xBF;
  185. value |= (ble << H3LIS331DL_BLE);
  186. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, value)) {
  187. return MEMS_ERROR;
  188. }
  189. return MEMS_SUCCESS;
  190. }
  191. /*******************************************************************************
  192. Function Name : setFDS
  193. Description : Set Filter Data Selection
  194. Input : MEMS_ENABLE/MEMS_DISABLE
  195. Output : None
  196. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  197. *******************************************************************************/
  198. status_t H3LIS331DL::setFDS(State_t fds) {
  199. byte value;
  200. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, &value)) {
  201. return MEMS_ERROR;
  202. }
  203. value &= 0xEF;
  204. value |= (fds << H3LIS331DL_FDS);
  205. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, value)) {
  206. return MEMS_ERROR;
  207. }
  208. return MEMS_SUCCESS;
  209. }
  210. /*******************************************************************************
  211. Function Name : setBOOT
  212. Description : Rebot memory content
  213. Input : MEMS_ENABLE/MEMS_DISABLE
  214. Output : None
  215. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  216. *******************************************************************************/
  217. status_t H3LIS331DL::setBOOT(State_t boot) {
  218. byte value;
  219. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, &value)) {
  220. return MEMS_ERROR;
  221. }
  222. value &= 0x7F;
  223. value |= (boot << H3LIS331DL_BOOT);
  224. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, value)) {
  225. return MEMS_ERROR;
  226. }
  227. return MEMS_SUCCESS;
  228. }
  229. /*******************************************************************************
  230. Function Name : setSelfTest
  231. Description : Set Self Test Modality
  232. Input : MEMS_DISABLE/MEMS_ENABLE
  233. Output : None
  234. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  235. *******************************************************************************/
  236. status_t H3LIS331DL::setSelfTest(State_t st) {
  237. byte value;
  238. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, &value)) {
  239. return MEMS_ERROR;
  240. }
  241. value &= 0xFD;
  242. value |= (st << H3LIS331DL_ST);
  243. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, value)) {
  244. return MEMS_ERROR;
  245. }
  246. return MEMS_SUCCESS;
  247. }
  248. /*******************************************************************************
  249. Function Name : setSelfTestSign
  250. Description : Set Self Test Sign (Disable = st_plus, Enable = st_minus)
  251. Input : MEMS_DISABLE/MEMS_ENABLE
  252. Output : None
  253. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  254. *******************************************************************************/
  255. status_t H3LIS331DL::setSelfTestSign(State_t st_sign) {
  256. byte value;
  257. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, &value)) {
  258. return MEMS_ERROR;
  259. }
  260. value &= 0xF7;
  261. value |= (st_sign << H3LIS331DL_ST_SIGN);
  262. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, value)) {
  263. return MEMS_ERROR;
  264. }
  265. return MEMS_SUCCESS;
  266. }
  267. /*******************************************************************************
  268. Function Name : setIntHighLow
  269. Description : Set Interrupt active state (Disable = active high, Enable = active low)
  270. Input : MEMS_DISABLE/MEMS_ENABLE
  271. Output : None
  272. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  273. *******************************************************************************/
  274. status_t H3LIS331DL::setIntHighLow(State_t ihl) {
  275. byte value;
  276. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, &value)) {
  277. return MEMS_ERROR;
  278. }
  279. value &= 0x7F;
  280. value |= (ihl << H3LIS331DL_IHL);
  281. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, value)) {
  282. return MEMS_ERROR;
  283. }
  284. return MEMS_SUCCESS;
  285. }
  286. /*******************************************************************************
  287. Function Name : setIntPPOD
  288. Description : Set Interrupt Push-Pull/OpenDrain Pad (Disable = Push-Pull, Enable = OpenDrain)
  289. Input : MEMS_DISABLE/MEMS_ENABLE
  290. Output : None
  291. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  292. *******************************************************************************/
  293. status_t H3LIS331DL::setIntPPOD(State_t pp_od) {
  294. byte value;
  295. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, &value)) {
  296. return MEMS_ERROR;
  297. }
  298. value &= 0xBF;
  299. value |= (pp_od << H3LIS331DL_PP_OD);
  300. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, value)) {
  301. return MEMS_ERROR;
  302. }
  303. return MEMS_SUCCESS;
  304. }
  305. /*******************************************************************************
  306. Function Name : setInt1DataSign
  307. Description : Set Data signal Interrupt 1 pad
  308. Input : Modality by H3LIS331DL_INT_Conf_t Typedef
  309. (H3LIS331DL_INT_SOURCE, H3LIS331DL_INT_1OR2_SOURCE, H3LIS331DL_DATA_READY, H3LIS331DL_BOOT_RUNNING)
  310. Output : None
  311. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  312. *******************************************************************************/
  313. status_t H3LIS331DL::setInt1DataSign(H3LIS331DL_INT_Conf_t i_cfg) {
  314. byte value;
  315. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, &value)) {
  316. return MEMS_ERROR;
  317. }
  318. value &= 0xFC;
  319. value |= (i_cfg << H3LIS331DL_I1_CFG);
  320. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, value)) {
  321. return MEMS_ERROR;
  322. }
  323. return MEMS_SUCCESS;
  324. }
  325. /*******************************************************************************
  326. Function Name : setInt2DataSign
  327. Description : Set Data signal Interrupt 2 pad
  328. Input : Modality by H3LIS331DL_INT_Conf_t Typedef
  329. (H3LIS331DL_INT_SOURCE, H3LIS331DL_INT_1OR2_SOURCE, H3LIS331DL_DATA_READY, H3LIS331DL_BOOT_RUNNING)
  330. Output : None
  331. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  332. *******************************************************************************/
  333. status_t H3LIS331DL::setInt2DataSign(H3LIS331DL_INT_Conf_t i_cfg) {
  334. byte value;
  335. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, &value)) {
  336. return MEMS_ERROR;
  337. }
  338. value &= 0xE7;
  339. value |= (i_cfg << H3LIS331DL_I2_CFG);
  340. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, value)) {
  341. return MEMS_ERROR;
  342. }
  343. return MEMS_SUCCESS;
  344. }
  345. /*******************************************************************************
  346. Function Name : setSPI34Wire
  347. Description : Set SPI mode
  348. Input : Modality by H3LIS331DL_SPIMode_t Typedef (H3LIS331DL_SPI_4_WIRE, H3LIS331DL_SPI_3_WIRE)
  349. Output : None
  350. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  351. *******************************************************************************/
  352. status_t H3LIS331DL::setSPI34Wire(H3LIS331DL_SPIMode_t sim) {
  353. byte value;
  354. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, &value)) {
  355. return MEMS_ERROR;
  356. }
  357. value &= 0xFE;
  358. value |= (sim << H3LIS331DL_SIM);
  359. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, value)) {
  360. return MEMS_ERROR;
  361. }
  362. return MEMS_SUCCESS;
  363. }
  364. /*******************************************************************************
  365. Function Name : turnONEnable
  366. Description : TurnON Mode selection for sleep to wake function
  367. Input : H3LIS331DL_SLEEP_TO_WAKE_DIS/H3LIS331DL_SLEEP_TO_WAKE_ENA
  368. Output : None
  369. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  370. *******************************************************************************/
  371. status_t H3LIS331DL::turnONEnable(H3LIS331DL_Sleep_To_Wake_Conf_t stw) {
  372. byte value;
  373. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG5, &value)) {
  374. return MEMS_ERROR;
  375. }
  376. value &= 0x00;
  377. value |= (stw << H3LIS331DL_TURN_ON);
  378. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG5, value)) {
  379. return MEMS_ERROR;
  380. }
  381. return MEMS_SUCCESS;
  382. }
  383. #if 0
  384. /*******************************************************************************
  385. Function Name : HPFilterReset
  386. Description : Reading register for reset the content of internal HP filter
  387. Input : None
  388. Output : None
  389. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  390. *******************************************************************************/
  391. status_t H3LIS331DL::HPFilterReset(void) {
  392. byte value;
  393. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_HP_FILTER_RESET, &value)) {
  394. return MEMS_ERROR;
  395. }
  396. return MEMS_SUCCESS;
  397. }
  398. #endif
  399. /*******************************************************************************
  400. Function Name : setReference
  401. Description : Sets Reference register acceleration value as a reference for HP filter
  402. Input : Value of reference acceleration value (0-255)
  403. Output : None
  404. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  405. *******************************************************************************/
  406. status_t H3LIS331DL::setReference(int8_t ref) {
  407. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_REFERENCE_REG, ref)) {
  408. return MEMS_ERROR;
  409. }
  410. return MEMS_SUCCESS;
  411. }
  412. /*******************************************************************************
  413. Function Name : setHPFMode
  414. Description : Set High Pass Filter Modality
  415. Input : H3LIS331DL_HPM_NORMAL_MODE_RES/H3LIS331DL_HPM_REF_SIGNAL/H3LIS331DL_HPM_NORMAL_MODE
  416. Output : None
  417. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  418. *******************************************************************************/
  419. status_t H3LIS331DL::setHPFMode(H3LIS331DL_HPFMode_t hpm) {
  420. byte value;
  421. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, &value)) {
  422. return MEMS_ERROR;
  423. }
  424. value &= 0x9F;
  425. value |= (hpm << H3LIS331DL_HPM);
  426. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, value)) {
  427. return MEMS_ERROR;
  428. }
  429. return MEMS_SUCCESS;
  430. }
  431. /*******************************************************************************
  432. Function Name : setHPFCutOFF
  433. Description : Set High Pass CUT OFF Freq
  434. Input : H3LIS331DL_HPFCF [0,3]
  435. Output : None
  436. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  437. *******************************************************************************/
  438. status_t H3LIS331DL::setHPFCutOFF(H3LIS331DL_HPFCutOffFreq_t hpf) {
  439. byte value;
  440. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, &value)) {
  441. return MEMS_ERROR;
  442. }
  443. value &= 0xFC;
  444. value |= (hpf << H3LIS331DL_HPCF);
  445. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, value)) {
  446. return MEMS_ERROR;
  447. }
  448. return MEMS_SUCCESS;
  449. }
  450. /*******************************************************************************
  451. Function Name : setInt2HPEnable
  452. Description : Set Interrupt2 hp filter enable/disable
  453. Input : MEMS_ENABLE/MEMS_DISABLE
  454. example : H3LIS331DL_SetInt2HPEnable(MEMS_ENABLE)
  455. Output : None
  456. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  457. *******************************************************************************/
  458. status_t H3LIS331DL::setInt2HPEnable(State_t stat) {
  459. byte value;
  460. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, &value)) {
  461. return MEMS_ERROR;
  462. }
  463. value &= 0xF7;
  464. value |= stat << H3LIS331DL_HPEN2 ;
  465. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, value)) {
  466. return MEMS_ERROR;
  467. }
  468. return MEMS_SUCCESS;
  469. }
  470. /*******************************************************************************
  471. Function Name : setInt1HPEnable
  472. Description : Set Interrupt1 hp filter enable/disable
  473. Input : MEMS_ENABLE/MEMS_DISABLE
  474. example : H3LIS331DL_SetInt1HPEnable(MEMS_ENABLE)
  475. Output : None
  476. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  477. *******************************************************************************/
  478. status_t H3LIS331DL::setInt1HPEnable(State_t stat) {
  479. byte value;
  480. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, &value)) {
  481. return MEMS_ERROR;
  482. }
  483. value &= 0xFB;
  484. value |= stat << H3LIS331DL_HPEN1 ;
  485. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, value)) {
  486. return MEMS_ERROR;
  487. }
  488. return MEMS_SUCCESS;
  489. }
  490. /*******************************************************************************
  491. Function Name : int1LatchEnable
  492. Description : Enable Interrupt 1 Latching function
  493. Input : ENABLE/DISABLE
  494. Output : None
  495. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  496. *******************************************************************************/
  497. status_t H3LIS331DL::int1LatchEnable(State_t latch) {
  498. byte value;
  499. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, &value)) {
  500. return MEMS_ERROR;
  501. }
  502. value &= 0xFB;
  503. value |= latch << H3LIS331DL_LIR1;
  504. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, value)) {
  505. return MEMS_ERROR;
  506. }
  507. return MEMS_SUCCESS;
  508. }
  509. /*******************************************************************************
  510. Function Name : int2LatchEnable
  511. Description : Enable Interrupt 2 Latching function
  512. Input : ENABLE/DISABLE
  513. Output : None
  514. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  515. *******************************************************************************/
  516. status_t H3LIS331DL::int2LatchEnable(State_t latch) {
  517. byte value;
  518. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, &value)) {
  519. return MEMS_ERROR;
  520. }
  521. value &= 0xDF;
  522. value |= latch << H3LIS331DL_LIR2;
  523. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, value)) {
  524. return MEMS_ERROR;
  525. }
  526. return MEMS_SUCCESS;
  527. }
  528. /*******************************************************************************
  529. Function Name : resetInt1Latch
  530. Description : Reset Interrupt 1 Latching function
  531. Input : None
  532. Output : None
  533. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  534. *******************************************************************************/
  535. status_t H3LIS331DL::resetInt1Latch(void) {
  536. byte value;
  537. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_SRC, &value)) {
  538. return MEMS_ERROR;
  539. }
  540. return MEMS_SUCCESS;
  541. }
  542. /*******************************************************************************
  543. Function Name : resetInt2Latch
  544. Description : Reset Interrupt 2 Latching function
  545. Input : None
  546. Output : None
  547. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  548. *******************************************************************************/
  549. status_t H3LIS331DL::resetInt2Latch(void) {
  550. byte value;
  551. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_SRC, &value)) {
  552. return MEMS_ERROR;
  553. }
  554. return MEMS_SUCCESS;
  555. }
  556. /*******************************************************************************
  557. Function Name : setInt1Configuration
  558. Description : Interrupt 1 Configuration (without 6D_INT)
  559. Input : H3LIS331DL_INT_AND/OR | H3LIS331DL_INT_ZHIE_ENABLE/DISABLE | H3LIS331DL_INT_ZLIE_ENABLE/DISABLE...
  560. Output : None
  561. Note : You MUST use ALL input variable in the argument, as in example above
  562. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  563. *******************************************************************************/
  564. status_t H3LIS331DL::setInt1Configuration(H3LIS331DL_IntConf_t ic) {
  565. byte value;
  566. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_CFG, &value)) {
  567. return MEMS_ERROR;
  568. }
  569. value &= 0x40;
  570. value |= ic;
  571. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_CFG, value)) {
  572. return MEMS_ERROR;
  573. }
  574. return MEMS_SUCCESS;
  575. }
  576. /*******************************************************************************
  577. Function Name : setInt2Configuration
  578. Description : Interrupt 2 Configuration (without 6D_INT)
  579. Input : H3LIS331DL_INT_AND/OR | H3LIS331DL_INT_ZHIE_ENABLE/DISABLE | H3LIS331DL_INT_ZLIE_ENABLE/DISABLE...
  580. Output : None
  581. Note : You MUST use all input variable in the argument, as example
  582. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  583. *******************************************************************************/
  584. status_t H3LIS331DL::setInt2Configuration(H3LIS331DL_IntConf_t ic) {
  585. byte value;
  586. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_CFG, &value)) {
  587. return MEMS_ERROR;
  588. }
  589. value &= 0x40;
  590. value |= ic;
  591. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_CFG, value)) {
  592. return MEMS_ERROR;
  593. }
  594. return MEMS_SUCCESS;
  595. }
  596. /*******************************************************************************
  597. Function Name : setInt1Mode
  598. Description : Interrupt 1 Configuration mode (OR, 6D Movement, AND, 6D Position)
  599. Input : H3LIS331DL_INT_MODE_OR, H3LIS331DL_INT_MODE_6D_MOVEMENT, H3LIS331DL_INT_MODE_AND, H3LIS331DL_INT_MODE_6D_POSITION
  600. Output : None
  601. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  602. *******************************************************************************/
  603. status_t H3LIS331DL::setInt1Mode(H3LIS331DL_IntMode_t int_mode) {
  604. byte value;
  605. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_CFG, &value)) {
  606. return MEMS_ERROR;
  607. }
  608. value &= 0x3F;
  609. value |= (int_mode << H3LIS331DL_INT_6D);
  610. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_CFG, value)) {
  611. return MEMS_ERROR;
  612. }
  613. return MEMS_SUCCESS;
  614. }
  615. /*******************************************************************************
  616. Function Name : setInt2Mode
  617. Description : Interrupt 2 Configuration mode (OR, 6D Movement, AND, 6D Position)
  618. Input : H3LIS331DL_INT_MODE_OR, H3LIS331DL_INT_MODE_6D_MOVEMENT, H3LIS331DL_INT_MODE_AND, H3LIS331DL_INT_MODE_6D_POSITION
  619. Output : None
  620. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  621. *******************************************************************************/
  622. status_t H3LIS331DL::setInt2Mode(H3LIS331DL_IntMode_t int_mode) {
  623. byte value;
  624. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_CFG, &value)) {
  625. return MEMS_ERROR;
  626. }
  627. value &= 0x3F;
  628. value |= (int_mode << H3LIS331DL_INT_6D);
  629. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_CFG, value)) {
  630. return MEMS_ERROR;
  631. }
  632. return MEMS_SUCCESS;
  633. }
  634. /*******************************************************************************
  635. Function Name : get6DPositionInt1
  636. Description : 6D Interrupt 1 Position Detect
  637. Input : Byte to be filled with H3LIS331DL_POSITION_6D_t Typedef
  638. Output : None
  639. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  640. *******************************************************************************/
  641. status_t H3LIS331DL::get6DPositionInt1(byte* val) {
  642. byte value;
  643. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_SRC, &value)) {
  644. return MEMS_ERROR;
  645. }
  646. value &= 0x7F;
  647. switch (value) {
  648. case H3LIS331DL_UP_SX:
  649. *val = H3LIS331DL_UP_SX;
  650. break;
  651. case H3LIS331DL_UP_DX:
  652. *val = H3LIS331DL_UP_DX;
  653. break;
  654. case H3LIS331DL_DW_SX:
  655. *val = H3LIS331DL_DW_SX;
  656. break;
  657. case H3LIS331DL_DW_DX:
  658. *val = H3LIS331DL_DW_DX;
  659. break;
  660. case H3LIS331DL_TOP:
  661. *val = H3LIS331DL_TOP;
  662. break;
  663. case H3LIS331DL_BOTTOM:
  664. *val = H3LIS331DL_BOTTOM;
  665. break;
  666. }
  667. return MEMS_SUCCESS;
  668. }
  669. /*******************************************************************************
  670. Function Name : get6DPositionInt2
  671. Description : 6D Interrupt 2 Position Detect
  672. Input : Byte to be filled with H3LIS331DL_POSITION_6D_t Typedef
  673. Output : None
  674. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  675. *******************************************************************************/
  676. status_t H3LIS331DL::get6DPositionInt2(byte* val) {
  677. byte value;
  678. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_SRC, &value)) {
  679. return MEMS_ERROR;
  680. }
  681. value &= 0x7F;
  682. switch (value) {
  683. case H3LIS331DL_UP_SX:
  684. *val = H3LIS331DL_UP_SX;
  685. break;
  686. case H3LIS331DL_UP_DX:
  687. *val = H3LIS331DL_UP_DX;
  688. break;
  689. case H3LIS331DL_DW_SX:
  690. *val = H3LIS331DL_DW_SX;
  691. break;
  692. case H3LIS331DL_DW_DX:
  693. *val = H3LIS331DL_DW_DX;
  694. break;
  695. case H3LIS331DL_TOP:
  696. *val = H3LIS331DL_TOP;
  697. break;
  698. case H3LIS331DL_BOTTOM:
  699. *val = H3LIS331DL_BOTTOM;
  700. break;
  701. }
  702. return MEMS_SUCCESS;
  703. }
  704. /*******************************************************************************
  705. Function Name : setInt1Threshold
  706. Description : Sets Interrupt 1 Threshold
  707. Input : Threshold = [0,127]
  708. Output : None
  709. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  710. *******************************************************************************/
  711. status_t H3LIS331DL::setInt1Threshold(byte ths) {
  712. if (ths > 127) {
  713. return MEMS_ERROR;
  714. }
  715. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_THS, ths)) {
  716. return MEMS_ERROR;
  717. }
  718. return MEMS_SUCCESS;
  719. }
  720. /*******************************************************************************
  721. Function Name : setInt1Duration
  722. Description : Sets Interrupt 1 Duration
  723. Input : Duration = [0,127]
  724. Output : None
  725. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  726. *******************************************************************************/
  727. status_t H3LIS331DL::setInt1Duration(byte id) {
  728. if (id > 127) {
  729. return MEMS_ERROR;
  730. }
  731. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_DURATION, id)) {
  732. return MEMS_ERROR;
  733. }
  734. return MEMS_SUCCESS;
  735. }
  736. /*******************************************************************************
  737. Function Name : setInt2Threshold
  738. Description : Sets Interrupt 2 Threshold
  739. Input : Threshold = [0,127]
  740. Output : None
  741. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  742. *******************************************************************************/
  743. status_t H3LIS331DL::setInt2Threshold(byte ths) {
  744. if (ths > 127) {
  745. return MEMS_ERROR;
  746. }
  747. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_THS, ths)) {
  748. return MEMS_ERROR;
  749. }
  750. return MEMS_SUCCESS;
  751. }
  752. /*******************************************************************************
  753. Function Name : setInt2Duration
  754. Description : Sets Interrupt 2 Duration
  755. Input : Duration = [0,127]
  756. Output : None
  757. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  758. *******************************************************************************/
  759. status_t H3LIS331DL::setInt2Duration(byte id) {
  760. if (id > 127) {
  761. return MEMS_ERROR;
  762. }
  763. if (!writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_DURATION, id)) {
  764. return MEMS_ERROR;
  765. }
  766. return MEMS_SUCCESS;
  767. }
  768. /*******************************************************************************
  769. Function Name : getStatusReg
  770. Description : Read the status register
  771. Input : char to empty by Status Reg Value
  772. Output : None
  773. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  774. *******************************************************************************/
  775. status_t H3LIS331DL::getStatusReg(byte* val) {
  776. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_STATUS_REG, val)) {
  777. return MEMS_ERROR;
  778. }
  779. return MEMS_SUCCESS;
  780. }
  781. /*******************************************************************************
  782. Function Name : getStatusBIT
  783. Description : Read the status register BIT
  784. Input : H3LIS331DL_STATUS_REG_ZYXOR, H3LIS331DL_STATUS_REG_ZOR, H3LIS331DL_STATUS_REG_YOR, H3LIS331DL_STATUS_REG_XOR,
  785. H3LIS331DL_STATUS_REG_ZYXDA, H3LIS331DL_STATUS_REG_ZDA, H3LIS331DL_STATUS_REG_YDA, H3LIS331DL_STATUS_REG_XDA,
  786. H3LIS331DL_DATAREADY_BIT
  787. Output : status register BIT
  788. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  789. *******************************************************************************/
  790. status_t H3LIS331DL::getStatusBit(byte statusBIT, byte* val) {
  791. byte value;
  792. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_STATUS_REG, &value)) {
  793. return MEMS_ERROR;
  794. }
  795. switch (statusBIT) {
  796. case H3LIS331DL_STATUS_REG_ZYXOR:
  797. if (value &= H3LIS331DL_STATUS_REG_ZYXOR) {
  798. *val = MEMS_SET;
  799. return MEMS_SUCCESS;
  800. } else {
  801. *val = MEMS_RESET;
  802. return MEMS_SUCCESS;
  803. }
  804. case H3LIS331DL_STATUS_REG_ZOR:
  805. if (value &= H3LIS331DL_STATUS_REG_ZOR) {
  806. *val = MEMS_SET;
  807. return MEMS_SUCCESS;
  808. } else {
  809. *val = MEMS_RESET;
  810. return MEMS_SUCCESS;
  811. }
  812. case H3LIS331DL_STATUS_REG_YOR:
  813. if (value &= H3LIS331DL_STATUS_REG_YOR) {
  814. *val = MEMS_SET;
  815. return MEMS_SUCCESS;
  816. } else {
  817. *val = MEMS_RESET;
  818. return MEMS_SUCCESS;
  819. }
  820. case H3LIS331DL_STATUS_REG_XOR:
  821. if (value &= H3LIS331DL_STATUS_REG_XOR) {
  822. *val = MEMS_SET;
  823. return MEMS_SUCCESS;
  824. } else {
  825. *val = MEMS_RESET;
  826. return MEMS_SUCCESS;
  827. }
  828. case H3LIS331DL_STATUS_REG_ZYXDA:
  829. if (value &= H3LIS331DL_STATUS_REG_ZYXDA) {
  830. *val = MEMS_SET;
  831. return MEMS_SUCCESS;
  832. } else {
  833. *val = MEMS_RESET;
  834. return MEMS_SUCCESS;
  835. }
  836. case H3LIS331DL_STATUS_REG_ZDA:
  837. if (value &= H3LIS331DL_STATUS_REG_ZDA) {
  838. *val = MEMS_SET;
  839. return MEMS_SUCCESS;
  840. } else {
  841. *val = MEMS_RESET;
  842. return MEMS_SUCCESS;
  843. }
  844. case H3LIS331DL_STATUS_REG_YDA:
  845. if (value &= H3LIS331DL_STATUS_REG_YDA) {
  846. *val = MEMS_SET;
  847. return MEMS_SUCCESS;
  848. } else {
  849. *val = MEMS_RESET;
  850. return MEMS_SUCCESS;
  851. }
  852. case H3LIS331DL_STATUS_REG_XDA:
  853. if (value &= H3LIS331DL_STATUS_REG_XDA) {
  854. *val = MEMS_SET;
  855. return MEMS_SUCCESS;
  856. } else {
  857. *val = MEMS_RESET;
  858. return MEMS_SUCCESS;
  859. }
  860. }
  861. return MEMS_ERROR;
  862. }
  863. /*******************************************************************************
  864. Function Name : getAccAxesRaw
  865. Description : Read the Acceleration Values Output Registers
  866. Input : buffer to empty by AccAxesRaw_t Typedef
  867. Output : None
  868. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  869. *******************************************************************************/
  870. status_t H3LIS331DL::getAccAxesRaw(AxesRaw_t* buff) {
  871. byte valueL = 0, valueH = 0;
  872. readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_OUT_X_L, &valueL);
  873. readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_OUT_X_H, &valueH);
  874. buff->AXIS_X = (valueH << 8) | valueL;
  875. readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_OUT_Y_L, &valueL);
  876. readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_OUT_Y_H, &valueH);
  877. buff->AXIS_Y = (valueH << 8) | valueL;
  878. readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_OUT_Z_L, &valueL);
  879. readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_OUT_Z_H, &valueH);
  880. buff->AXIS_Z = (valueH << 8) | valueL;
  881. return MEMS_SUCCESS;
  882. }
  883. /*******************************************************************************
  884. Function Name : getInt1Src
  885. Description : Reset Interrupt 1 Latching function
  886. Input : buffer to empty by Int1 Source Value
  887. Output : None
  888. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  889. *******************************************************************************/
  890. status_t H3LIS331DL::getInt1Src(byte* val) {
  891. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_SRC, val)) {
  892. return MEMS_ERROR;
  893. }
  894. return MEMS_SUCCESS;
  895. }
  896. /*******************************************************************************
  897. Function Name : getInt2Src
  898. Description : Reset Interrupt 2 Latching function
  899. Input : buffer to empty by Int2 Source Value
  900. Output : None
  901. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  902. *******************************************************************************/
  903. status_t H3LIS331DL::getInt2Src(byte* val) {
  904. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_SRC, val)) {
  905. return MEMS_ERROR;
  906. }
  907. return MEMS_SUCCESS;
  908. }
  909. /*******************************************************************************
  910. Function Name : getInt1SrcBit
  911. Description : Reset Interrupt 1 Latching function
  912. Input : H3LIS331DL_INT1_SRC_IA, H3LIS331DL_INT1_SRC_ZH, H3LIS331DL_INT1_SRC_ZL .....
  913. Output : None
  914. Return : Status of BIT [MEMS_ERROR, MEMS_SUCCESS]
  915. *******************************************************************************/
  916. status_t H3LIS331DL::getInt1SrcBit(byte statusBIT, byte* val) {
  917. byte value;
  918. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_SRC, &value)) {
  919. return MEMS_ERROR;
  920. }
  921. if (statusBIT == H3LIS331DL_INT_SRC_IA) {
  922. if (value &= H3LIS331DL_INT_SRC_IA) {
  923. *val = MEMS_SET;
  924. return MEMS_SUCCESS;
  925. } else {
  926. *val = MEMS_RESET;
  927. return MEMS_SUCCESS;
  928. }
  929. }
  930. if (statusBIT == H3LIS331DL_INT_SRC_ZH) {
  931. if (value &= H3LIS331DL_INT_SRC_ZH) {
  932. *val = MEMS_SET;
  933. return MEMS_SUCCESS;
  934. } else {
  935. *val = MEMS_RESET;
  936. return MEMS_SUCCESS;
  937. }
  938. }
  939. if (statusBIT == H3LIS331DL_INT_SRC_ZL) {
  940. if (value &= H3LIS331DL_INT_SRC_ZL) {
  941. *val = MEMS_SET;
  942. return MEMS_SUCCESS;
  943. } else {
  944. *val = MEMS_RESET;
  945. return MEMS_SUCCESS;
  946. }
  947. }
  948. if (statusBIT == H3LIS331DL_INT_SRC_YH) {
  949. if (value &= H3LIS331DL_INT_SRC_YH) {
  950. *val = MEMS_SET;
  951. return MEMS_SUCCESS;
  952. } else {
  953. *val = MEMS_RESET;
  954. return MEMS_SUCCESS;
  955. }
  956. }
  957. if (statusBIT == H3LIS331DL_INT_SRC_YL) {
  958. if (value &= H3LIS331DL_INT_SRC_YL) {
  959. *val = MEMS_SET;
  960. return MEMS_SUCCESS;
  961. } else {
  962. *val = MEMS_RESET;
  963. return MEMS_SUCCESS;
  964. }
  965. }
  966. if (statusBIT == H3LIS331DL_INT_SRC_XH) {
  967. if (value &= H3LIS331DL_INT_SRC_XH) {
  968. *val = MEMS_SET;
  969. return MEMS_SUCCESS;
  970. } else {
  971. *val = MEMS_RESET;
  972. return MEMS_SUCCESS;
  973. }
  974. }
  975. if (statusBIT == H3LIS331DL_INT_SRC_XL) {
  976. if (value &= H3LIS331DL_INT_SRC_XL) {
  977. *val = MEMS_SET;
  978. return MEMS_SUCCESS;
  979. } else {
  980. *val = MEMS_RESET;
  981. return MEMS_SUCCESS;
  982. }
  983. }
  984. return MEMS_ERROR;
  985. }
  986. /*******************************************************************************
  987. Function Name : getInt2SrcBit
  988. Description : Reset Interrupt 2 Latching function
  989. Input : H3LIS331DL_INT_SRC_IA, H3LIS331DL_INT_SRC_ZH, H3LIS331DL_INT_SRC_ZL .....
  990. Output : None
  991. Return : Status of BIT [MEMS_ERROR, MEMS_SUCCESS]
  992. *******************************************************************************/
  993. status_t H3LIS331DL::getInt2SrcBit(byte statusBIT, byte* val) {
  994. byte value;
  995. if (!readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_SRC, &value)) {
  996. return MEMS_ERROR;
  997. }
  998. if (statusBIT == H3LIS331DL_INT_SRC_IA) {
  999. if (value &= H3LIS331DL_INT_SRC_IA) {
  1000. *val = MEMS_SET;
  1001. return MEMS_SUCCESS;
  1002. } else {
  1003. *val = MEMS_RESET;
  1004. return MEMS_SUCCESS;
  1005. }
  1006. }
  1007. if (statusBIT == H3LIS331DL_INT_SRC_ZH) {
  1008. if (value &= H3LIS331DL_INT_SRC_ZH) {
  1009. *val = MEMS_SET;
  1010. return MEMS_SUCCESS;
  1011. } else {
  1012. *val = MEMS_RESET;
  1013. return MEMS_SUCCESS;
  1014. }
  1015. }
  1016. if (statusBIT == H3LIS331DL_INT_SRC_ZL) {
  1017. if (value &= H3LIS331DL_INT_SRC_ZL) {
  1018. *val = MEMS_SET;
  1019. return MEMS_SUCCESS;
  1020. } else {
  1021. *val = MEMS_RESET;
  1022. return MEMS_SUCCESS;
  1023. }
  1024. }
  1025. if (statusBIT == H3LIS331DL_INT_SRC_YH) {
  1026. if (value &= H3LIS331DL_INT_SRC_YH) {
  1027. *val = MEMS_SET;
  1028. return MEMS_SUCCESS;
  1029. } else {
  1030. *val = MEMS_RESET;
  1031. return MEMS_SUCCESS;
  1032. }
  1033. }
  1034. if (statusBIT == H3LIS331DL_INT_SRC_YL) {
  1035. if (value &= H3LIS331DL_INT_SRC_YL) {
  1036. *val = MEMS_SET;
  1037. return MEMS_SUCCESS;
  1038. } else {
  1039. *val = MEMS_RESET;
  1040. return MEMS_SUCCESS;
  1041. }
  1042. }
  1043. if (statusBIT == H3LIS331DL_INT_SRC_XH) {
  1044. if (value &= H3LIS331DL_INT_SRC_XH) {
  1045. *val = MEMS_SET;
  1046. return MEMS_SUCCESS;
  1047. } else {
  1048. *val = MEMS_RESET;
  1049. return MEMS_SUCCESS;
  1050. }
  1051. }
  1052. if (statusBIT == H3LIS331DL_INT_SRC_XL) {
  1053. if (value &= H3LIS331DL_INT_SRC_XL) {
  1054. *val = MEMS_SET;
  1055. return MEMS_SUCCESS;
  1056. } else {
  1057. *val = MEMS_RESET;
  1058. return MEMS_SUCCESS;
  1059. }
  1060. }
  1061. return MEMS_ERROR;
  1062. }
  1063. /*******************************************************************************
  1064. Function Name : readReg
  1065. Description : Generic Reading function. It must be full filled with either
  1066. : I2C or SPI reading functions
  1067. Input : Register Address
  1068. Output : Data Read
  1069. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  1070. *******************************************************************************/
  1071. uint8_t H3LIS331DL::readReg(byte deviceAddr, byte Reg, byte* Data) {
  1072. //To be completed with either I2c or SPI reading function
  1073. // i.e. *Data = SPI_Mems_Read_Reg( Reg );
  1074. // i.e. if(!I2C_BufferRead(Data, deviceAddr, Reg, 1))
  1075. // return MEMS_ERROR;
  1076. // else
  1077. // return MEMS_SUCCESS;
  1078. // Reads num bytes starting from address register on device in to _buff array
  1079. byte num = 1;
  1080. Wire.beginTransmission(deviceAddr); // start transmission to device
  1081. Wire.write(Reg); // sends address to read from
  1082. Wire.endTransmission(); // end transmission
  1083. Wire.beginTransmission(deviceAddr); // start transmission to device
  1084. Wire.requestFrom(deviceAddr, num); // request 6 bytes from device
  1085. if (Wire.available()) {
  1086. *Data = Wire.read(); // receive a byte
  1087. Wire.endTransmission(); // end transmission
  1088. return MEMS_SUCCESS;
  1089. } else {
  1090. Wire.endTransmission();
  1091. return MEMS_ERROR;
  1092. }
  1093. }
  1094. /*******************************************************************************
  1095. Function Name : writeReg
  1096. Description : Generic Writing function. It must be full filled with either
  1097. : I2C or SPI writing function
  1098. Input : Register Address, Data to be written
  1099. Output : None
  1100. Return : Status [MEMS_ERROR, MEMS_SUCCESS]
  1101. *******************************************************************************/
  1102. uint8_t H3LIS331DL::writeReg(byte deviceAddress, byte WriteAddr, byte Data) {
  1103. //To be completed with either I2c or SPI writing function
  1104. // i.e. SPI_Mems_Write_Reg(Reg, Data);
  1105. // i.e. I2C_ByteWrite(&Data, deviceAddress, WriteAddr);
  1106. // return MEMS_SUCCESS;
  1107. // Writes val to address register on device
  1108. Wire.beginTransmission(deviceAddress); // start transmission to device
  1109. Wire.write(WriteAddr); // send register address
  1110. Wire.write(Data); // send value to write
  1111. Wire.endTransmission(); // end transmission
  1112. return MEMS_SUCCESS;
  1113. }