252 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			252 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*****************************************************************************
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *   Copyright(C) 2011, Embedded Artists AB
							 | 
						||
| 
								 | 
							
								 *   All rights reserved.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 ******************************************************************************
							 | 
						||
| 
								 | 
							
								 * Software that is described herein is for illustrative purposes only
							 | 
						||
| 
								 | 
							
								 * which provides customers with programming information regarding the
							 | 
						||
| 
								 | 
							
								 * products. This software is supplied "AS IS" without any warranties.
							 | 
						||
| 
								 | 
							
								 * Embedded Artists AB assumes no responsibility or liability for the
							 | 
						||
| 
								 | 
							
								 * use of the software, conveys no license or title under any patent,
							 | 
						||
| 
								 | 
							
								 * copyright, or mask work right to the product. Embedded Artists AB
							 | 
						||
| 
								 | 
							
								 * reserves the right to make changes in the software without
							 | 
						||
| 
								 | 
							
								 * notification. Embedded Artists AB also make no representation or
							 | 
						||
| 
								 | 
							
								 * warranty that such application will be suitable for the specified
							 | 
						||
| 
								 | 
							
								 * use without further testing or modification.
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/******************************************************************************
							 | 
						||
| 
								 | 
							
								 * Includes
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "lpc_types.h"
							 | 
						||
| 
								 | 
							
								#include "lpc43xx_i2c.h"
							 | 
						||
| 
								 | 
							
								#include "../inc/acc.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/******************************************************************************
							 | 
						||
| 
								 | 
							
								 * Defines and typedefs
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								#define I2C_PORT (LPC_I2C0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define ACC_I2C_ADDR    (0x1D)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_XOUTL  0x00
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_XOUTH  0x01
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_YOUTL  0x02
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_YOUTX  0x03
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_ZOUTL  0x04
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_ZOUTH  0x05
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_XOUT8  0x06
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_YOUT8  0x07
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_ZOUT8  0x08
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_STATUS 0x09
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_DETSRC 0x0A
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_TOUT   0x0B
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_I2CAD  0x0D
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_USRINF 0x0E
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_WHOAMI 0x0F
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_XOFFL  0x10
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_XOFFH  0x11
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_YOFFL  0x12
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_YOFFH  0x13
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_ZOFFL  0x14
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_ZOFFH  0x15
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_MCTL   0x16
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_INTRST 0x17
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_CTL1   0x18
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_CTL2   0x19
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_LDTH   0x1A
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_PDTH   0x1B
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_PW     0x1C
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_LT     0x1D
							 | 
						||
| 
								 | 
							
								#define ACC_ADDR_TW     0x1E
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define ACC_MCTL_MODE(m) ((m) << 0)
							 | 
						||
| 
								 | 
							
								#define ACC_MCTL_GLVL(g) ((g) << 2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define ACC_STATUS_DRDY 0x01
							 | 
						||
| 
								 | 
							
								#define ACC_STATUS_DOVR 0x02
							 | 
						||
| 
								 | 
							
								#define ACC_STATUS_PERR 0x04
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/******************************************************************************
							 | 
						||
| 
								 | 
							
								 * External global variables
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/******************************************************************************
							 | 
						||
| 
								 | 
							
								 * Local variables
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static Status I2CWrite(uint32_t addr, uint8_t* buf, uint32_t len) 
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  I2C_M_SETUP_Type i2cData;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									i2cData.sl_addr7bit = addr;
							 | 
						||
| 
								 | 
							
									i2cData.tx_data = buf;
							 | 
						||
| 
								 | 
							
									i2cData.tx_length = len;
							 | 
						||
| 
								 | 
							
									i2cData.rx_data = NULL;
							 | 
						||
| 
								 | 
							
									i2cData.rx_length = 0;
							 | 
						||
| 
								 | 
							
									i2cData.retransmissions_max = 3;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static Status I2CRead(uint32_t addr, uint8_t* buf, uint32_t len) 
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  I2C_M_SETUP_Type i2cData;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									i2cData.sl_addr7bit = addr;
							 | 
						||
| 
								 | 
							
									i2cData.tx_data = NULL;
							 | 
						||
| 
								 | 
							
									i2cData.tx_length = 0;
							 | 
						||
| 
								 | 
							
									i2cData.rx_data = buf;
							 | 
						||
| 
								 | 
							
									i2cData.rx_length = len;
							 | 
						||
| 
								 | 
							
									i2cData.retransmissions_max = 3;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return I2C_MasterTransferData(I2C_PORT, &i2cData, I2C_TRANSFER_POLLING);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static uint8_t getStatus(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t buf[1];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    buf[0] = ACC_ADDR_STATUS;
							 | 
						||
| 
								 | 
							
								    I2CWrite(ACC_I2C_ADDR, buf, 1);
							 | 
						||
| 
								 | 
							
								    I2CRead(ACC_I2C_ADDR, buf, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return buf[0];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static uint8_t getModeControl(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t buf[1];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    buf[0] = ACC_ADDR_MCTL;
							 | 
						||
| 
								 | 
							
								    I2CWrite(ACC_I2C_ADDR, buf, 1);
							 | 
						||
| 
								 | 
							
								    I2CRead(ACC_I2C_ADDR, buf, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return buf[0];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void setModeControl(uint8_t mctl)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t buf[2];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    buf[0] = ACC_ADDR_MCTL;
							 | 
						||
| 
								 | 
							
								    buf[1] = mctl;
							 | 
						||
| 
								 | 
							
								    I2CWrite(ACC_I2C_ADDR, buf, 2);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/******************************************************************************
							 | 
						||
| 
								 | 
							
								 * Local Functions
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/******************************************************************************
							 | 
						||
| 
								 | 
							
								 * Public Functions
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/******************************************************************************
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Description:
							 | 
						||
| 
								 | 
							
								 *    Initialize the ISL29003 Device
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								void acc_init (void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* set to measurement mode by default */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    setModeControl( (ACC_MCTL_MODE(ACC_MODE_MEASURE)
							 | 
						||
| 
								 | 
							
								            | ACC_MCTL_GLVL(ACC_RANGE_2G) ));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/******************************************************************************
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Description:
							 | 
						||
| 
								 | 
							
								 *    Read accelerometer data
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Params:
							 | 
						||
| 
								 | 
							
								 *   [out] x - read x value
							 | 
						||
| 
								 | 
							
								 *   [out] y - read y value
							 | 
						||
| 
								 | 
							
								 *   [out] z - read z value
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								void acc_read (int8_t *x, int8_t *y, int8_t *z)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t buf[1];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* wait for ready flag */
							 | 
						||
| 
								 | 
							
								    while ((getStatus() & ACC_STATUS_DRDY) == 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /*
							 | 
						||
| 
								 | 
							
								     * Have experienced problems reading all registers
							 | 
						||
| 
								 | 
							
								     * at once. Change to reading them one-by-one.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    buf[0] = ACC_ADDR_XOUT8;
							 | 
						||
| 
								 | 
							
								    I2CWrite(ACC_I2C_ADDR, buf, 1);
							 | 
						||
| 
								 | 
							
								    I2CRead(ACC_I2C_ADDR, buf, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    *x = (int8_t)buf[0];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    buf[0] = ACC_ADDR_YOUT8;
							 | 
						||
| 
								 | 
							
								    I2CWrite(ACC_I2C_ADDR, buf, 1);
							 | 
						||
| 
								 | 
							
								    I2CRead(ACC_I2C_ADDR, buf, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    *y = (int8_t)buf[0];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    buf[0] = ACC_ADDR_ZOUT8;
							 | 
						||
| 
								 | 
							
								    I2CWrite(ACC_I2C_ADDR, buf, 1);
							 | 
						||
| 
								 | 
							
								    I2CRead(ACC_I2C_ADDR, buf, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    *z = (int8_t)buf[0];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/******************************************************************************
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Description:
							 | 
						||
| 
								 | 
							
								 *    Set the g-Range
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Params:
							 | 
						||
| 
								 | 
							
								 *   [in] range - the g-Range
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								void acc_setRange(acc_range_t range)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t mctl = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mctl = getModeControl();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mctl &= ~(0x03 << 2);
							 | 
						||
| 
								 | 
							
								    mctl |= ACC_MCTL_GLVL(range);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    setModeControl(mctl);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/******************************************************************************
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Description:
							 | 
						||
| 
								 | 
							
								 *    Set sensor mode
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Params:
							 | 
						||
| 
								 | 
							
								 *   [in] mode - the mode to set
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								void acc_setMode(acc_mode_t mode)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t mctl = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mctl = getModeControl();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mctl &= ~(0x03 << 0);
							 | 
						||
| 
								 | 
							
								    mctl |= ACC_MCTL_MODE(mode);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    setModeControl(mctl);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |