#include "ADXL345.h"
#define SCL1 P1OUT |= BIT4
#define SCL0 P1OUT &= ~BIT4
#define SCLOUT P1DIR |= BIT4
#define SDA1 P1OUT |= BIT5
#define SDA0 P1OUT &= ~BIT5
#define SDAIN P1DIR &= ~BIT5
#define SDAOUT P1DIR |= BIT5
#define SDADATA (P1IN & BIT5)
#define I2C2_SLAVE_ADDRESS7 0xA6
#define DEVID 0x00
#define THRESH_TAP 0x1D
#define OFSX 0x1E
#define OFSY 0x1F
#define OFSZ 0x20
#define DUR 0x21
#define Latent 0x22
#define Window 0x23
#define THRESH_ACT 0x24
#define THRESH_INACT 0x25
#define TIME_INACT 0x26
#define ACT_INACT_CTL 0x27
#define THRESH_FF 0x28
#define TIME_FF 0x29
#define TAP_AXES 0x2A
#define ACT_TAP_STATUS 0x2B
#define BW_RATE 0x2C
#define POWER_CTL 0x2D
#define INT_ENABLE 0x2E
#define INT_MAP 0x2F
#define INT_SOURCE 0x30
#define DATA_FORMAT 0x31
#define DATAX0 0x32
#define DATAX1 0x33
#define DATAY0 0x34
#define DATAY1 0x35
#define DATAZ0 0x36
#define DATAZ1 0x37
#define FIFO_CTL 0x38
#define FIFO_STATUS 0x39
void I2C_Start()
{
SDAOUT;
SDA1;
SCLOUT;
SCL1;
delay_us( 5 );
SDA0;
delay_us( 5 );
SCL0;
}
void I2C_Stop()
{
SDAOUT;
SDA0;
SCLOUT;
SCL1;
delay_us( 5 );
SDA1;
delay_us( 5 );
}
void I2C_SendACK( uchar ack )
{
SDAOUT;
SCLOUT;
if ( ack )
SDA1;
else
SDA0;
SCL1;
delay_us( 5 );
SCL0;
delay_us( 5 );
}
uchar I2C_RecvACK()
{
uchar cy;
SCLOUT;
SCL1;
SDAIN;
delay_us( 5 );
if ( SDADATA )
{
cy = 1;
}else {
cy = 0;
}
SCL0;
delay_us( 5 );
SDAOUT;
return(cy);
}
void I2C_SendByte( uchar dat )
{
uchar i;
SDAOUT;
for ( i = 0; i < 8; i++ )
{
if ( (dat << i) & 0x80 )
{
SDA1;
}else {
SDA0;
}
SCLOUT;
SCL1;
delay_us( 5 );
SCL0;
delay_us( 5 );
}
I2C_RecvACK();
}
uchar I2C_RecvByte()
{
uchar i;
uchar dat = 0, cy;
SDAOUT;
SCLOUT;
SDA1;
SDAIN;
for ( i = 0; i < 8; i++ )
{
dat <<= 1;
SCL1;
delay_us( 5 );
if ( SDADATA )
{
cy = 1;
}else {
cy = 0;
}
dat |= cy;
SCL0;
delay_us( 5 );
}
SDAOUT;
return(dat);
}
void Single_WriteI2C( uchar SlaveAddress, uchar REG_Address, uchar REG_data )
{
I2C_Start();
I2C_SendByte( SlaveAddress );
I2C_SendByte( REG_Address );
I2C_SendByte( REG_data );
I2C_Stop();
}
uchar I2C_ReadByte( uchar SlaveAddress, uchar REG_Address )
{
uchar REG_data;
I2C_Start();
I2C_SendByte( SlaveAddress );
I2C_SendByte( REG_Address );
I2C_Start();
I2C_SendByte( SlaveAddress + 1 );
REG_data = I2C_RecvByte();
I2C_SendACK( 1 );
I2C_Stop();
return(REG_data);
}
char ADXL345_Init( void )
{
Single_WriteI2C( 0xA6, 0x31, 0x0B );
Single_WriteI2C( 0xA6, 0x2C, 0x08 );
Single_WriteI2C( 0xA6, 0x2D, 0x08 );
Single_WriteI2C( 0xA6, 0x2E, 0x00 );
Single_WriteI2C( 0xA6, 0x1E, 0x00 );
Single_WriteI2C( 0xA6, 0x1F, 0x00 );
Single_WriteI2C( 0xA6, 0x20, 0x05 );
if ( I2C_ReadByte( 0xA6, 0x00 ) != 0xe5 )
{
delay_ms( 200 );
return(1);
}
return(0);
}
short jiasu_xyz[3];
void ADXL345_GetValue( void )
{
short xyz = 0;
short qqq = 0;
xyz = (short) I2C_ReadByte( 0xA6, DATAX1 );
xyz <<= 8;
xyz += (short) I2C_ReadByte( 0xA6, DATAX0 );
qqq = (short) xyz;
jiasu_xyz[0] = qqq;
xyz = (short) I2C_ReadByte( 0xA6, DATAY1 );
xyz <<= 8;
xyz += (short) I2C_ReadByte( 0xA6, DATAY0 );
qqq = (short) xyz;
jiasu_xyz[1] = qqq;
xyz = (short) I2C_ReadByte( 0xA6, DATAZ1 );
xyz <<= 8;
xyz += (short) I2C_ReadByte( 0xA6, DATAZ0 );
qqq = (short) xyz;
jiasu_xyz[2] = qqq;
}
#ifndef __ADXL345_H
#define __ADXL345_H
#include "msp430.h"
#include "sys.h"
char ADXL345_Init(void);
void ADXL345_GetValue(void);
#endif