找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 20504|回复: 32
打印 上一主题 下一主题
收起左侧

陀螺仪LIS3DH驱动程序

  [复制链接]
跳转到指定楼层
楼主
ID:122336 发表于 2016-5-21 13:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分享一下lis3dh陀螺仪驱动例程,感兴趣的同学们可以下来参考。
LIS3DH驱动程序,使用都可以根据例程来写,只要再写两条程序就行了,在驱动程序中的读与写程序。
代码下载:
陀螺仪LIS3DH驱动程序.zip (11.6 KB, 下载次数: 444)


  1. /* Define to prevent recursive inclusion -------------------------------------*/
  2. #ifndef __LIS3DH_DRIVER__H
  3. #define __LIS3DH_DRIVER__H

  4. /* Includes ------------------------------------------------------------------*/
  5. /* Exported types ------------------------------------------------------------*/


  6. //these could change accordingly with the architecture

  7. #ifndef __ARCHDEP__TYPES
  8. #define __ARCHDEP__TYPES

  9. typedef unsigned char u8_t;
  10. typedef unsigned short int u16_t;
  11. typedef short int i16_t;
  12. typedef signed char i8_t;

  13. #endif /*__ARCHDEP__TYPES*/

  14. typedef u8_t LIS3DH_IntPinConf_t;
  15. typedef u8_t LIS3DH_Axis_t;
  16. typedef u8_t LIS3DH_Int1Conf_t;


  17. //define structure
  18. #ifndef __SHARED__TYPES
  19. #define __SHARED__TYPES

  20. typedef enum {
  21.   MEMS_SUCCESS                                =                0x01,
  22.   MEMS_ERROR                                =                0x00       
  23. } status_t;

  24. typedef enum {
  25.   MEMS_ENABLE                                =                0x01,
  26.   MEMS_DISABLE                                =                0x00       
  27. } State_t;

  28. typedef struct {
  29.   i16_t AXIS_X;
  30.   i16_t AXIS_Y;
  31.   i16_t AXIS_Z;
  32. } AxesRaw_t;

  33. #endif /*__SHARED__TYPES*/

  34. typedef enum {  
  35.   LIS3DH_ODR_1Hz                        =                0x01,               
  36.   LIS3DH_ODR_10Hz                      =                0x02,
  37.   LIS3DH_ODR_25Hz                        =                0x03,
  38.   LIS3DH_ODR_50Hz                        =                0x04,
  39.   LIS3DH_ODR_100Hz                        =                0x05,       
  40.   LIS3DH_ODR_200Hz                        =                0x06,
  41.   LIS3DH_ODR_400Hz                        =                0x07,
  42.   LIS3DH_ODR_1620Hz_LP                        =                0x08,
  43.   LIS3DH_ODR_1344Hz_NP_5367HZ_LP       =                0x09       
  44. } LIS3DH_ODR_t;

  45. typedef enum {
  46.   LIS3DH_POWER_DOWN                    =                0x00,
  47.   LIS3DH_LOW_POWER                         =                0x01,
  48.   LIS3DH_NORMAL                        =                0x02
  49. } LIS3DH_Mode_t;

  50. typedef enum {
  51.   LIS3DH_HPM_NORMAL_MODE_RES           =               0x00,
  52.   LIS3DH_HPM_REF_SIGNAL                =               0x01,
  53.   LIS3DH_HPM_NORMAL_MODE               =               0x02,
  54.   LIS3DH_HPM_AUTORESET_INT             =               0x03
  55. } LIS3DH_HPFMode_t;

  56. typedef enum {
  57.   LIS3DH_HPFCF_0                       =               0x00,
  58.   LIS3DH_HPFCF_1                       =               0x01,
  59.   LIS3DH_HPFCF_2                       =                 0x02,
  60.   LIS3DH_HPFCF_3                       =               0x03
  61. } LIS3DH_HPFCutOffFreq_t;

  62. typedef struct {
  63.   u16_t AUX_1;
  64.   u16_t AUX_2;
  65.   u16_t AUX_3;
  66. } LIS3DH_Aux123Raw_t;

  67. typedef enum {
  68.   LIS3DH_FULLSCALE_2                   =               0x00,
  69.   LIS3DH_FULLSCALE_4                   =               0x01,
  70.   LIS3DH_FULLSCALE_8                   =               0x02,
  71.   LIS3DH_FULLSCALE_16                  =               0x03
  72. } LIS3DH_Fullscale_t;

  73. typedef enum {
  74.   LIS3DH_BLE_LSB                        =                0x00,
  75.   LIS3DH_BLE_MSB                        =                0x01
  76. } LIS3DH_Endianess_t;

  77. typedef enum {
  78.   LIS3DH_SELF_TEST_DISABLE             =               0x00,
  79.   LIS3DH_SELF_TEST_0                   =               0x01,
  80.   LIS3DH_SELF_TEST_1                   =               0x02
  81. } LIS3DH_SelfTest_t;

  82. typedef enum {
  83.   LIS3DH_FIFO_BYPASS_MODE              =               0x00,
  84.   LIS3DH_FIFO_MODE                     =               0x01,
  85.   LIS3DH_FIFO_STREAM_MODE              =               0x02,
  86.   LIS3DH_FIFO_TRIGGER_MODE             =               0x03,
  87.   LIS3DH_FIFO_DISABLE                  =               0x04
  88. } LIS3DH_FifoMode_t;

  89. typedef enum {
  90.   LIS3DH_TRIG_INT1                     =                0x00,
  91.   LIS3DH_TRIG_INT2                         =                0x01
  92. } LIS3DH_TrigInt_t;

  93. typedef enum {
  94.   LIS3DH_SPI_4_WIRE                    =               0x00,
  95.   LIS3DH_SPI_3_WIRE                    =               0x01
  96. } LIS3DH_SPIMode_t;

  97. typedef enum {
  98.   LIS3DH_X_ENABLE                      =               0x01,
  99.   LIS3DH_X_DISABLE                     =               0x00,
  100.   LIS3DH_Y_ENABLE                      =               0x02,
  101.   LIS3DH_Y_DISABLE                     =               0x00,
  102.   LIS3DH_Z_ENABLE                      =               0x04,
  103.   LIS3DH_Z_DISABLE                     =               0x00   
  104. } LIS3DH_AXISenable_t;

  105. typedef enum {
  106.   LIS3DH_INT1_6D_4D_DISABLE            =               0x00,
  107.   LIS3DH_INT1_6D_ENABLE                =               0x01,
  108.   LIS3DH_INT1_4D_ENABLE                =               0x02
  109. } LIS3DH_INT_6D_4D_t;

  110. typedef enum {
  111.   LIS3DH_UP_SX                         =               0x44,
  112.   LIS3DH_UP_DX                         =               0x42,
  113.   LIS3DH_DW_SX                         =               0x41,
  114.   LIS3DH_DW_DX                         =               0x48,
  115.   LIS3DH_TOP                           =               0x60,
  116.   LIS3DH_BOTTOM                        =               0x50
  117. } LIS3DH_POSITION_6D_t;

  118. typedef enum {
  119.   LIS3DH_INT_MODE_OR                   =               0x00,
  120.   LIS3DH_INT_MODE_6D_MOVEMENT          =               0x01,
  121.   LIS3DH_INT_MODE_AND                  =               0x02,
  122.   LIS3DH_INT_MODE_6D_POSITION          =               0x03  
  123. } LIS3DH_Int1Mode_t;


  124. //interrupt click response
  125. //  b7 = don't care   b6 = IA  b5 = DClick  b4 = Sclick  b3 = Sign  
  126. //  b2 = z      b1 = y     b0 = x
  127. typedef enum {
  128. LIS3DH_DCLICK_Z_P                      =               0x24,
  129. LIS3DH_DCLICK_Z_N                      =               0x2C,
  130. LIS3DH_SCLICK_Z_P                      =               0x14,
  131. LIS3DH_SCLICK_Z_N                      =               0x1C,
  132. LIS3DH_DCLICK_Y_P                      =               0x22,
  133. LIS3DH_DCLICK_Y_N                      =               0x2A,
  134. LIS3DH_SCLICK_Y_P                      =               0x12,
  135. LIS3DH_SCLICK_Y_N                        =                0x1A,
  136. LIS3DH_DCLICK_X_P                      =               0x21,
  137. LIS3DH_DCLICK_X_N                      =               0x29,
  138. LIS3DH_SCLICK_X_P                      =               0x11,
  139. LIS3DH_SCLICK_X_N                      =               0x19,
  140. LIS3DH_NO_CLICK                        =               0x00
  141. } LIS3DH_Click_Response;

  142. //TODO: start from here and manage the shared macros etc before this

  143. /* Exported constants --------------------------------------------------------*/

  144. #ifndef __SHARED__CONSTANTS
  145. #define __SHARED__CONSTANTS

  146. #define MEMS_SET                                        0x01
  147. #define MEMS_RESET                                      0x00

  148. #endif /*__SHARED__CONSTANTS*/


  149. //Register Definition
  150. #define LIS3DH_WHO_AM_I                                0x0F  // device identification register

  151. // CONTROL REGISTER 1
  152. #define LIS3DH_CTRL_REG1                                0x20
  153. #define LIS3DH_ODR_BIT                                        BIT(4)
  154. #define LIS3DH_LPEN                                        BIT(3)
  155. #define LIS3DH_ZEN                                        BIT(2)
  156. #define LIS3DH_YEN                                        BIT(1)
  157. #define LIS3DH_XEN                                        BIT(0)

  158. //CONTROL REGISTER 2
  159. #define LIS3DH_CTRL_REG2                                0x21
  160. #define LIS3DH_HPM                                     BIT(6)
  161. #define LIS3DH_HPCF                                        BIT(4)
  162. #define LIS3DH_FDS                                        BIT(3)
  163. #define LIS3DH_HPCLICK                                        BIT(2)
  164. #define LIS3DH_HPIS2                                        BIT(1)
  165. #define LIS3DH_HPIS1                                        BIT(0)

  166. //CONTROL REGISTER 3
  167. #define LIS3DH_CTRL_REG3                                0x22
  168. #define LIS3DH_I1_CLICK                                BIT(7)
  169. #define LIS3DH_I1_AOI1                                        BIT(6)
  170. #define LIS3DH_I1_AOI2                                        BIT(5)
  171. #define LIS3DH_I1_DRDY1                                BIT(4)
  172. #define LIS3DH_I1_DRDY2                                BIT(3)
  173. #define LIS3DH_I1_WTM                                        BIT(2)
  174. #define LIS3DH_I1_ORUN                                        BIT(1)

  175. //CONTROL REGISTER 6
  176. #define LIS3DH_CTRL_REG6                                0x25
  177. #define LIS3DH_I2_CLICK                                BIT(7)
  178. #define LIS3DH_I2_INT1                                        BIT(6)
  179. #define LIS3DH_I2_BOOT                                 BIT(4)
  180. #define LIS3DH_H_LACTIVE                                BIT(1)

  181. //TEMPERATURE CONFIG REGISTER
  182. #define LIS3DH_TEMP_CFG_REG                                0x1F
  183. #define LIS3DH_ADC_PD                                        BIT(7)
  184. #define LIS3DH_TEMP_EN                                        BIT(6)

  185. //CONTROL REGISTER 4
  186. #define LIS3DH_CTRL_REG4                                0x23
  187. #define LIS3DH_BDU                                        BIT(7)
  188. #define LIS3DH_BLE                                        BIT(6)
  189. #define LIS3DH_FS                                        BIT(4)
  190. #define LIS3DH_HR                                        BIT(3)
  191. #define LIS3DH_ST                                       BIT(1)
  192. #define LIS3DH_SIM                                        BIT(0)

  193. //CONTROL REGISTER 5
  194. #define LIS3DH_CTRL_REG5                                0x24
  195. #define LIS3DH_BOOT                                    BIT(7)
  196. #define LIS3DH_FIFO_EN                                 BIT(6)
  197. #define LIS3DH_LIR_INT1                                BIT(3)
  198. #define LIS3DH_D4D_INT1                                BIT(2)

  199. //REFERENCE/DATA_CAPTURE
  200. #define LIS3DH_REFERENCE_REG                                0x26
  201. #define LIS3DH_REF                                        BIT(0)

  202. //STATUS_REG_AXIES
  203. #define LIS3DH_STATUS_REG                                0x27
  204. #define LIS3DH_ZYXOR                                   BIT(7)
  205. #define LIS3DH_ZOR                                     BIT(6)
  206. #define LIS3DH_YOR                                     BIT(5)
  207. #define LIS3DH_XOR                                     BIT(4)
  208. #define LIS3DH_ZYXDA                                   BIT(3)
  209. #define LIS3DH_ZDA                                     BIT(2)
  210. #define LIS3DH_YDA                                     BIT(1)
  211. #define LIS3DH_XDA                                     BIT(0)

  212. //STATUS_REG_AUX
  213. #define LIS3DH_STATUS_AUX                                0x07

  214. //INTERRUPT 1 CONFIGURATION
  215. #define LIS3DH_INT1_CFG                                0x30
  216. #define LIS3DH_ANDOR                                   BIT(7)
  217. #define LIS3DH_INT_6D                                  BIT(6)
  218. #define LIS3DH_ZHIE                                    BIT(5)
  219. #define LIS3DH_ZLIE                                    BIT(4)
  220. #define LIS3DH_YHIE                                    BIT(3)
  221. #define LIS3DH_YLIE                                    BIT(2)
  222. #define LIS3DH_XHIE                                    BIT(1)
  223. #define LIS3DH_XLIE                                    BIT(0)

  224. //FIFO CONTROL REGISTER
  225. #define LIS3DH_FIFO_CTRL_REG                           0x2E
  226. #define LIS3DH_FM                                      BIT(6)
  227. #define LIS3DH_TR                                      BIT(5)
  228. #define LIS3DH_FTH                                     BIT(0)

  229. //CONTROL REG3 bit mask
  230. #define LIS3DH_CLICK_ON_PIN_INT1_ENABLE                0x80
  231. #define LIS3DH_CLICK_ON_PIN_INT1_DISABLE               0x00
  232. #define LIS3DH_I1_INT1_ON_PIN_INT1_ENABLE              0x40
  233. #define LIS3DH_I1_INT1_ON_PIN_INT1_DISABLE             0x00
  234. #define LIS3DH_I1_INT2_ON_PIN_INT1_ENABLE              0x20
  235. #define LIS3DH_I1_INT2_ON_PIN_INT1_DISABLE             0x00
  236. #define LIS3DH_I1_DRDY1_ON_INT1_ENABLE                 0x10
  237. #define LIS3DH_I1_DRDY1_ON_INT1_DISABLE                0x00
  238. #define LIS3DH_I1_DRDY2_ON_INT1_ENABLE                 0x08
  239. #define LIS3DH_I1_DRDY2_ON_INT1_DISABLE                0x00
  240. #define LIS3DH_WTM_ON_INT1_ENABLE                      0x04
  241. #define LIS3DH_WTM_ON_INT1_DISABLE                     0x00
  242. #define LIS3DH_INT1_OVERRUN_ENABLE                     0x02
  243. #define LIS3DH_INT1_OVERRUN_DISABLE                    0x00

  244. //CONTROL REG6 bit mask
  245. #define LIS3DH_CLICK_ON_PIN_INT2_ENABLE                0x80
  246. #define LIS3DH_CLICK_ON_PIN_INT2_DISABLE               0x00
  247. #define LIS3DH_I2_INT1_ON_PIN_INT2_ENABLE              0x40
  248. #define LIS3DH_I2_INT1_ON_PIN_INT2_DISABLE             0x00
  249. #define LIS3DH_I2_INT2_ON_PIN_INT2_ENABLE              0x20
  250. #define LIS3DH_I2_INT2_ON_PIN_INT2_DISABLE             0x00
  251. #define LIS3DH_I2_BOOT_ON_INT2_ENABLE                  0x10
  252. #define LIS3DH_I2_BOOT_ON_INT2_DISABLE                 0x00
  253. #define LIS3DH_INT_ACTIVE_HIGH                         0x00
  254. #define LIS3DH_INT_ACTIVE_LOW                          0x02

  255. //INT1_CFG bit mask
  256. #define LIS3DH_INT1_AND                                0x80
  257. #define LIS3DH_INT1_OR                                 0x00
  258. #define LIS3DH_INT1_ZHIE_ENABLE                        0x20
  259. #define LIS3DH_INT1_ZHIE_DISABLE                       0x00
  260. #define LIS3DH_INT1_ZLIE_ENABLE                        0x10
  261. #define LIS3DH_INT1_ZLIE_DISABLE                       0x00
  262. #define LIS3DH_INT1_YHIE_ENABLE                        0x08
  263. #define LIS3DH_INT1_YHIE_DISABLE                       0x00
  264. #define LIS3DH_INT1_YLIE_ENABLE                        0x04
  265. #define LIS3DH_INT1_YLIE_DISABLE                       0x00
  266. #define LIS3DH_INT1_XHIE_ENABLE                        0x02
  267. #define LIS3DH_INT1_XHIE_DISABLE                       0x00
  268. #define LIS3DH_INT1_XLIE_ENABLE                        0x01
  269. #define LIS3DH_INT1_XLIE_DISABLE                       0x00

  270. //INT1_SRC bit mask
  271. #define LIS3DH_INT1_SRC_IA                             0x40
  272. #define LIS3DH_INT1_SRC_ZH                             0x20
  273. #define LIS3DH_INT1_SRC_ZL                             0x10
  274. #define LIS3DH_INT1_SRC_YH                             0x08
  275. #define LIS3DH_INT1_SRC_YL                             0x04
  276. #define LIS3DH_INT1_SRC_XH                             0x02
  277. #define LIS3DH_INT1_SRC_XL                             0x01

  278. //INT1 REGISTERS
  279. #define LIS3DH_INT1_THS                                0x32
  280. #define LIS3DH_INT1_DURATION                           0x33

  281. //INTERRUPT 1 SOURCE REGISTER
  282. #define LIS3DH_INT1_SRC                                0x31

  283. //FIFO Source Register bit Mask
  284. #define LIS3DH_FIFO_SRC_WTM                            0x80
  285. #define LIS3DH_FIFO_SRC_OVRUN                          0x40
  286. #define LIS3DH_FIFO_SRC_EMPTY                          0x20
  287.   
  288. //INTERRUPT CLICK REGISTER
  289. #define LIS3DH_CLICK_CFG                                0x38
  290. //INTERRUPT CLICK CONFIGURATION bit mask
  291. #define LIS3DH_ZD_ENABLE                               0x20
  292. #define LIS3DH_ZD_DISABLE                              0x00
  293. #define LIS3DH_ZS_ENABLE                               0x10
  294. #define LIS3DH_ZS_DISABLE                              0x00
  295. #define LIS3DH_YD_ENABLE                               0x08
  296. #define LIS3DH_YD_DISABLE                              0x00
  297. #define LIS3DH_YS_ENABLE                               0x04
  298. #define LIS3DH_YS_DISABLE                              0x00
  299. #define LIS3DH_XD_ENABLE                               0x02
  300. #define LIS3DH_XD_DISABLE                              0x00
  301. #define LIS3DH_XS_ENABLE                               0x01
  302. #define LIS3DH_XS_DISABLE                              0x00

  303. //INTERRUPT CLICK SOURCE REGISTER
  304. #define LIS3DH_CLICK_SRC                               0x39
  305. //INTERRUPT CLICK SOURCE REGISTER bit mask
  306. #define LIS3DH_IA                                      0x40
  307. #define LIS3DH_DCLICK                                  0x20
  308. #define LIS3DH_SCLICK                                  0x10
  309. #define LIS3DH_CLICK_SIGN                              0x08
  310. #define LIS3DH_CLICK_Z                                 0x04
  311. #define LIS3DH_CLICK_Y                                 0x02
  312. #define LIS3DH_CLICK_X                                 0x01

  313. //Click-click Register
  314. #define LIS3DH_CLICK_THS                               0x3A
  315. #define LIS3DH_TIME_LIMIT                              0x3B
  316. #define LIS3DH_TIME_LATENCY                            0x3C
  317. #define LIS3DH_TIME_WINDOW                             0x3D

  318. //OUTPUT REGISTER
  319. #define LIS3DH_OUT_X_L                                        0x28
  320. #define LIS3DH_OUT_X_H                                        0x29
  321. #define LIS3DH_OUT_Y_L                                        0x2A
  322. #define LIS3DH_OUT_Y_H                                        0x2B
  323. #define LIS3DH_OUT_Z_L                                        0x2C
  324. #define LIS3DH_OUT_Z_H                                        0x2D

  325. //AUX REGISTER
  326. #define LIS3DH_OUT_1_L                                        0x08
  327. #define LIS3DH_OUT_1_H                                        0x09
  328. #define LIS3DH_OUT_2_L                                        0x0A
  329. #define LIS3DH_OUT_2_H                                        0x0B
  330. #define LIS3DH_OUT_3_L                                        0x0C
  331. #define LIS3DH_OUT_3_H                                        0x0D

  332. //STATUS REGISTER bit mask
  333. #define LIS3DH_STATUS_REG_ZYXOR                        0x80    // 1        :        new data set has over written the previous one
  334.                                                         // 0        :        no overrun has occurred (default)       
  335. #define LIS3DH_STATUS_REG_ZOR                          0x40    // 0        :        no overrun has occurred (default)
  336.                                                         // 1        :        new Z-axis data has over written the previous one
  337. #define LIS3DH_STATUS_REG_YOR                          0x20    // 0        :        no overrun has occurred (default)
  338.                                                         // 1        :        new Y-axis data has over written the previous one
  339. #define LIS3DH_STATUS_REG_XOR                          0x10    // 0        :        no overrun has occurred (default)
  340.                                                         // 1        :        new X-axis data has over written the previous one
  341. #define LIS3DH_STATUS_REG_ZYXDA                        0x08    // 0        :        a new set of data is not yet avvious one
  342.                                                         // 1        :        a new set of data is available
  343. #define LIS3DH_STATUS_REG_ZDA                          0x04    // 0        :        a new data for the Z-Axis is not availvious one
  344.                                                         // 1        :        a new data for the Z-Axis is available
  345. #define LIS3DH_STATUS_REG_YDA                          0x02    // 0        :        a new data for the Y-Axis is not available
  346.                                                         // 1        :        a new data for the Y-Axis is available
  347. #define LIS3DH_STATUS_REG_XDA                          0x01    // 0        :        a new data for the X-Axis is not available

  348. #define LIS3DH_DATAREADY_BIT                           LIS3DH_STATUS_REG_ZYXDA


  349. //STATUS AUX REGISTER bit mask
  350. #define LIS3DH_STATUS_AUX_321OR                         0x80
  351. #define LIS3DH_STATUS_AUX_3OR                           0x40
  352. #define LIS3DH_STATUS_AUX_2OR                           0x20
  353. #define LIS3DH_STATUS_AUX_1OR                           0x10
  354. #define LIS3DH_STATUS_AUX_321DA                         0x08
  355. #define LIS3DH_STATUS_AUX_3DA                           0x04
  356. #define LIS3DH_STATUS_AUX_2DA                           0x02
  357. #define LIS3DH_STATUS_AUX_1DA                           0x01

  358. #define LIS3DH_MEMS_I2C_ADDRESS                                0x33

  359. //FIFO REGISTERS
  360. #define LIS3DH_FIFO_CTRL_REG                                0x2E
  361. #define LIS3DH_FIFO_SRC_REG                                0x2F


  362. /* Exported macro ------------------------------------------------------------*/

  363. #ifndef __SHARED__MACROS

  364. #define __SHARED__MACROS
  365. #define ValBit(VAR,Place)         (VAR & (1<<Place))
  366. #define BIT(x) ( (x) )

  367. #endif /*__SHARED__MACROS*/

  368. /* Exported functions --------------------------------------------------------*/
  369. //Sensor Configuration Functions
  370. status_t LIS3DH_SetODR(LIS3DH_ODR_t ov);
  371. status_t LIS3DH_SetMode(LIS3DH_Mode_t md);
  372. status_t LIS3DH_SetAxis(LIS3DH_Axis_t axis);
  373. status_t LIS3DH_SetFullScale(LIS3DH_Fullscale_t fs);
  374. status_t LIS3DH_SetBDU(State_t bdu);
  375. status_t LIS3DH_SetBLE(LIS3DH_Endianess_t ble);
  376. status_t LIS3DH_SetSelfTest(LIS3DH_SelfTest_t st);
  377. status_t LIS3DH_SetTemperature(State_t state);
  378. status_t LIS3DH_SetADCAux(State_t state);

  379. //Filtering Functions
  380. status_t LIS3DH_HPFClickEnable(State_t hpfe);
  381. status_t LIS3DH_HPFAOI1Enable(State_t hpfe);
  382. status_t LIS3DH_HPFAOI2Enable(State_t hpfe);
  383. status_t LIS3DH_SetHPFMode(LIS3DH_HPFMode_t hpf);
  384. status_t LIS3DH_SetHPFCutOFF(LIS3DH_HPFCutOffFreq_t hpf);
  385. status_t LIS3DH_SetFilterDataSel(State_t state);

  386. //Interrupt Functions
  387. status_t LIS3DH_SetInt1Pin(LIS3DH_IntPinConf_t pinConf);
  388. status_t LIS3DH_SetInt2Pin(LIS3DH_IntPinConf_t pinConf);
  389. status_t LIS3DH_Int1LatchEnable(State_t latch);
  390. status_t LIS3DH_ResetInt1Latch(void);
  391. status_t LIS3DH_SetIntConfiguration(LIS3DH_Int1Conf_t ic);
  392. status_t LIS3DH_SetInt1Threshold(u8_t ths);
  393. status_t LIS3DH_SetInt1Duration(LIS3DH_Int1Conf_t id);
  394. status_t LIS3DH_SetIntMode(LIS3DH_Int1Mode_t ic);
  395. status_t LIS3DH_SetClickCFG(u8_t status);
  396. status_t LIS3DH_SetInt6D4DConfiguration(LIS3DH_INT_6D_4D_t ic);
  397. status_t LIS3DH_GetInt1Src(u8_t* val);
  398. status_t LIS3DH_GetInt1SrcBit(u8_t statusBIT, u8_t* val);

  399. //FIFO Functions
  400. status_t LIS3DH_FIFOModeEnable(LIS3DH_FifoMode_t fm);
  401. status_t LIS3DH_SetWaterMark(u8_t wtm);
  402. status_t LIS3DH_SetTriggerInt(LIS3DH_TrigInt_t tr);
  403. status_t LIS3DH_GetFifoSourceReg(u8_t* val);
  404. status_t LIS3DH_GetFifoSourceBit(u8_t statusBIT, u8_t* val);
  405. status_t LIS3DH_GetFifoSourceFSS(u8_t* val);

  406. //Other Reading Functions
  407. status_t LIS3DH_GetStatusReg(u8_t* val);
  408. status_t LIS3DH_GetStatusBit(u8_t statusBIT, u8_t* val);
  409. status_t LIS3DH_GetStatusAUXBit(u8_t statusBIT, u8_t* val);
  410. status_t LIS3DH_GetStatusAUX(u8_t* val);
  411. status_t LIS3DH_GetAccAxesRaw(AxesRaw_t* buff);
  412. status_t LIS3DH_GetAuxRaw(LIS3DH_Aux123Raw_t* buff);
  413. status_t LIS3DH_GetClickResponse(u8_t* val);
  414. status_t LIS3DH_GetTempRaw(i8_t* val);
  415. status_t LIS3DH_GetWHO_AM_I(u8_t* val);
  416. status_t LIS3DH_Get6DPosition(u8_t* val);

  417. //Generic
  418. // i.e. u8_t LIS3DH_ReadReg(u8_t Reg, u8_t* Data);
  419. // i.e. u8_t LIS3DH_WriteReg(u8_t Reg, u8_t Data);


  420. #endif /* __LIS3DH_H */

  421. /******************* (C) COPYRIGHT 2012 STMicroelectronics *****END OF FILE****/



  422. 2、陀螺仪LIS3DH驱动程序的.c文件

  423. LIS3DH_driver.c
  424. /******************** (C) COPYRIGHT 2012 STMicroelectronics ********************
  425. * File Name          : LIS3DH_driver.c
  426. * Author             : MSH Application Team
  427. * Author             : Fabio Tota
  428. * Version            : $Revision:$
  429. * Date               : $Date:$
  430. * Description        : LIS3DH driver file
  431. *                     
  432. * HISTORY:
  433. * Date               |        Modification                    |        Author
  434. * 24/06/2011         |        Initial Revision                |        Fabio Tota
  435. * 11/06/2012         |        Support for multiple drivers in the same program |        Abhishek Anand

  436. ********************************************************************************
  437. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  438. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
  439. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  440. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
  441. * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
  442. * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  443. *
  444. * THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS.
  445. *
  446. *******************************************************************************/

  447. /* Includes ------------------------------------------------------------------*/
  448. #include "lis3dh_driver.h"
  449. /* Private typedef -----------------------------------------------------------*/
  450. /* Private define ------------------------------------------------------------*/
  451. /* Private macro -------------------------------------------------------------*/
  452. /* Private variables ---------------------------------------------------------*/
  453. /* Private function prototypes -----------------------------------------------*/

  454. /*******************************************************************************
  455. * Function Name                : LIS3DH_ReadReg
  456. * Description                : Generic Reading function. It must be fullfilled with either
  457. *                        : I2C or SPI reading functions                                       
  458. * Input                        : Register Address
  459. * Output                : Data REad
  460. * Return                : None
  461. *******************************************************************************/
  462. u8_t LIS3DH_ReadReg(u8_t Reg, u8_t* Data) {
  463.   
  464.   //To be completed with either I2c or SPI reading function
  465.   //i.e. *Data = SPI_Mems_Read_Reg( Reg );  
  466.   return 1;
  467. }


  468. /*******************************************************************************
  469. * Function Name                : LIS3DH_WriteReg
  470. * Description                : Generic Writing function. It must be fullfilled with either
  471. *                        : I2C or SPI writing function
  472. * Input                        : Register Address, Data to be written
  473. * Output                : None
  474. * Return                : None
  475. *******************************************************************************/
  476. u8_t LIS3DH_WriteReg(u8_t WriteAddr, u8_t Data) {
  477.   
  478.   //To be completed with either I2c or SPI writing function
  479.   //i.e. SPI_Mems_Write_Reg(WriteAddr, Data);  
  480.   return 1;
  481. }


  482. /* Private functions ---------------------------------------------------------*/

  483. /*******************************************************************************
  484. * Function Name  : LIS3DH_GetWHO_AM_I
  485. * Description    : Read identification code by WHO_AM_I register
  486. * Input          : Char to empty by Device identification Value
  487. * Output         : None
  488. * Return         : Status [value of FSS]
  489. *******************************************************************************/
  490. status_t LIS3DH_GetWHO_AM_I(u8_t* val){
  491.   
  492.   if( !LIS3DH_ReadReg(LIS3DH_WHO_AM_I, val) )
  493.     return MEMS_ERROR;
  494.   
  495.   return MEMS_SUCCESS;
  496. }


  497. /*******************************************************************************
  498. * Function Name  : LIS3DH_GetStatusAUX
  499. * Description    : Read the AUX status register
  500. * Input          : Char to empty by status register buffer
  501. * Output         : None
  502. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  503. *******************************************************************************/
  504. status_t LIS3DH_GetStatusAUX(u8_t* val) {
  505.   
  506.   if( !LIS3DH_ReadReg(LIS3DH_STATUS_AUX, val) )
  507.     return MEMS_ERROR;
  508.   
  509.   return MEMS_SUCCESS;  
  510. }



  511. /*******************************************************************************
  512. * Function Name  : LIS3DH_GetStatusAUXBIT
  513. * Description    : Read the AUX status register BIT
  514. * Input          : LIS3DH_STATUS_AUX_321OR, LIS3DH_STATUS_AUX_3OR, LIS3DH_STATUS_AUX_2OR, LIS3DH_STATUS_AUX_1OR,
  515.                    LIS3DH_STATUS_AUX_321DA, LIS3DH_STATUS_AUX_3DA, LIS3DH_STATUS_AUX_2DA, LIS3DH_STATUS_AUX_1DA
  516. * Output         : None
  517. * Return         : Status of BIT [MEMS_ERROR, MEMS_SUCCESS]
  518. *******************************************************************************/
  519. status_t LIS3DH_GetStatusAUXBit(u8_t statusBIT, u8_t* val) {
  520.   u8_t value;  
  521.   
  522.   if( !LIS3DH_ReadReg(LIS3DH_STATUS_AUX, &value) )
  523.     return MEMS_ERROR;
  524.   
  525.   if(statusBIT == LIS3DH_STATUS_AUX_321OR){
  526.     if(value &= LIS3DH_STATUS_AUX_321OR){     
  527.       *val = MEMS_SET;
  528.       return MEMS_SUCCESS;
  529.     }
  530.     else{  
  531.       *val = MEMS_RESET;
  532.       return MEMS_SUCCESS;
  533.     }   
  534.   }
  535.   
  536.   if(statusBIT == LIS3DH_STATUS_AUX_3OR){
  537.     if(value &= LIS3DH_STATUS_AUX_3OR){     
  538.       *val = MEMS_SET;
  539.       return MEMS_SUCCESS;
  540.     }
  541.     else{  
  542.       *val = MEMS_RESET;
  543.       return MEMS_SUCCESS;
  544.     }     
  545.   }
  546.   
  547.   if(statusBIT == LIS3DH_STATUS_AUX_2OR){
  548.     if(value &= LIS3DH_STATUS_AUX_2OR){     
  549.       *val = MEMS_SET;
  550.       return MEMS_SUCCESS;
  551.     }
  552.     else{  
  553.       *val = MEMS_RESET;
  554.       return MEMS_SUCCESS;
  555.     }   
  556.   }
  557.   
  558.   if(statusBIT == LIS3DH_STATUS_AUX_1OR){
  559.     if(value &= LIS3DH_STATUS_AUX_1OR){     
  560.       *val = MEMS_SET;
  561.       return MEMS_SUCCESS;
  562.     }
  563.     else{  
  564.       *val = MEMS_RESET;
  565.       return MEMS_SUCCESS;
  566.     }   
  567.   }
  568.   
  569.   if(statusBIT == LIS3DH_STATUS_AUX_321DA){
  570.     if(value &= LIS3DH_STATUS_AUX_321DA) {     
  571.       *val = MEMS_SET;
  572.       return MEMS_SUCCESS;
  573.     }
  574.     else{  
  575.       *val = MEMS_RESET;
  576.       return MEMS_SUCCESS;
  577.     }   
  578.   }
  579.   
  580.   if(statusBIT == LIS3DH_STATUS_AUX_3DA){
  581.     if(value &= LIS3DH_STATUS_AUX_3DA){     
  582.       *val = MEMS_SET;
  583.       return MEMS_SUCCESS;
  584.     }
  585.     else{  
  586.       *val = MEMS_RESET;
  587.       return MEMS_SUCCESS;
  588.     }   
  589.   }
  590.   
  591.   if(statusBIT == LIS3DH_STATUS_AUX_2DA){
  592.     if(value &= LIS3DH_STATUS_AUX_2DA){     
  593.       *val = MEMS_SET;
  594.       return MEMS_SUCCESS;
  595.     }
  596.     else{  
  597.       *val = MEMS_RESET;
  598.       return MEMS_SUCCESS;
  599.     }  
  600.   }
  601.   
  602.   if(statusBIT == LIS3DH_STATUS_AUX_1DA){
  603.     if(value &= LIS3DH_STATUS_AUX_1DA){     
  604.       *val = MEMS_SET;
  605.       return MEMS_SUCCESS;
  606.     }
  607.     else{  
  608.       *val = MEMS_RESET;
  609.       return MEMS_SUCCESS;
  610.     }  
  611.   }  
  612.   return MEMS_ERROR;
  613. }


  614. /*******************************************************************************
  615. * Function Name  : LIS3DH_SetODR
  616. * Description    : Sets LIS3DH Output Data Rate
  617. * Input          : Output Data Rate
  618. * Output         : None
  619. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  620. *******************************************************************************/
  621. status_t LIS3DH_SetODR(LIS3DH_ODR_t ov){
  622.   u8_t value;
  623.   
  624.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG1, &value) )
  625.     return MEMS_ERROR;
  626.   
  627.   value &= 0x0f;
  628.   value |= ov<<LIS3DH_ODR_BIT;
  629.   
  630.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG1, value) )
  631.     return MEMS_ERROR;
  632.   
  633.   return MEMS_SUCCESS;
  634. }


  635. /*******************************************************************************
  636. * Function Name  : LIS3DH_SetTemperature
  637. * Description    : Sets LIS3DH Output Temperature
  638. * Input          : MEMS_ENABLE, MEMS_DISABLE
  639. * Output         : None
  640. * Note           : For Read Temperature by LIS3DH_OUT_AUX_3, LIS3DH_SetADCAux and LIS3DH_SetBDU
  641.                                    functions must be ENABLE
  642. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  643. *******************************************************************************/
  644. status_t LIS3DH_SetTemperature(State_t state){
  645.   u8_t value;
  646.   
  647.   if( !LIS3DH_ReadReg(LIS3DH_TEMP_CFG_REG, &value) )
  648.     return MEMS_ERROR;
  649.   
  650.   value &= 0xBF;
  651.   value |= state<<LIS3DH_TEMP_EN;
  652.   
  653.   if( !LIS3DH_WriteReg(LIS3DH_TEMP_CFG_REG, value) )
  654.     return MEMS_ERROR;
  655.   
  656.   return MEMS_SUCCESS;
  657. }


  658. /*******************************************************************************
  659. * Function Name  : LIS3DH_SetADCAux
  660. * Description    : Sets LIS3DH Output ADC
  661. * Input          : MEMS_ENABLE, MEMS_DISABLE
  662. * Output         : None
  663. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  664. *******************************************************************************/
  665. status_t LIS3DH_SetADCAux(State_t state){
  666.   u8_t value;
  667.   
  668.   if( !LIS3DH_ReadReg(LIS3DH_TEMP_CFG_REG, &value) )
  669.     return MEMS_ERROR;
  670.   
  671.   value &= 0x7F;
  672.   value |= state<<LIS3DH_ADC_PD;
  673.   
  674.   if( !LIS3DH_WriteReg(LIS3DH_TEMP_CFG_REG, value) )
  675.     return MEMS_ERROR;
  676.   
  677.   return MEMS_SUCCESS;
  678. }


  679. /*******************************************************************************
  680. * Function Name  : LIS3DH_GetAuxRaw
  681. * Description    : Read the Aux Values Output Registers
  682. * Input          : Buffer to empty
  683. * Output         : Aux Values Registers buffer
  684. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  685. *******************************************************************************/
  686. status_t LIS3DH_GetAuxRaw(LIS3DH_Aux123Raw_t* buff) {
  687.   u8_t valueL;
  688.   u8_t valueH;
  689.   
  690.   if( !LIS3DH_ReadReg(LIS3DH_OUT_1_L, &valueL) )
  691.     return MEMS_ERROR;
  692.   
  693.   if( !LIS3DH_ReadReg(LIS3DH_OUT_1_H, &valueH) )
  694.     return MEMS_ERROR;
  695.   
  696.   buff->AUX_1 = (u16_t)( (valueH << 8) | valueL )/16;
  697.   
  698.   if( !LIS3DH_ReadReg(LIS3DH_OUT_2_L, &valueL) )
  699.     return MEMS_ERROR;
  700.   
  701.   if( !LIS3DH_ReadReg(LIS3DH_OUT_2_H, &valueH) )
  702.     return MEMS_ERROR;
  703.   
  704.   buff->AUX_2 = (u16_t)( (valueH << 8) | valueL )/16;
  705.   
  706.   if( !LIS3DH_ReadReg(LIS3DH_OUT_3_L, &valueL) )
  707.     return MEMS_ERROR;
  708.   
  709.   if( !LIS3DH_ReadReg(LIS3DH_OUT_3_H, &valueH) )
  710.     return MEMS_ERROR;
  711.   
  712.   buff->AUX_3 = (u16_t)( (valueH << 8) | valueL )/16;
  713.   
  714.   return MEMS_SUCCESS;  
  715. }


  716. /*******************************************************************************
  717. * Function Name  : LIS3DH_GetTempRaw
  718. * Description    : Read the Temperature Values by AUX Output Registers OUT_3_H
  719. * Input          : Buffer to empty
  720. * Output         : Temperature Values Registers buffer
  721. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  722. *******************************************************************************/
  723. status_t LIS3DH_GetTempRaw(i8_t* buff) {
  724.   u8_t valueL;
  725.   u8_t valueH;
  726.   
  727.   if( !LIS3DH_ReadReg(LIS3DH_OUT_3_L, &valueL) )
  728.     return MEMS_ERROR;
  729.   
  730.   if( !LIS3DH_ReadReg(LIS3DH_OUT_3_H, &valueH) )
  731.     return MEMS_ERROR;
  732.   
  733.   *buff = (i8_t)( valueH );
  734.   
  735.   return MEMS_SUCCESS;  
  736. }


  737. /*******************************************************************************
  738. * Function Name  : LIS3DH_SetMode
  739. * Description    : Sets LIS3DH Operating Mode
  740. * Input          : Modality (LIS3DH_NORMAL, LIS3DH_LOW_POWER, LIS3DH_POWER_DOWN)
  741. * Output         : None
  742. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  743. *******************************************************************************/
  744. status_t LIS3DH_SetMode(LIS3DH_Mode_t md) {
  745.   u8_t value;
  746.   u8_t value2;
  747.   static   u8_t ODR_old_value;
  748.   
  749.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG1, &value) )
  750.     return MEMS_ERROR;
  751.   
  752.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG4, &value2) )
  753.     return MEMS_ERROR;
  754.   
  755.   if((value & 0xF0)==0)
  756.     value = value | (ODR_old_value & 0xF0); //if it comes from POWERDOWN  
  757.   
  758.   switch(md) {
  759.    
  760.   case LIS3DH_POWER_DOWN:
  761.     ODR_old_value = value;
  762.     value &= 0x0F;
  763.     break;
  764.    
  765.   case LIS3DH_NORMAL:
  766.     value &= 0xF7;
  767.     value |= (MEMS_RESET<<LIS3DH_LPEN);
  768.     value2 &= 0xF7;
  769.     value2 |= (MEMS_SET<<LIS3DH_HR);   //set HighResolution_BIT
  770.     break;
  771.    
  772.   case LIS3DH_LOW_POWER:               
  773.     value &= 0xF7;
  774.     value |=  (MEMS_SET<<LIS3DH_LPEN);
  775.     value2 &= 0xF7;
  776.     value2 |= (MEMS_RESET<<LIS3DH_HR); //reset HighResolution_BIT
  777.     break;
  778.    
  779.   default:
  780.     return MEMS_ERROR;
  781.   }
  782.   
  783.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG1, value) )
  784.     return MEMS_ERROR;
  785.   
  786.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG4, value2) )
  787.     return MEMS_ERROR;  
  788.   
  789.   return MEMS_SUCCESS;
  790. }


  791. /*******************************************************************************
  792. * Function Name  : LIS3DH_SetAxis
  793. * Description    : Enable/Disable LIS3DH Axis
  794. * Input          : LIS3DH_X_ENABLE/DISABLE | LIS3DH_Y_ENABLE/DISABLE | LIS3DH_Z_ENABLE/DISABLE
  795. * Output         : None
  796. * Note           : You MUST use all input variable in the argument, as example
  797. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  798. *******************************************************************************/
  799. status_t LIS3DH_SetAxis(LIS3DH_Axis_t axis) {
  800.   u8_t value;
  801.   
  802.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG1, &value) )
  803.     return MEMS_ERROR;
  804.   value &= 0xF8;
  805.   value |= (0x07 & axis);
  806.   
  807.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG1, value) )
  808.     return MEMS_ERROR;   
  809.   
  810.   return MEMS_SUCCESS;
  811. }


  812. /*******************************************************************************
  813. * Function Name  : LIS3DH_SetFullScale
  814. * Description    : Sets the LIS3DH FullScale
  815. * Input          : LIS3DH_FULLSCALE_2/LIS3DH_FULLSCALE_4/LIS3DH_FULLSCALE_8/LIS3DH_FULLSCALE_16
  816. * Output         : None
  817. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  818. *******************************************************************************/
  819. status_t LIS3DH_SetFullScale(LIS3DH_Fullscale_t fs) {
  820.   u8_t value;
  821.   
  822.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG4, &value) )
  823.     return MEMS_ERROR;
  824.   
  825.   value &= 0xCF;       
  826.   value |= (fs<<LIS3DH_FS);
  827.   
  828.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG4, value) )
  829.     return MEMS_ERROR;
  830.   
  831.   return MEMS_SUCCESS;
  832. }


  833. /*******************************************************************************
  834. * Function Name  : LIS3DH_SetBDU
  835. * Description    : Enable/Disable Block Data Update Functionality
  836. * Input          : ENABLE/DISABLE
  837. * Output         : None
  838. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  839. *******************************************************************************/
  840. status_t LIS3DH_SetBDU(State_t bdu) {
  841.   u8_t value;
  842.   
  843.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG4, &value) )
  844.     return MEMS_ERROR;
  845.   
  846.   value &= 0x7F;
  847.   value |= (bdu<<LIS3DH_BDU);
  848.   
  849.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG4, value) )
  850.     return MEMS_ERROR;
  851.   
  852.   return MEMS_SUCCESS;
  853. }


  854. /*******************************************************************************
  855. * Function Name  : LIS3DH_SetBLE
  856. * Description    : Set Endianess (MSB/LSB)
  857. * Input          : BLE_LSB / BLE_MSB
  858. * Output         : None
  859. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  860. *******************************************************************************/
  861. status_t LIS3DH_SetBLE(LIS3DH_Endianess_t ble) {
  862.   u8_t value;
  863.   
  864.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG4, &value) )
  865.     return MEMS_ERROR;
  866.   
  867.   value &= 0xBF;       
  868.   value |= (ble<<LIS3DH_BLE);
  869.   
  870.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG4, value) )
  871.     return MEMS_ERROR;
  872.   
  873.   return MEMS_SUCCESS;
  874. }


  875. /*******************************************************************************
  876. * Function Name  : LIS3DH_SetSelfTest
  877. * Description    : Set Self Test Modality
  878. * Input          : LIS3DH_SELF_TEST_DISABLE/ST_0/ST_1
  879. * Output         : None
  880. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  881. *******************************************************************************/
  882. status_t LIS3DH_SetSelfTest(LIS3DH_SelfTest_t st) {
  883.   u8_t value;
  884.   
  885.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG4, &value) )
  886.     return MEMS_ERROR;
  887.   
  888.   value &= 0xF9;
  889.   value |= (st<<LIS3DH_ST);
  890.   
  891.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG4, value) )
  892.     return MEMS_ERROR;
  893.   
  894.   return MEMS_SUCCESS;
  895. }


  896. /*******************************************************************************
  897. * Function Name  : LIS3DH_HPFClick
  898. * Description    : Enable/Disable High Pass Filter for click
  899. * Input          : MEMS_ENABLE/MEMS_DISABLE
  900. * Output         : None
  901. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  902. *******************************************************************************/
  903. status_t LIS3DH_HPFClickEnable(State_t hpfe) {
  904.   u8_t value;
  905.   
  906.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) )
  907.     return MEMS_ERROR;
  908.   
  909.   value &= 0xFB;
  910.   value |= (hpfe<<LIS3DH_HPCLICK);
  911.   
  912.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG2, value) )
  913.     return MEMS_ERROR;
  914.   
  915.   return MEMS_SUCCESS;
  916. }


  917. /*******************************************************************************
  918. * Function Name  : LIS3DH_HPFAOI1
  919. * Description    : Enable/Disable High Pass Filter for AOI on INT_1
  920. * Input          : MEMS_ENABLE/MEMS_DISABLE
  921. * Output         : None
  922. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  923. *******************************************************************************/
  924. status_t LIS3DH_HPFAOI1Enable(State_t hpfe) {
  925.   u8_t value;
  926.   
  927.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) )
  928.     return MEMS_ERROR;
  929.   
  930.   value &= 0xFE;
  931.   value |= (hpfe<<LIS3DH_HPIS1);
  932.   
  933.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG2, value) )
  934.     return MEMS_ERROR;
  935.   
  936.   return MEMS_SUCCESS;
  937. }


  938. /*******************************************************************************
  939. * Function Name  : LIS3DH_HPFAOI2
  940. * Description    : Enable/Disable High Pass Filter for AOI on INT_2
  941. * Input          : MEMS_ENABLE/MEMS_DISABLE
  942. * Output         : None
  943. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  944. *******************************************************************************/
  945. status_t LIS3DH_HPFAOI2Enable(State_t hpfe) {
  946.   u8_t value;
  947.   
  948.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) )
  949.     return MEMS_ERROR;
  950.   
  951.   value &= 0xFD;
  952.   value |= (hpfe<<LIS3DH_HPIS2);
  953.   
  954.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG2, value) )
  955.     return MEMS_ERROR;
  956.   
  957.   return MEMS_SUCCESS;
  958. }


  959. /*******************************************************************************
  960. * Function Name  : LIS3DH_SetHPFMode
  961. * Description    : Set High Pass Filter Modality
  962. * Input          : LIS3DH_HPM_NORMAL_MODE_RES/LIS3DH_HPM_REF_SIGNAL/
  963.                                    LIS3DH_HPM_NORMAL_MODE/LIS3DH_HPM_AUTORESET_INT
  964. * Output         : None
  965. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  966. *******************************************************************************/
  967. status_t LIS3DH_SetHPFMode(LIS3DH_HPFMode_t hpm) {
  968.   u8_t value;
  969.   
  970.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) )
  971.     return MEMS_ERROR;
  972.   
  973.   value &= 0x3F;
  974.   value |= (hpm<<LIS3DH_HPM);
  975.   
  976.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG2, value) )
  977.     return MEMS_ERROR;
  978.   
  979.   return MEMS_SUCCESS;
  980. }


  981. /*******************************************************************************
  982. * Function Name  : LIS3DH_SetHPFCutOFF
  983. * Description    : Set High Pass CUT OFF Freq
  984. * Input          : HPFCF [0,3]
  985. * Output         : None
  986. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  987. *******************************************************************************/
  988. status_t LIS3DH_SetHPFCutOFF(LIS3DH_HPFCutOffFreq_t hpf) {
  989.   u8_t value;
  990.   
  991.   if (hpf > 3)
  992.     return MEMS_ERROR;
  993.   
  994.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) )
  995.     return MEMS_ERROR;
  996.   
  997.   value &= 0xCF;
  998.   value |= (hpf<<LIS3DH_HPCF);
  999.   
  1000.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG2, value) )
  1001.     return MEMS_ERROR;
  1002.   
  1003.   return MEMS_SUCCESS;
  1004.   
  1005. }


  1006. /*******************************************************************************
  1007. * Function Name  : LIS3DH_SetFilterDataSel
  1008. * Description    : Set Filter Data Selection bypassed or sent to FIFO OUT register
  1009. * Input          : MEMS_SET, MEMS_RESET
  1010. * Output         : None
  1011. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1012. *******************************************************************************/
  1013. status_t LIS3DH_SetFilterDataSel(State_t state) {
  1014.   u8_t value;
  1015.   
  1016.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) )
  1017.     return MEMS_ERROR;
  1018.   
  1019.   value &= 0xF7;
  1020.   value |= (state<<LIS3DH_FDS);
  1021.   
  1022.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG2, value) )
  1023.     return MEMS_ERROR;
  1024.   
  1025.   return MEMS_SUCCESS;
  1026.   
  1027. }


  1028. /*******************************************************************************
  1029. * Function Name  : LIS3DH_SetInt1Pin
  1030. * Description    : Set Interrupt1 pin Function
  1031. * Input          :  LIS3DH_CLICK_ON_PIN_INT1_ENABLE/DISABLE    | LIS3DH_I1_INT1_ON_PIN_INT1_ENABLE/DISABLE |              
  1032.                     LIS3DH_I1_INT2_ON_PIN_INT1_ENABLE/DISABLE  | LIS3DH_I1_DRDY1_ON_INT1_ENABLE/DISABLE    |              
  1033.                     LIS3DH_I1_DRDY2_ON_INT1_ENABLE/DISABLE     | LIS3DH_WTM_ON_INT1_ENABLE/DISABLE         |           
  1034.                     LIS3DH_INT1_OVERRUN_ENABLE/DISABLE  
  1035. * example        : SetInt1Pin(LIS3DH_CLICK_ON_PIN_INT1_ENABLE | LIS3DH_I1_INT1_ON_PIN_INT1_ENABLE |              
  1036.                     LIS3DH_I1_INT2_ON_PIN_INT1_DISABLE | LIS3DH_I1_DRDY1_ON_INT1_ENABLE | LIS3DH_I1_DRDY2_ON_INT1_ENABLE |
  1037.                     LIS3DH_WTM_ON_INT1_DISABLE | LIS3DH_INT1_OVERRUN_DISABLE   )
  1038. * Note           : To enable Interrupt signals on INT1 Pad (You MUST use all input variable in the argument, as example)
  1039. * Output         : None
  1040. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1041. *******************************************************************************/
  1042. status_t LIS3DH_SetInt1Pin(LIS3DH_IntPinConf_t pinConf) {
  1043.   u8_t value;
  1044.   
  1045.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG3, &value) )
  1046.     return MEMS_ERROR;
  1047.   
  1048.   value &= 0x00;
  1049.   value |= pinConf;
  1050.   
  1051.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG3, value) )
  1052.     return MEMS_ERROR;
  1053.   
  1054.   return MEMS_SUCCESS;
  1055. }


  1056. /*******************************************************************************
  1057. * Function Name  : LIS3DH_SetInt2Pin
  1058. * Description    : Set Interrupt2 pin Function
  1059. * Input          : LIS3DH_CLICK_ON_PIN_INT2_ENABLE/DISABLE   | LIS3DH_I2_INT1_ON_PIN_INT2_ENABLE/DISABLE |               
  1060.                    LIS3DH_I2_INT2_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_BOOT_ON_INT2_ENABLE/DISABLE |                  
  1061.                    LIS3DH_INT_ACTIVE_HIGH/LOW
  1062. * example        : LIS3DH_SetInt2Pin(LIS3DH_CLICK_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_INT1_ON_PIN_INT2_ENABLE/DISABLE |               
  1063.                    LIS3DH_I2_INT2_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_BOOT_ON_INT2_ENABLE/DISABLE |                  
  1064.                    LIS3DH_INT_ACTIVE_HIGH/LOW)
  1065. * Note           : To enable Interrupt signals on INT2 Pad (You MUST use all input variable in the argument, as example)
  1066. * Output         : None
  1067. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1068. *******************************************************************************/
  1069. status_t LIS3DH_SetInt2Pin(LIS3DH_IntPinConf_t pinConf) {
  1070.   u8_t value;
  1071.   
  1072.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG6, &value) )
  1073.     return MEMS_ERROR;
  1074.   
  1075.   value &= 0x00;
  1076.   value |= pinConf;
  1077.   
  1078.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG6, value) )
  1079.     return MEMS_ERROR;
  1080.   
  1081.   return MEMS_SUCCESS;
  1082. }                       


  1083. /*******************************************************************************
  1084. * Function Name  : LIS3DH_SetClickCFG
  1085. * Description    : Set Click Interrupt config Function
  1086. * Input          : LIS3DH_ZD_ENABLE/DISABLE | LIS3DH_ZS_ENABLE/DISABLE  | LIS3DH_YD_ENABLE/DISABLE  |
  1087.                    LIS3DH_YS_ENABLE/DISABLE | LIS3DH_XD_ENABLE/DISABLE  | LIS3DH_XS_ENABLE/DISABLE
  1088. * example        : LIS3DH_SetClickCFG( LIS3DH_ZD_ENABLE | LIS3DH_ZS_DISABLE | LIS3DH_YD_ENABLE |
  1089.                                LIS3DH_YS_DISABLE | LIS3DH_XD_ENABLE | LIS3DH_XS_ENABLE)
  1090. * Note           : You MUST use all input variable in the argument, as example
  1091. * Output         : None
  1092. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1093. *******************************************************************************/
  1094. status_t LIS3DH_SetClickCFG(u8_t status) {
  1095.   u8_t value;
  1096.   
  1097.   if( !LIS3DH_ReadReg(LIS3DH_CLICK_CFG, &value) )
  1098.     return MEMS_ERROR;
  1099.   
  1100.   value &= 0xC0;
  1101.   value |= status;
  1102.   
  1103.   if( !LIS3DH_WriteReg(LIS3DH_CLICK_CFG, value) )
  1104.     return MEMS_ERROR;
  1105.   
  1106.   return MEMS_SUCCESS;
  1107. }  


  1108. /*******************************************************************************
  1109. * Function Name  : LIS3DH_SetClickTHS
  1110. * Description    : Set Click Interrupt threshold
  1111. * Input          : Click-click Threshold value [0-127]
  1112. * Output         : None
  1113. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1114. *******************************************************************************/
  1115. status_t LIS3DH_SetClickTHS(u8_t ths) {
  1116.   
  1117.   if(ths>127)     
  1118.     return MEMS_ERROR;
  1119.   
  1120.   if( !LIS3DH_WriteReg(LIS3DH_CLICK_THS, ths) )
  1121.     return MEMS_ERROR;
  1122.   
  1123.   return MEMS_SUCCESS;
  1124. }


  1125. /*******************************************************************************
  1126. * Function Name  : LIS3DH_SetClickLIMIT
  1127. * Description    : Set Click Interrupt Time Limit
  1128. * Input          : Click-click Time Limit value [0-127]
  1129. * Output         : None
  1130. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1131. *******************************************************************************/
  1132. status_t LIS3DH_SetClickLIMIT(u8_t t_limit) {
  1133.   
  1134.   if(t_limit>127)     
  1135.     return MEMS_ERROR;
  1136.   
  1137.   if( !LIS3DH_WriteReg(LIS3DH_TIME_LIMIT, t_limit) )
  1138.     return MEMS_ERROR;
  1139.   
  1140.   return MEMS_SUCCESS;
  1141. }


  1142. /*******************************************************************************
  1143. * Function Name  : LIS3DH_SetClickLATENCY
  1144. * Description    : Set Click Interrupt Time Latency
  1145. * Input          : Click-click Time Latency value [0-255]
  1146. * Output         : None
  1147. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1148. *******************************************************************************/
  1149. status_t LIS3DH_SetClickLATENCY(u8_t t_latency) {
  1150.   
  1151.   if( !LIS3DH_WriteReg(LIS3DH_TIME_LATENCY, t_latency) )
  1152.     return MEMS_ERROR;
  1153.   
  1154.   return MEMS_SUCCESS;
  1155. }


  1156. /*******************************************************************************
  1157. * Function Name  : LIS3DH_SetClickWINDOW
  1158. * Description    : Set Click Interrupt Time Window
  1159. * Input          : Click-click Time Window value [0-255]
  1160. * Output         : None
  1161. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1162. *******************************************************************************/
  1163. status_t LIS3DH_SetClickWINDOW(u8_t t_window) {
  1164.   
  1165.   if( !LIS3DH_WriteReg(LIS3DH_TIME_WINDOW, t_window) )
  1166.     return MEMS_ERROR;
  1167.   
  1168.   return MEMS_SUCCESS;
  1169. }


  1170. /*******************************************************************************
  1171. * Function Name  : LIS3DH_GetClickResponse
  1172. * Description    : Get Click Interrupt Response by CLICK_SRC REGISTER
  1173. * Input          : char to empty by Click Response Typedef
  1174. * Output         : None
  1175. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1176. *******************************************************************************/
  1177. status_t LIS3DH_GetClickResponse(u8_t* res) {
  1178.   u8_t value;
  1179.   
  1180.   if( !LIS3DH_ReadReg(LIS3DH_CLICK_SRC, &value) )
  1181.     return MEMS_ERROR;
  1182.   
  1183.   value &= 0x7F;
  1184.   
  1185.   if((value & LIS3DH_IA)==0) {        
  1186.     *res = LIS3DH_NO_CLICK;     
  1187.     return MEMS_SUCCESS;
  1188.   }
  1189.   else {
  1190.     if (value & LIS3DH_DCLICK){
  1191.       if (value & LIS3DH_CLICK_SIGN){
  1192.         if (value & LIS3DH_CLICK_Z) {
  1193.           *res = LIS3DH_DCLICK_Z_N;   
  1194.           return MEMS_SUCCESS;
  1195.         }
  1196.         if (value & LIS3DH_CLICK_Y) {
  1197.           *res = LIS3DH_DCLICK_Y_N;   
  1198.           return MEMS_SUCCESS;
  1199.         }
  1200.         if (value & LIS3DH_CLICK_X) {
  1201.           *res = LIS3DH_DCLICK_X_N;   
  1202.           return MEMS_SUCCESS;
  1203.         }
  1204.       }
  1205.       else{
  1206.         if (value & LIS3DH_CLICK_Z) {
  1207.           *res = LIS3DH_DCLICK_Z_P;   
  1208.           return MEMS_SUCCESS;
  1209.         }
  1210.         if (value & LIS3DH_CLICK_Y) {
  1211.           *res = LIS3DH_DCLICK_Y_P;   
  1212.           return MEMS_SUCCESS;
  1213.         }
  1214.         if (value & LIS3DH_CLICK_X) {
  1215.           *res = LIS3DH_DCLICK_X_P;   
  1216.           return MEMS_SUCCESS;
  1217.         }
  1218.       }      
  1219.     }
  1220.     else{
  1221.       if (value & LIS3DH_CLICK_SIGN){
  1222.         if (value & LIS3DH_CLICK_Z) {
  1223.           *res = LIS3DH_SCLICK_Z_N;   
  1224.           return MEMS_SUCCESS;
  1225.         }
  1226.         if (value & LIS3DH_CLICK_Y) {
  1227.           *res = LIS3DH_SCLICK_Y_N;   
  1228.           return MEMS_SUCCESS;
  1229.         }
  1230.         if (value & LIS3DH_CLICK_X) {
  1231.           *res = LIS3DH_SCLICK_X_N;   
  1232.           return MEMS_SUCCESS;
  1233.         }
  1234.       }
  1235.       else{
  1236.         if (value & LIS3DH_CLICK_Z) {
  1237.           *res = LIS3DH_SCLICK_Z_P;   
  1238.           return MEMS_SUCCESS;
  1239.         }
  1240.         if (value & LIS3DH_CLICK_Y) {
  1241.           *res = LIS3DH_SCLICK_Y_P;   
  1242.           return MEMS_SUCCESS;
  1243.         }
  1244.         if (value & LIS3DH_CLICK_X) {
  1245.           *res = LIS3DH_SCLICK_X_P;   
  1246.           return MEMS_SUCCESS;
  1247.         }
  1248.       }
  1249.     }
  1250.   }
  1251.   return MEMS_ERROR;
  1252. }


  1253. /*******************************************************************************
  1254. * Function Name  : LIS3DH_Int1LatchEnable
  1255. * Description    : Enable Interrupt 1 Latching function
  1256. * Input          : ENABLE/DISABLE
  1257. * Output         : None
  1258. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1259. *******************************************************************************/
  1260. status_t LIS3DH_Int1LatchEnable(State_t latch) {
  1261.   u8_t value;
  1262.   
  1263.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) )
  1264.     return MEMS_ERROR;
  1265.   
  1266.   value &= 0xF7;
  1267.   value |= latch<<LIS3DH_LIR_INT1;
  1268.   
  1269.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) )
  1270.     return MEMS_ERROR;
  1271.   
  1272.   return MEMS_SUCCESS;
  1273. }


  1274. /*******************************************************************************
  1275. * Function Name  : LIS3DH_ResetInt1Latch
  1276. * Description    : Reset Interrupt 1 Latching function
  1277. * Input          : None
  1278. * Output         : None
  1279. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1280. *******************************************************************************/
  1281. status_t LIS3DH_ResetInt1Latch(void) {
  1282.   u8_t value;
  1283.   
  1284.   if( !LIS3DH_ReadReg(LIS3DH_INT1_SRC, &value) )
  1285.     return MEMS_ERROR;
  1286.   
  1287.   return MEMS_SUCCESS;
  1288. }


  1289. /*******************************************************************************
  1290. * Function Name  : LIS3DH_SetIntConfiguration
  1291. * Description    : Interrupt 1 Configuration (without LIS3DH_6D_INT)
  1292. * Input          : LIS3DH_INT1_AND/OR | LIS3DH_INT1_ZHIE_ENABLE/DISABLE | LIS3DH_INT1_ZLIE_ENABLE/DISABLE...
  1293. * Output         : None
  1294. * Note           : You MUST use all input variable in the argument, as example
  1295. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1296. *******************************************************************************/
  1297. status_t LIS3DH_SetIntConfiguration(LIS3DH_Int1Conf_t ic) {
  1298.   u8_t value;
  1299.   
  1300.   if( !LIS3DH_ReadReg(LIS3DH_INT1_CFG, &value) )
  1301.     return MEMS_ERROR;
  1302.   
  1303.   value &= 0x40;
  1304.   value |= ic;
  1305.   
  1306.   if( !LIS3DH_WriteReg(LIS3DH_INT1_CFG, value) )
  1307.     return MEMS_ERROR;
  1308.   
  1309.   return MEMS_SUCCESS;
  1310. }

  1311.      
  1312. /*******************************************************************************
  1313. * Function Name  : LIS3DH_SetIntMode
  1314. * Description    : Interrupt 1 Configuration mode (OR, 6D Movement, AND, 6D Position)
  1315. * Input          : LIS3DH_INT_MODE_OR, LIS3DH_INT_MODE_6D_MOVEMENT, LIS3DH_INT_MODE_AND,
  1316.                                    LIS3DH_INT_MODE_6D_POSITION
  1317. * Output         : None
  1318. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1319. *******************************************************************************/
  1320. status_t LIS3DH_SetIntMode(LIS3DH_Int1Mode_t int_mode) {
  1321.   u8_t value;
  1322.   
  1323.   if( !LIS3DH_ReadReg(LIS3DH_INT1_CFG, &value) )
  1324.     return MEMS_ERROR;
  1325.   
  1326.   value &= 0x3F;
  1327.   value |= (int_mode<<LIS3DH_INT_6D);
  1328.   
  1329.   if( !LIS3DH_WriteReg(LIS3DH_INT1_CFG, value) )
  1330.     return MEMS_ERROR;
  1331.   
  1332.   return MEMS_SUCCESS;
  1333. }

  1334.    
  1335. /*******************************************************************************
  1336. * Function Name  : LIS3DH_SetInt6D4DConfiguration
  1337. * Description    : 6D, 4D Interrupt Configuration
  1338. * Input          : LIS3DH_INT1_6D_ENABLE, LIS3DH_INT1_4D_ENABLE, LIS3DH_INT1_6D_4D_DISABLE
  1339. * Output         : None
  1340. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1341. *******************************************************************************/
  1342. status_t LIS3DH_SetInt6D4DConfiguration(LIS3DH_INT_6D_4D_t ic) {
  1343.   u8_t value;
  1344.   u8_t value2;
  1345.   
  1346.   if( !LIS3DH_ReadReg(LIS3DH_INT1_CFG, &value) )
  1347.     return MEMS_ERROR;
  1348.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value2) )
  1349.     return MEMS_ERROR;
  1350.   
  1351.   if(ic == LIS3DH_INT1_6D_ENABLE){
  1352.     value &= 0xBF;
  1353.     value |= (MEMS_ENABLE<<LIS3DH_INT_6D);
  1354.     value2 &= 0xFB;
  1355.     value2 |= (MEMS_DISABLE<<LIS3DH_D4D_INT1);
  1356.   }
  1357.   
  1358.   if(ic == LIS3DH_INT1_4D_ENABLE){
  1359.     value &= 0xBF;
  1360.     value |= (MEMS_ENABLE<<LIS3DH_INT_6D);
  1361.     value2 &= 0xFB;
  1362.     value2 |= (MEMS_ENABLE<<LIS3DH_D4D_INT1);
  1363.   }
  1364.   
  1365.   if(ic == LIS3DH_INT1_6D_4D_DISABLE){
  1366.     value &= 0xBF;
  1367.     value |= (MEMS_DISABLE<<LIS3DH_INT_6D);
  1368.     value2 &= 0xFB;
  1369.     value2 |= (MEMS_DISABLE<<LIS3DH_D4D_INT1);
  1370.   }
  1371.   
  1372.   if( !LIS3DH_WriteReg(LIS3DH_INT1_CFG, value) )
  1373.     return MEMS_ERROR;
  1374.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value2) )
  1375.     return MEMS_ERROR;
  1376.   
  1377.   return MEMS_SUCCESS;
  1378. }


  1379. /*******************************************************************************
  1380. * Function Name  : LIS3DH_Get6DPosition
  1381. * Description    : 6D, 4D Interrupt Position Detect
  1382. * Input          : Byte to empty by POSITION_6D_t Typedef
  1383. * Output         : None
  1384. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1385. *******************************************************************************/
  1386. status_t LIS3DH_Get6DPosition(u8_t* val){
  1387.   u8_t value;
  1388.   
  1389.   if( !LIS3DH_ReadReg(LIS3DH_INT1_SRC, &value) )
  1390.     return MEMS_ERROR;
  1391.   
  1392.   value &= 0x7F;
  1393.   
  1394.   switch (value){
  1395.   case LIS3DH_UP_SX:   
  1396.     *val = LIS3DH_UP_SX;   
  1397.     break;
  1398.   case LIS3DH_UP_DX:   
  1399.     *val = LIS3DH_UP_DX;   
  1400.     break;
  1401.   case LIS3DH_DW_SX:   
  1402.     *val = LIS3DH_DW_SX;   
  1403.     break;
  1404.   case LIS3DH_DW_DX:   
  1405.     *val = LIS3DH_DW_DX;   
  1406.     break;
  1407.   case LIS3DH_TOP:     
  1408.     *val = LIS3DH_TOP;      
  1409.     break;
  1410.   case LIS3DH_BOTTOM:  
  1411.     *val = LIS3DH_BOTTOM;   
  1412.     break;
  1413.   }
  1414.   
  1415.   return MEMS_SUCCESS;  
  1416. }


  1417. /*******************************************************************************
  1418. * Function Name  : LIS3DH_SetInt1Threshold
  1419. * Description    : Sets Interrupt 1 Threshold
  1420. * Input          : Threshold = [0,31]
  1421. * Output         : None
  1422. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1423. *******************************************************************************/
  1424. status_t LIS3DH_SetInt1Threshold(u8_t ths) {
  1425.   if (ths > 127)
  1426.     return MEMS_ERROR;
  1427.   
  1428.   if( !LIS3DH_WriteReg(LIS3DH_INT1_THS, ths) )
  1429.     return MEMS_ERROR;   
  1430.   
  1431.   return MEMS_SUCCESS;
  1432. }


  1433. /*******************************************************************************
  1434. * Function Name  : LIS3DH_SetInt1Duration
  1435. * Description    : Sets Interrupt 1 Duration
  1436. * Input          : Duration value
  1437. * Output         : None
  1438. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1439. *******************************************************************************/
  1440. status_t LIS3DH_SetInt1Duration(LIS3DH_Int1Conf_t id) {
  1441.   
  1442.   if (id > 127)
  1443.     return MEMS_ERROR;
  1444.   
  1445.   if( !LIS3DH_WriteReg(LIS3DH_INT1_DURATION, id) )
  1446.     return MEMS_ERROR;
  1447.   
  1448.   return MEMS_SUCCESS;
  1449. }


  1450. /*******************************************************************************
  1451. * Function Name  : LIS3DH_FIFOModeEnable
  1452. * Description    : Sets Fifo Modality
  1453. * Input          : LIS3DH_FIFO_DISABLE, LIS3DH_FIFO_BYPASS_MODE, LIS3DH_FIFO_MODE,
  1454.                                    LIS3DH_FIFO_STREAM_MODE, LIS3DH_FIFO_TRIGGER_MODE
  1455. * Output         : None
  1456. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1457. *******************************************************************************/
  1458. status_t LIS3DH_FIFOModeEnable(LIS3DH_FifoMode_t fm) {
  1459.   u8_t value;  
  1460.   
  1461.   if(fm == LIS3DH_FIFO_DISABLE) {
  1462.     if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) )
  1463.       return MEMS_ERROR;
  1464.    
  1465.     value &= 0x1F;
  1466.     value |= (LIS3DH_FIFO_BYPASS_MODE<<LIS3DH_FM);                     
  1467.    
  1468.     if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) )           //fifo mode bypass
  1469.       return MEMS_ERROR;   
  1470.     if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) )
  1471.       return MEMS_ERROR;
  1472.    
  1473.     value &= 0xBF;   
  1474.    
  1475.     if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) )               //fifo disable
  1476.       return MEMS_ERROR;   
  1477.   }
  1478.   
  1479.   if(fm == LIS3DH_FIFO_BYPASS_MODE)   {  
  1480.     if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) )
  1481.       return MEMS_ERROR;
  1482.    
  1483.     value &= 0xBF;
  1484.     value |= MEMS_SET<<LIS3DH_FIFO_EN;
  1485.    
  1486.     if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) )               //fifo enable
  1487.       return MEMS_ERROR;  
  1488.     if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) )
  1489.       return MEMS_ERROR;
  1490.    
  1491.     value &= 0x1f;
  1492.     value |= (fm<<LIS3DH_FM);                     //fifo mode configuration
  1493.    
  1494.     if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) )
  1495.       return MEMS_ERROR;
  1496.   }
  1497.   
  1498.   if(fm == LIS3DH_FIFO_MODE)   {
  1499.     if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) )
  1500.       return MEMS_ERROR;
  1501.    
  1502.     value &= 0xBF;
  1503.     value |= MEMS_SET<<LIS3DH_FIFO_EN;
  1504.    
  1505.     if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) )               //fifo enable
  1506.       return MEMS_ERROR;  
  1507.     if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) )
  1508.       return MEMS_ERROR;
  1509.    
  1510.     value &= 0x1f;
  1511.     value |= (fm<<LIS3DH_FM);                      //fifo mode configuration
  1512.    
  1513.     if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) )
  1514.       return MEMS_ERROR;
  1515.   }
  1516.   
  1517.   if(fm == LIS3DH_FIFO_STREAM_MODE)   {  
  1518.     if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) )
  1519.       return MEMS_ERROR;
  1520.    
  1521.     value &= 0xBF;
  1522.     value |= MEMS_SET<<LIS3DH_FIFO_EN;
  1523.    
  1524.     if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) )               //fifo enable
  1525.       return MEMS_ERROR;   
  1526.     if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) )
  1527.       return MEMS_ERROR;
  1528.    
  1529.     value &= 0x1f;
  1530.     value |= (fm<<LIS3DH_FM);                      //fifo mode configuration
  1531.    
  1532.     if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) )
  1533.       return MEMS_ERROR;
  1534.   }
  1535.   
  1536.   if(fm == LIS3DH_FIFO_TRIGGER_MODE)   {  
  1537.     if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) )
  1538.       return MEMS_ERROR;
  1539.    
  1540.     value &= 0xBF;
  1541.     value |= MEMS_SET<<LIS3DH_FIFO_EN;
  1542.    
  1543.     if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) )               //fifo enable
  1544.       return MEMS_ERROR;   
  1545.     if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) )
  1546.       return MEMS_ERROR;
  1547.    
  1548.     value &= 0x1f;
  1549.     value |= (fm<<LIS3DH_FM);                      //fifo mode configuration
  1550.    
  1551.     if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) )
  1552.       return MEMS_ERROR;
  1553.   }
  1554.   
  1555.   return MEMS_SUCCESS;
  1556. }


  1557. /*******************************************************************************
  1558. * Function Name  : LIS3DH_SetTriggerInt
  1559. * Description    : Trigger event liked to trigger signal INT1/INT2
  1560. * Input          : LIS3DH_TRIG_INT1/LIS3DH_TRIG_INT2
  1561. * Output         : None
  1562. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1563. *******************************************************************************/
  1564. status_t LIS3DH_SetTriggerInt(LIS3DH_TrigInt_t tr) {
  1565.   u8_t value;  
  1566.   
  1567.   if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) )
  1568.     return MEMS_ERROR;
  1569.   
  1570.   value &= 0xDF;
  1571.   value |= (tr<<LIS3DH_TR);
  1572.   
  1573.   if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) )
  1574.     return MEMS_ERROR;
  1575.   
  1576.   return MEMS_SUCCESS;
  1577. }


  1578. /*******************************************************************************
  1579. * Function Name  : LIS3DH_SetWaterMark
  1580. * Description    : Sets Watermark Value
  1581. * Input          : Watermark = [0,31]
  1582. * Output         : None
  1583. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1584. *******************************************************************************/
  1585. status_t LIS3DH_SetWaterMark(u8_t wtm) {
  1586.   u8_t value;
  1587.   
  1588.   if(wtm > 31)
  1589.     return MEMS_ERROR;  
  1590.   
  1591.   if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) )
  1592.     return MEMS_ERROR;
  1593.   
  1594.   value &= 0xE0;
  1595.   value |= wtm;
  1596.   
  1597.   if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) )
  1598.     return MEMS_ERROR;
  1599.   
  1600.   return MEMS_SUCCESS;
  1601. }

  1602.   
  1603. /*******************************************************************************
  1604. * Function Name  : LIS3DH_GetStatusReg
  1605. * Description    : Read the status register
  1606. * Input          : char to empty by Status Reg Value
  1607. * Output         : None
  1608. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1609. *******************************************************************************/
  1610. status_t LIS3DH_GetStatusReg(u8_t* val) {
  1611.   if( !LIS3DH_ReadReg(LIS3DH_STATUS_REG, val) )
  1612.     return MEMS_ERROR;
  1613.   
  1614.   return MEMS_SUCCESS;  
  1615. }


  1616. /*******************************************************************************
  1617. * Function Name  : LIS3DH_GetStatusBIT
  1618. * Description    : Read the status register BIT
  1619. * Input          : LIS3DH_STATUS_REG_ZYXOR, LIS3DH_STATUS_REG_ZOR, LIS3DH_STATUS_REG_YOR, LIS3DH_STATUS_REG_XOR,
  1620.                    LIS3DH_STATUS_REG_ZYXDA, LIS3DH_STATUS_REG_ZDA, LIS3DH_STATUS_REG_YDA, LIS3DH_STATUS_REG_XDA,
  1621.                                    LIS3DH_DATAREADY_BIT
  1622.                                    val: Byte to be filled with the status bit       
  1623. * Output         : status register BIT
  1624. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1625. *******************************************************************************/
  1626. status_t LIS3DH_GetStatusBit(u8_t statusBIT, u8_t* val) {
  1627.   u8_t value;  
  1628.   
  1629.   if( !LIS3DH_ReadReg(LIS3DH_STATUS_REG, &value) )
  1630.     return MEMS_ERROR;
  1631.   
  1632.   switch (statusBIT){
  1633.   case LIS3DH_STATUS_REG_ZYXOR:     
  1634.     if(value &= LIS3DH_STATUS_REG_ZYXOR){     
  1635.       *val = MEMS_SET;
  1636.       return MEMS_SUCCESS;
  1637.     }
  1638.     else{  
  1639.       *val = MEMS_RESET;
  1640.       return MEMS_SUCCESS;
  1641.     }  
  1642.   case LIS3DH_STATUS_REG_ZOR:      
  1643.     if(value &= LIS3DH_STATUS_REG_ZOR){     
  1644.       *val = MEMS_SET;
  1645.       return MEMS_SUCCESS;
  1646.     }
  1647.     else{  
  1648.       *val = MEMS_RESET;
  1649.       return MEMS_SUCCESS;
  1650.     }  
  1651.   case LIS3DH_STATUS_REG_YOR:      
  1652.     if(value &= LIS3DH_STATUS_REG_YOR){     
  1653.       *val = MEMS_SET;
  1654.       return MEMS_SUCCESS;
  1655.     }
  1656.     else{  
  1657.       *val = MEMS_RESET;
  1658.       return MEMS_SUCCESS;
  1659.     }                                 
  1660.   case LIS3DH_STATUS_REG_XOR:      
  1661.     if(value &= LIS3DH_STATUS_REG_XOR){     
  1662.       *val = MEMS_SET;
  1663.       return MEMS_SUCCESS;
  1664.     }
  1665.     else{  
  1666.       *val = MEMS_RESET;
  1667.       return MEMS_SUCCESS;
  1668.     }     
  1669.   case LIS3DH_STATUS_REG_ZYXDA:     
  1670.     if(value &= LIS3DH_STATUS_REG_ZYXDA){     
  1671.       *val = MEMS_SET;
  1672.       return MEMS_SUCCESS;
  1673.     }
  1674.     else{  
  1675.       *val = MEMS_RESET;
  1676.       return MEMS_SUCCESS;
  1677.     }   
  1678.   case LIS3DH_STATUS_REG_ZDA:      
  1679.     if(value &= LIS3DH_STATUS_REG_ZDA){     
  1680.       *val = MEMS_SET;
  1681.       return MEMS_SUCCESS;
  1682.     }
  1683.     else{  
  1684.       *val = MEMS_RESET;
  1685.       return MEMS_SUCCESS;
  1686.     }   
  1687.   case LIS3DH_STATUS_REG_YDA:      
  1688.     if(value &= LIS3DH_STATUS_REG_YDA){     
  1689.       *val = MEMS_SET;
  1690.       return MEMS_SUCCESS;
  1691.     }
  1692.     else{  
  1693.       *val = MEMS_RESET;
  1694.       return MEMS_SUCCESS;
  1695.     }   
  1696.   case LIS3DH_STATUS_REG_XDA:      
  1697.     if(value &= LIS3DH_STATUS_REG_XDA){     
  1698.       *val = MEMS_SET;
  1699.       return MEMS_SUCCESS;
  1700.     }
  1701.     else{  
  1702.       *val = MEMS_RESET;
  1703.       return MEMS_SUCCESS;
  1704.     }                                 
  1705.    
  1706.   }
  1707.   return MEMS_ERROR;
  1708. }


  1709. /*******************************************************************************
  1710. * Function Name  : LIS3DH_GetAccAxesRaw
  1711. * Description    : Read the Acceleration Values Output Registers
  1712. * Input          : buffer to empity by AxesRaw_t Typedef
  1713. * Output         : None
  1714. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1715. *******************************************************************************/
  1716. status_t LIS3DH_GetAccAxesRaw(AxesRaw_t* buff) {
  1717.   i16_t value;
  1718.   u8_t *valueL = (u8_t *)(&value);
  1719.   u8_t *valueH = ((u8_t *)(&value)+1);
  1720.   
  1721.   if( !LIS3DH_ReadReg(LIS3DH_OUT_X_L, valueL) )
  1722.     return MEMS_ERROR;
  1723.   
  1724.   if( !LIS3DH_ReadReg(LIS3DH_OUT_X_H, valueH) )
  1725.     return MEMS_ERROR;
  1726.   
  1727.   buff->AXIS_X = value;
  1728.   
  1729.   if( !LIS3DH_ReadReg(LIS3DH_OUT_Y_L, valueL) )
  1730.     return MEMS_ERROR;
  1731.   
  1732.   if( !LIS3DH_ReadReg(LIS3DH_OUT_Y_H, valueH) )
  1733.     return MEMS_ERROR;
  1734.   
  1735.   buff->AXIS_Y = value;
  1736.   
  1737.   if( !LIS3DH_ReadReg(LIS3DH_OUT_Z_L, valueL) )
  1738.     return MEMS_ERROR;
  1739.   
  1740.   if( !LIS3DH_ReadReg(LIS3DH_OUT_Z_H, valueH) )
  1741.     return MEMS_ERROR;
  1742.   
  1743.   buff->AXIS_Z = value;
  1744.   
  1745.   return MEMS_SUCCESS;
  1746. }


  1747. /*******************************************************************************
  1748. * Function Name  : LIS3DH_GetInt1Src
  1749. * Description    : Reset Interrupt 1 Latching function
  1750. * Input          : Char to empty by Int1 source value
  1751. * Output         : None
  1752. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1753. *******************************************************************************/
  1754. status_t LIS3DH_GetInt1Src(u8_t* val) {
  1755.   
  1756.   if( !LIS3DH_ReadReg(LIS3DH_INT1_SRC, val) )
  1757.     return MEMS_ERROR;
  1758.   
  1759.   return MEMS_SUCCESS;
  1760. }


  1761. /*******************************************************************************
  1762. * Function Name  : LIS3DH_GetInt1SrcBit
  1763. * Description    : Reset Interrupt 1 Latching function
  1764. * Input          : statusBIT: LIS3DH_INT_SRC_IA, LIS3DH_INT_SRC_ZH, LIS3DH_INT_SRC_ZL.....
  1765. *                  val: Byte to be filled with the status bit
  1766. * Output         : None
  1767. * Return         : Status of BIT [MEMS_ERROR, MEMS_SUCCESS]
  1768. *******************************************************************************/
  1769. status_t LIS3DH_GetInt1SrcBit(u8_t statusBIT, u8_t* val) {
  1770.   u8_t value;  
  1771.    
  1772.   if( !LIS3DH_ReadReg(LIS3DH_INT1_SRC, &value) )
  1773.       return MEMS_ERROR;
  1774.    
  1775.   if(statusBIT == LIS3DH_INT1_SRC_IA){
  1776.     if(value &= LIS3DH_INT1_SRC_IA){     
  1777.       *val = MEMS_SET;
  1778.       return MEMS_SUCCESS;
  1779.     }
  1780.     else{  
  1781.       *val = MEMS_RESET;
  1782.       return MEMS_SUCCESS;
  1783.     }  
  1784.   }
  1785.   
  1786.   if(statusBIT == LIS3DH_INT1_SRC_ZH){
  1787.     if(value &= LIS3DH_INT1_SRC_ZH){     
  1788.       *val = MEMS_SET;
  1789.       return MEMS_SUCCESS;
  1790.     }
  1791.     else{  
  1792.       *val = MEMS_RESET;
  1793.       return MEMS_SUCCESS;
  1794.     }  
  1795.   }
  1796.   
  1797.   if(statusBIT == LIS3DH_INT1_SRC_ZL){
  1798.     if(value &= LIS3DH_INT1_SRC_ZL){     
  1799.       *val = MEMS_SET;
  1800.       return MEMS_SUCCESS;
  1801.     }
  1802.     else{  
  1803.       *val = MEMS_RESET;
  1804.       return MEMS_SUCCESS;
  1805.     }  
  1806.   }
  1807.   
  1808.   if(statusBIT == LIS3DH_INT1_SRC_YH){
  1809.     if(value &= LIS3DH_INT1_SRC_YH){     
  1810.       *val = MEMS_SET;
  1811.       return MEMS_SUCCESS;
  1812.     }
  1813.     else{  
  1814.       *val = MEMS_RESET;
  1815.       return MEMS_SUCCESS;
  1816.     }  
  1817.   }
  1818.   
  1819.   if(statusBIT == LIS3DH_INT1_SRC_YL){
  1820.     if(value &= LIS3DH_INT1_SRC_YL){     
  1821.       *val = MEMS_SET;
  1822.       return MEMS_SUCCESS;
  1823.     }
  1824.     else{  
  1825.       *val = MEMS_RESET;
  1826.       return MEMS_SUCCESS;
  1827.     }  
  1828.   }
  1829.   if(statusBIT == LIS3DH_INT1_SRC_XH){
  1830.     if(value &= LIS3DH_INT1_SRC_XH){     
  1831.       *val = MEMS_SET;
  1832.       return MEMS_SUCCESS;
  1833.     }
  1834.     else{  
  1835.       *val = MEMS_RESET;
  1836.       return MEMS_SUCCESS;
  1837.     }  
  1838.   }
  1839.   
  1840.   if(statusBIT == LIS3DH_INT1_SRC_XL){
  1841.     if(value &= LIS3DH_INT1_SRC_XL){     
  1842.       *val = MEMS_SET;
  1843.       return MEMS_SUCCESS;
  1844.     }
  1845.     else{  
  1846.       *val = MEMS_RESET;
  1847.       return MEMS_SUCCESS;
  1848.     }  
  1849.   }
  1850.   return MEMS_ERROR;
  1851. }


  1852. /*******************************************************************************
  1853. * Function Name  : LIS3DH_GetFifoSourceReg
  1854. * Description    : Read Fifo source Register
  1855. * Input          : Byte to empty by FIFO source register value
  1856. * Output         : None
  1857. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1858. *******************************************************************************/
  1859. status_t LIS3DH_GetFifoSourceReg(u8_t* val) {
  1860.   
  1861.   if( !LIS3DH_ReadReg(LIS3DH_FIFO_SRC_REG, val) )
  1862.     return MEMS_ERROR;
  1863.   
  1864.   return MEMS_SUCCESS;
  1865. }


  1866. /*******************************************************************************
  1867. * Function Name  : LIS3DH_GetFifoSourceBit
  1868. * Description    : Read Fifo WaterMark source bit
  1869. * Input          : statusBIT: LIS3DH_FIFO_SRC_WTM, LIS3DH_FIFO_SRC_OVRUN, LIS3DH_FIFO_SRC_EMPTY
  1870. *                                   val: Byte to fill  with the bit value
  1871. * Output         : None
  1872. * Return         : Status of BIT [MEMS_ERROR, MEMS_SUCCESS]
  1873. *******************************************************************************/
  1874. status_t LIS3DH_GetFifoSourceBit(u8_t statusBIT,  u8_t* val){
  1875.   u8_t value;  
  1876.   
  1877.   if( !LIS3DH_ReadReg(LIS3DH_FIFO_SRC_REG, &value) )
  1878.     return MEMS_ERROR;
  1879.   
  1880.   
  1881.   if(statusBIT == LIS3DH_FIFO_SRC_WTM){
  1882.     if(value &= LIS3DH_FIFO_SRC_WTM){     
  1883.       *val = MEMS_SET;
  1884.       return MEMS_SUCCESS;
  1885.     }
  1886.     else{  
  1887.       *val = MEMS_RESET;
  1888.       return MEMS_SUCCESS;
  1889.     }  
  1890.   }
  1891.   
  1892.   if(statusBIT == LIS3DH_FIFO_SRC_OVRUN){
  1893.     if(value &= LIS3DH_FIFO_SRC_OVRUN){     
  1894.       *val = MEMS_SET;
  1895.       return MEMS_SUCCESS;
  1896.     }
  1897.     else{  
  1898.       *val = MEMS_RESET;
  1899.       return MEMS_SUCCESS;
  1900.     }  
  1901.   }
  1902.   if(statusBIT == LIS3DH_FIFO_SRC_EMPTY){
  1903.     if(value &= statusBIT == LIS3DH_FIFO_SRC_EMPTY){     
  1904.       *val = MEMS_SET;
  1905.       return MEMS_SUCCESS;
  1906.     }
  1907.     else{  
  1908.       *val = MEMS_RESET;
  1909.       return MEMS_SUCCESS;
  1910.     }  
  1911.   }
  1912.   return MEMS_ERROR;
  1913. }


  1914. /*******************************************************************************
  1915. * Function Name  : LIS3DH_GetFifoSourceFSS
  1916. * Description    : Read current number of unread samples stored in FIFO
  1917. * Input          : Byte to empty by FIFO unread sample value
  1918. * Output         : None
  1919. * Return         : Status [value of FSS]
  1920. *******************************************************************************/
  1921. status_t LIS3DH_GetFifoSourceFSS(u8_t* val){
  1922.   u8_t value;
  1923.   
  1924.   if( !LIS3DH_ReadReg(LIS3DH_FIFO_SRC_REG, &value) )
  1925.     return MEMS_ERROR;
  1926.   
  1927.   value &= 0x1F;
  1928.   
  1929.   *val = value;
  1930.   
  1931.   return MEMS_SUCCESS;
  1932. }

  1933.       
  1934. /*******************************************************************************
  1935. * Function Name  : LIS3DH_SetSPIInterface
  1936. * Description    : Set SPI mode: 3 Wire Interface OR 4 Wire Interface
  1937. * Input          : LIS3DH_SPI_3_WIRE, LIS3DH_SPI_4_WIRE
  1938. * Output         : None
  1939. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1940. *******************************************************************************/
  1941. status_t LIS3DH_SetSPIInterface(LIS3DH_SPIMode_t spi) {
  1942.   u8_t value;
  1943.   
  1944.   if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG4, &value) )
  1945.     return MEMS_ERROR;
  1946.   
  1947.   value &= 0xFE;
  1948.   value |= spi<<LIS3DH_SIM;
  1949.   
  1950.   if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG4, value) )
  1951.     return MEMS_ERROR;
  1952.   
  1953.   return MEMS_SUCCESS;
  1954. }
  1955. /******************* (C) COPYRIGHT 2012 STMicroelectronics *****END OF FILE****/


  1956. 3、陀螺仪LIS3DH基于驱动的例子

  1957. example_main.c
  1958. /******************** (C) COPYRIGHT 2012 STMicroelectronics ********************
  1959. 4、* File Name          : example_main.c
  1960. 5、* Author             : MSH Application Team
  1961. 6、* Author             : Abhishek Anand,Fabio Tota
  1962. 7、* Revision           : $Revision: 1.5 $
  1963. 8、* Date               : $Date: 16/06/2011 12:19:08 $
  1964. 9、* Description        : Example main file for MKI109V1 board
  1965. 10、* HISTORY:
  1966. 11、* Date        | Modification                                | Author
  1967. 12、* 16/06/2011  | Initial Revision                            | Fabio Tota
  1968. 13、* 11/06/2012  |        Support for multiple drivers in the same program |        Abhishek Anand
  1969. 14、
  1970. 15、********************************************************************************
  1971. 16、* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  1972. 17、* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
  1973. 18、* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  1974. 19、* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
  1975. 20、* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
  1976. 21、* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  1977. 22、*
  1978. 23、* THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS.
  1979. 24、*
  1980. 25、*******************************************************************************/
  1981. 26、
  1982. 27、
  1983. 28、/* Includes ------------------------------------------------------------------*/
  1984. 29、//include files for MKI109V1 board
  1985. 30、#include "stm32f10x.h"
  1986. 31、#include "usb_lib.h"
  1987. 32、#include "usb_desc.h"
  1988. 33、#include "hw_config.h"
  1989. 34、#include "usb_pwr.h"
  1990. 35、#include "led.h"
  1991. 36、#include "button.h"
  1992. 37、#include "adc_mems.h"
  1993. 38、#include "string.h"
  1994. 39、#include "spi_mems.h"
  1995. 40、#include <stdio.h>
  1996. 41、
  1997. 42、//include MEMS driver
  1998. 43、#include "lis3dh_driver.h"
  1999. 44、
  2000. 45、/* Private typedef -----------------------------------------------------------*/
  2001. 46、/* Private define ------------------------------------------------------------*/
  2002. 47、/* Private macro -------------------------------------------------------------*/
  2003. 48、/* Private variables ---------------------------------------------------------*/
  2004. 49、uint8_t response;
  2005. 50、uint8_t USBbuffer[64];
  2006. 51、
  2007. 52、/* Extern variables ----------------------------------------------------------*/
  2008. 53、/* Private function prototypes -----------------------------------------------*/
  2009. 54、/* Private functions ---------------------------------------------------------*/
  2010. 55、
  2011. 56、//define for example1 or example2
  2012. 57、//#define __EXAMPLE1__H
  2013. 58、#define __EXAMPLE2__H
  2014. 59、
  2015. 60、/*******************************************************************************
  2016. 61、* Function Name  : main.
  2017. 62、* Description    : Main routine.
  2018. 63、* Input          : None.
  2019. 64、* Output         : None.
  2020. 65、* Return         : None.
  2021. 66、*******************************************************************************/
  2022. 67、int main(void)
  2023. 68、{
  2024. 69、  uint8_t buffer[26];
  2025. 70、  uint8_t position=0, old_position=0;
  2026. 71、  AxesRaw_t data;
  2027. 72、  //Initialize your hardware here
  2028. 73、  
  2029. 74、  //function for MKI109V1 board
  2030. 75、  InitHardware();
  2031. 76、  SPI_Mems_Init();
  2032. 77、  
  2033. 78、  EKSTM32_LEDOff(LED1);
  2034. 79、  EKSTM32_LEDOff(LED2);
  2035. 80、  EKSTM32_LEDOff(LED3);   
  2036. 81、
  2037. 82、  //wait until the USB is ready (MKI109V1 board)
  2038. 83、  while(bDeviceState != CONFIGURED);
  2039. 84、
  2040. 85、  //Inizialize MEMS Sensor
  2041. 86、  //set ODR (turn ON device)
  2042. 87、  response = LIS3DH_SetODR(LIS3DH_ODR_100Hz);
  2043. 88、  if(response==1){
  2044. 89、        sprintf((char*)buffer,"\n\rSET_ODR_OK    \n\r\0");
  2045. 90、        USB_SIL_Write(EP1_IN, buffer, 19);
  2046. 91、        SetEPTxValid(ENDP1);
  2047. 92、  }
  2048. 93、  //set PowerMode
  2049. 94、  response = LIS3DH_SetMode(LIS3DH_NORMAL);
  2050. 95、  if(response==1){
  2051. 96、        sprintf((char*)buffer,"SET_MODE_OK     \n\r\0");
  2052. 97、        USB_SIL_Write(EP1_IN, buffer, 19);
  2053. 98、        SetEPTxValid(ENDP1);
  2054. 99、  }
  2055. 100、  //set Fullscale
  2056. 101、  response = LIS3DH_SetFullScale(LIS3DH_FULLSCALE_2);
  2057. 102、  if(response==1){
  2058. 103、        sprintf((char*)buffer,"SET_FULLSCALE_OK\n\r\0");
  2059. 104、        USB_SIL_Write(EP1_IN, buffer, 19);
  2060. 105、        SetEPTxValid(ENDP1);
  2061. 106、  }
  2062. 107、  //set axis Enable
  2063. 108、  response = LIS3DH_SetAxis(LIS3DH_X_ENABLE | LIS3DH_Y_ENABLE | LIS3DH_Z_ENABLE);
  2064. 109、  if(response==1){
  2065. 110、        sprintf((char*)buffer,"SET_AXIS_OK     \n\r\0");
  2066. 111、        USB_SIL_Write(EP1_IN, buffer, 19);
  2067. 112、        SetEPTxValid(ENDP1);
  2068. 113、  }
  2069. 114、
  2070. 115、  
  2071. 116、/*********************/  
  2072. 117、/******Example 1******/
  2073. 118、#ifdef __EXAMPLE1__H
  2074. 119、  while(1){
  2075. 120、  //get Acceleration Raw data  
  2076. 121、  response = LIS3DH_GetAccAxesRaw(&data);
  2077. 122、  if(response==1){
  2078. 123、    //print data values
  2079. 124、    //function for MKI109V1 board
  2080. 125、    EKSTM32_LEDToggle(LED1);
  2081. 126、    sprintf((char*)buffer, "X=%6d Y=%6d Z=%6d \r\n", data.AXIS_X, data.AXIS_Y, data.AXIS_Z);
  2082. 127、    USB_SIL_Write(EP1_IN, buffer, 29);
  2083. 128、    SetEPTxValid(ENDP1);  
  2084. 129、    old_position = position;
  2085. 130、  }
  2086. 131、 }
  2087. 132、#endif /* __EXAMPLE1__H  */
  2088. 133、
  2089. 134、
  2090. 135、/*********************/
  2091. 136、/******Example 2******/
  2092. 137、#ifdef __EXAMPLE2__H
  2093. 138、 //configure Mems Sensor
  2094. 139、 //set Interrupt Threshold
  2095. 140、 response = LIS3DH_SetInt1Threshold(20);
  2096. 141、 if(response==1){
  2097. 142、        sprintf((char*)buffer,"SET_THRESHOLD_OK\n\r\0");
  2098. 143、        USB_SIL_Write(EP1_IN, buffer, 19);
  2099. 144、        SetEPTxValid(ENDP1);
  2100. 145、  }
  2101. 146、 //set Interrupt configuration (all enabled)
  2102. 147、 response = LIS3DH_SetIntConfiguration(LIS3DH_INT1_ZHIE_ENABLE | LIS3DH_INT1_ZLIE_ENABLE |
  2103. 148、                                                                           LIS3DH_INT1_YHIE_ENABLE | LIS3DH_INT1_YLIE_ENABLE |
  2104. 149、                                                                           LIS3DH_INT1_XHIE_ENABLE | LIS3DH_INT1_XLIE_ENABLE );
  2105. 150、 if(response==1){
  2106. 151、        sprintf((char*)buffer,"SET_INT_CONF_OK \n\r\0");
  2107. 152、        USB_SIL_Write(EP1_IN, buffer, 19);
  2108. 153、        SetEPTxValid(ENDP1);
  2109. 154、  }
  2110. 155、 //set Interrupt Mode
  2111. 156、 response = LIS3DH_SetIntMode(LIS3DH_INT_MODE_6D_POSITION);
  2112. 157、 if(response==1){
  2113. 158、        sprintf((char*)buffer,"SET_INT_MODE    \n\r\0");
  2114. 159、        USB_SIL_Write(EP1_IN, buffer, 19);
  2115. 160、        SetEPTxValid(ENDP1);
  2116. 161、  }
  2117. 162、
  2118. 163、 while(1){
  2119. 164、  //get 6D Position
  2120. 165、  response = LIS3DH_Get6DPosition(&position);
  2121. 166、  if((response==1) && (old_position!=position)){
  2122. 167、    EKSTM32_LEDToggle(LED1);
  2123. 168、    switch (position){
  2124. 169、    case LIS3DH_UP_SX:   sprintf((char*)buffer,"\n\rposition = UP_SX  \n\r\0");   break;
  2125. 170、    case LIS3DH_UP_DX:   sprintf((char*)buffer,"\n\rposition = UP_DX  \n\r\0");   break;
  2126. 171、    case LIS3DH_DW_SX:   sprintf((char*)buffer,"\n\rposition = DW_SX  \n\r\0");   break;              
  2127. 172、    case LIS3DH_DW_DX:   sprintf((char*)buffer,"\n\rposition = DW_DX  \n\r\0");   break;
  2128. 173、    case LIS3DH_TOP:     sprintf((char*)buffer,"\n\rposition = TOP    \n\r\0");   break;
  2129. 174、    case LIS3DH_BOTTOM:  sprintf((char*)buffer,"\n\rposition = BOTTOM \n\r\0");   break;
  2130. 175、    default:      sprintf((char*)buffer,"\n\rposition = unknown\n\r\0");   break;
  2131. 176、    }
  2132. 177、  
  2133. 178、  //function for MKI109V1 board   
  2134. 179、  USB_SIL_Write(EP1_IN, buffer, 23);
  2135. 180、  SetEPTxValid(ENDP1);  
  2136. 181、  old_position = position;
  2137. 182、  }
  2138. 183、 }
  2139. 184、#endif /*__EXAMPLE2__H */
  2140. 185、
  2141. 186、} // end main
  2142. 187、
  2143. 188、
  2144. 189、#ifdef USE_FULL_ASSERT
  2145. 190、
  2146. 191、
  2147. 192、//function for MKI109V1 board
  2148. 193、/*******************************************************************************
  2149. 194、* Function Name  : assert_failed
  2150. 195、* Description    : Reports the name of the source file and the source line number
  2151. 196、*                  where the assert_param error has occurred.
  2152. 197、* Input          : - file: pointer to the source file name
  2153. 198、*                  - line: assert_param error line source number
  2154. 199、* Output         : None
  2155. 200、* Return         : None
  2156. 201、*******************************************************************************/
  2157. 202、void assert_failed(uint8_t* file, uint32_t line)
  2158. 203、{
  2159. 204、  /* User can add his own implementation to report the file name and line number,
  2160. 205、     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  2161. 206、
  2162. 207、  /* Infinite loop */
  2163. 208、  while (1)
  2164. 209、  {}
  2165. 210、}
  2166. 211、#endif
  2167. 212、
  2168. 213、/******************* (C) COPYRIGHT 2012 STMicroelectronics *****END OF FILE****/
  2169. 214、



复制代码


评分

参与人数 3黑币 +56 收起 理由
vince2008 + 5 很给力!
howenwind + 1 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:139455 发表于 2016-9-14 23:40 | 只看该作者
感谢分享,学习一下
回复

使用道具 举报

板凳
ID:140630 发表于 2016-9-27 14:23 | 只看该作者
感谢分享,非常需要这个~
回复

使用道具 举报

地板
ID:146225 发表于 2016-11-5 11:44 | 只看该作者
感谢分享,学习一下!
回复

使用道具 举报

5#
ID:146240 发表于 2016-11-14 16:59 | 只看该作者
谁有完整的工程 让我借鉴一下 实在是有点不懂
回复

使用道具 举报

6#
ID:148435 发表于 2016-11-17 11:50 | 只看该作者
不是很懂,和楼上一样
回复

使用道具 举报

7#
ID:150833 发表于 2016-11-28 20:15 | 只看该作者
感谢分享,学习一下
回复

使用道具 举报

8#
ID:155693 发表于 2017-3-6 16:39 | 只看该作者
谢谢楼主,正在学习这个芯片。
回复

使用道具 举报

9#
ID:171486 发表于 2017-3-17 11:55 | 只看该作者
产品种类:        加速计       
制造商:        STMicroelectronics       
RoHS:        符合RoHS 详细信息       
传感器类型:        3-axis       
传感轴:        X, Y, Z       
加速:        16 g       
灵敏度:        1 mg/digit to 12 mg/digit       
输出类型:        Digital       
接口类型:        I2C, SPI       
分辨率:        16 bit       
电源电压-最大:        3.6 VDC       
电源电压-最小:        1.71 VDC       
工作电源电流:        6 uA to 11 uA       
封装 / 箱体:        LGA-16       
最大工作温度:        + 85 C       
最小工作温度:        - 40 C       
商标:        STMicroelectronics       
高度:        1 mm       
长度:        3 mm       
安装风格:        SMD/SMT       
工作电源电压:        2.5 V       
封装:        Reel       
系列:        LIS3DH       
工厂包装数量:        4000       
类型:        MEMS Nano Accelerometer       
宽度:        3 mm           ST 华南区芯片销售工程:18926438962 王工
回复

使用道具 举报

10#
ID:177560 发表于 2017-3-21 18:31 | 只看该作者
写的很规范,谢谢分享。
回复

使用道具 举报

11#
ID:189333 发表于 2017-4-13 20:13 | 只看该作者
很不错,受教了
回复

使用道具 举报

12#
ID:201828 发表于 2017-5-17 18:53 | 只看该作者
// i.e. u8_t LIS3DH_ReadReg(u8_t Reg, u8_t* Data);
// i.e. u8_t LIS3DH_WriteReg(u8_t Reg, u8_t Data);
是写入自带的寄存器吗?
回复

使用道具 举报

13#
ID:208480 发表于 2017-6-6 17:22 | 只看该作者
楼主能不能给我传一份啊
回复

使用道具 举报

14#
ID:208480 发表于 2017-6-8 15:47 | 只看该作者
楼主这个驱动要是换成I2C方式,怎么弄
回复

使用道具 举报

15#
ID:373 发表于 2017-7-21 10:31 | 只看该作者
谢谢分享,学习下!!!
回复

使用道具 举报

16#
ID:217405 发表于 2017-9-5 16:43 | 只看该作者
非常感谢,正是我需要的,希望驱动好用
回复

使用道具 举报

17#
ID:266513 发表于 2017-12-25 14:32 | 只看该作者
谢谢群主人分享!正好需要!
回复

使用道具 举报

18#
ID:266625 发表于 2017-12-25 16:44 | 只看该作者
谢谢,正是所需要的,帮了大忙啊!!
回复

使用道具 举报

19#
ID:271847 发表于 2018-1-5 11:24 | 只看该作者
正好需要,谢谢哦
回复

使用道具 举报

20#
ID:320946 发表于 2018-5-3 09:19 | 只看该作者
这个试了,INT1脚不输出上升沿中断,是不是我的硬件焊接有问题?
回复

使用道具 举报

21#
ID:164873 发表于 2018-5-4 07:25 | 只看该作者
谢谢分享,学习下...........................
回复

使用道具 举报

22#
ID:339969 发表于 2018-5-28 17:40 | 只看该作者
不错  不错   很实用
回复

使用道具 举报

23#
ID:240786 发表于 2018-6-26 12:14 | 只看该作者
陀螺仪LIS3DH驱动程序
回复

使用道具 举报

24#
ID:240786 发表于 2018-6-26 12:15 | 只看该作者
不错  不错   很实用
回复

使用道具 举报

25#
ID:382006 发表于 2018-8-2 09:45 | 只看该作者
感谢分享,好不容易找到了。就是积分不够
回复

使用道具 举报

26#
ID:399451 发表于 2018-9-18 12:00 | 只看该作者
很给力!
回复

使用道具 举报

27#
ID:406442 发表于 2018-10-23 11:28 | 只看该作者
学习了,谢谢分享
回复

使用道具 举报

28#
ID:475846 发表于 2019-3-25 14:42 | 只看该作者
学习了,谢谢分享
回复

使用道具 举报

29#
ID:475846 发表于 2019-3-25 14:43 | 只看该作者
很难找到驱动程序,相当可以
回复

使用道具 举报

30#
ID:247549 发表于 2019-7-2 08:30 | 只看该作者
感谢分享,学习一下!
回复

使用道具 举报

31#
ID:311707 发表于 2019-7-16 14:40 | 只看该作者
太好了,写的不错,找了好久 了
回复

使用道具 举报

32#
ID:97078 发表于 2021-3-18 18:22 | 只看该作者
mark下,感谢楼主
回复

使用道具 举报

33#
ID:895495 发表于 2021-4-23 09:59 | 只看该作者
感谢楼主分享,我在ST官网找了好久没找到
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表