H3LIS331DL.cpp 42 KB

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