标题: LIS3DH datasheet及初始化 [打印本页] 作者: leeking19 时间: 2016-11-12 15:51 标题: LIS3DH datasheet及初始化 /* Copyright (c) [2014 iCreative]. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* File Name :
* Author :
* Version : $Revision:$
* Date : $Date:$
* Description :
*
* HISTORY:
* Date | Modification | Author
* 28/03/2014 | Initial Revision |
/* Send received value back to the caller */
*Data = SPISlaveBuffer[1];
return true;
}
/*******************************************************************************
* Function Name : LIS3DH_WriteReg
* Description : Generic Writing function. It must be fullfilled with either
* : I2C or SPI writing function
* Input : Register Address, Data to be written
* Output : None
* Return : None
*******************************************************************************/
u8_t LIS3DH_WriteReg(u8_t WriteAddr, u8_t Data)
{
SPIWriteLength = 2;
SPIReadLength = 0;
SPIMasterBuffer[0] = WriteAddr;
SPIMasterBuffer[1] = (Data);
spi_master_enable(SPI0);
/* Check if we got an ACK or TIMEOUT error */
ASSERT(spi_master_tx_rx((uint32_t *)NRF_SPI0,SPIWriteLength,SPIMasterBuffer,SPISlaveBuffer));
spi_master_disable(SPI0);
/*******************************************************************************
* Function Name : LIS3DH_GetStatusAUX
* Description : Read the AUX status register
* Input : Char to empty by status register buffer
* Output : None
* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t LIS3DH_GetStatusAUX(u8_t* val)
{
/*******************************************************************************
* Function Name : LIS3DH_SetTemperature
* Description : Sets LIS3DH Output Temperature
* Input : MEMS_ENABLE, MEMS_DISABLE
* Output : None
* Note : For Read Temperature by LIS3DH_OUT_AUX_3, LIS3DH_SetADCAux and LIS3DH_SetBDU
functions must be ENABLE
* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t LIS3DH_SetTemperature(State_t state)
{
u8_t value;
ret = MEMS_SUCCESS;
out:
spi_master_disable(SPI0);
return ret;
}
/*******************************************************************************
* Function Name : LIS3DH_SetAxis
* Description : Enable/Disable LIS3DH Axis
* Input : LIS3DH_X_ENABLE/DISABLE | LIS3DH_Y_ENABLE/DISABLE | LIS3DH_Z_ENABLE/DISABLE
* Output : None
* Note : You MUST use all input variable in the argument, as example
* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t LIS3DH_SetAxis(LIS3DH_Axis_t axis)
{
u8_t value;
if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG1, &value) )
return MEMS_ERROR;
value &= 0xF8;
value |= (0x07 & axis);
/*******************************************************************************
* Function Name : LIS3DH_SetFilterDataSel
* Description : Set Filter Data Selection bypassed or sent to FIFO OUT register
* Input : MEMS_SET, MEMS_RESET
* Output : None
* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t LIS3DH_SetFilterDataSel(State_t state)
{
u8_t value;
/*******************************************************************************
* Function Name : LIS3DH_SetInt2Pin
* Description : Set Interrupt2 pin Function
* Input : LIS3DH_CLICK_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_INT1_ON_PIN_INT2_ENABLE/DISABLE |
LIS3DH_I2_INT2_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_BOOT_ON_INT2_ENABLE/DISABLE |
LIS3DH_INT_ACTIVE_HIGH/LOW
* example : LIS3DH_SetInt2Pin(LIS3DH_CLICK_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_INT1_ON_PIN_INT2_ENABLE/DISABLE |
LIS3DH_I2_INT2_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_BOOT_ON_INT2_ENABLE/DISABLE |
LIS3DH_INT_ACTIVE_HIGH/LOW)
* Note : To enable Interrupt signals on INT2 Pad (You MUST use all input variable in the argument, as example)
* Output : None
* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t LIS3DH_SetInt2Pin(LIS3DH_IntPinConf_t pinConf)
{
u8_t value;
/*******************************************************************************
* Function Name : LIS3DH_SetIntConfiguration
* Description : Interrupt 1 Configuration (without LIS3DH_6D_INT)
* Input : LIS3DH_INT1_AND/OR | LIS3DH_INT1_ZHIE_ENABLE/DISABLE | LIS3DH_INT1_ZLIE_ENABLE/DISABLE...
* Output : None
* Note : You MUST use all input variable in the argument, as example
* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t LIS3DH_SetIntConfiguration(LIS3DH_Int1Conf_t ic)
{
u8_t value;
/*******************************************************************************
* Function Name : LIS3DH_GetStatusReg
* Description : Read the status register
* Input : char to empty by Status Reg Value
* Output : None
* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t LIS3DH_GetStatusReg(u8_t* val)
{
if( !LIS3DH_ReadReg(LIS3DH_STATUS_REG, val) )
return MEMS_ERROR;
return MEMS_SUCCESS;
}
/*******************************************************************************
* Function Name : LIS3DH_GetStatusBIT
* Description : Read the status register BIT
* Input : LIS3DH_STATUS_REG_ZYXOR, LIS3DH_STATUS_REG_ZOR, LIS3DH_STATUS_REG_YOR, LIS3DH_STATUS_REG_XOR,
LIS3DH_STATUS_REG_ZYXDA, LIS3DH_STATUS_REG_ZDA, LIS3DH_STATUS_REG_YDA, LIS3DH_STATUS_REG_XDA,
LIS3DH_DATAREADY_BIT
val: Byte to be filled with the status bit
* Output : status register BIT
* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t LIS3DH_GetStatusBit(u8_t statusBIT, u8_t* val)
{
u8_t value;
/*******************************************************************************
* Function Name : LIS3DH_GetInt1SrcBit
* Description : Reset Interrupt 1 Latching function
* Input : statusBIT: LIS3DH_INT_SRC_IA, LIS3DH_INT_SRC_ZH, LIS3DH_INT_SRC_ZL.....
* val: Byte to be filled with the status bit
* Output : None
* Return : Status of BIT [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t LIS3DH_GetInt1SrcBit(u8_t statusBIT, u8_t* val)
{
u8_t value;
/*******************************************************************************
* Function Name : LIS3DH_GetFifoSourceBit
* Description : Read Fifo WaterMark source bit
* Input : statusBIT: LIS3DH_FIFO_SRC_WTM, LIS3DH_FIFO_SRC_OVRUN, LIS3DH_FIFO_SRC_EMPTY
* val: Byte to fill with the bit value
* Output : None
* Return : Status of BIT [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t LIS3DH_GetFifoSourceBit(u8_t statusBIT, u8_t* val)
{
u8_t value;
/*******************************************************************************
* Function Name : LIS3DH_GetFifoSourceFSS
* Description : Read current number of unread samples stored in FIFO
* Input : Byte to empty by FIFO unread sample value
* Output : None
* Return : Status [value of FSS]
*******************************************************************************/
status_t LIS3DH_GetFifoSourceFSS(u8_t* val)
{
u8_t value;
/* Set data rate and power mode, and enable X/Y/Z */
ASSERT(LIS3DH_WriteReg(LIS3DH_CTRL_REG1,
LIS3DH_CTRL_REG1_DATARATE_50HZ| /* Normal mode, 10Hz */
LIS3DH_CTRL_REG1_XYZEN)); /* Enable X, Y and Z */
// Settings for CTRL_REG2:
// defaults
ASSERT(LIS3DH_WriteReg(LIS3DH_CTRL_REG2, 0));
// Settings for CTRL_REG3
ASSERT(LIS3DH_WriteReg(LIS3DH_CTRL_REG3, 0));
// Settings for CTRL_REG4:
// ----------------------------------------------------------------------------------------
//CTRL_REG4| 7 6 5 4 3 2 1 0 |
// | BDU BLE FS1 FS2 HR ST1 ST0 SIM|
// ----------------------------------------------------------------------------------------
// FS1:FS2 -->g'range selection 00-->2g;01-->4g;10-->8g;11-->16g:
// HR = 1 --> high resolution
// SIM -->if ==1 serial interface mode is selected(SPI)
/* Settings for CTRL_REG4 Enable block update and set range to +/-2G */
ASSERT(LIS3DH_WriteReg(LIS3DH_CTRL_REG4, 0x08));
//TIME_LIMIT
//Time limit a short time frame where in which click is recognised when
//1.corresponding value in that axis exceeds threshold and
// 2.comes below threshold.
// To get detected both should happen in this time limit.
ASSERT(LIS3DH_WriteReg( LIS3DH_TIME_LIMIT , 0x33 ));
/* Initialise SPI */
/*!< Sample data at rising edge of clock and shift serial data at falling edge */
/*!< MSb first */
uint32_t *spi_base_address = spi_master_init(SPI0,SPI_MODE0,false);
if (spi_base_address == 0) {
return false;
}
/* get device WHO_AM_I first to see if it exists! */
ASSERT(LIS3DH_ReadReg(LIS3DH_WHO_AM_I,&whoami));
ASSERT(whoami == 0x33);