MSP430 ADXL345 驱动

#include "ADXL345.h"


/*
 * 345只需要接五根线,其余乱七八糟的不用接
 * P1.4接SCL
 * P1.5接SDA
 * 3.3接3.3V
 * CS接3.3V
 * GND接GND
 */


#define SCL1	P1OUT	|= BIT4
#define SCL0	P1OUT	&= ~BIT4
#define SCLOUT	P1DIR	|= BIT4

#define SDA1	P1OUT	|= BIT5     /* IIC数据引脚 */
#define SDA0	P1OUT	&= ~BIT5
#define SDAIN	P1DIR	&= ~BIT5
#define SDAOUT	P1DIR	|= BIT5
#define SDADATA (P1IN & BIT5)

#define I2C2_SLAVE_ADDRESS7 0xA6
/* 0x3A//ALT  ADDRES */

#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

/*
 * **************************************
 * I2C起始信号
 * **************************************
 */
void I2C_Start()
{
	SDAOUT;
	SDA1;                   /* 拉高数据线 */
	SCLOUT;
	SCL1;                   /* 拉高时钟线 */
	delay_us( 5 );          /* 延时 */
	SDA0;                   /* 产生下降沿 */
	delay_us( 5 );          /* 延时 */
	SCL0;                   /* 拉低时钟线 */
}


/*
 * **************************************
 * I2C停止信号
 * **************************************
 */
void I2C_Stop()
{
	SDAOUT;
	SDA0;                   /* 拉低数据线 */
	SCLOUT;
	SCL1;                   /* 拉高时钟线 */
	delay_us( 5 );          /* 延时 */
	SDA1;                   /* 产生上升沿 */
	delay_us( 5 );          /* 延时 */
}


/*
 * **************************************
 * I2C发送应答信号
 * 入口参数:ack (0:ACK 1:NAK)
 * **************************************
 */
void I2C_SendACK( uchar ack )
{
	SDAOUT;
	SCLOUT;
	if ( ack )
		SDA1;
	else
		SDA0;
	/*    SDA = ack;                  //写应答信号 */
	SCL1;                   /* 拉高时钟线 */
	delay_us( 5 );          /* 延时 */
	SCL0;                   /* 拉低时钟线 */
	delay_us( 5 );          /* 延时 */
}


/*
 * **************************************
 * I2C接收应答信号
 * **************************************
 */
uchar I2C_RecvACK()
{
	uchar cy;
	SCLOUT;
	SCL1;                   /* 拉高时钟线 */
	SDAIN;
	delay_us( 5 );          /* 延时 */
	if ( SDADATA )
	{
		cy = 1;
	}else  {
		cy = 0;
	}
	/*    cy = SDA;                   //读应答信号 */
	SCL0;                   /* 拉低时钟线 */
	delay_us( 5 );          /* 延时 */
	SDAOUT;
	return(cy);
}


/*
 * **************************************
 * 向I2C总线发送一个字节数据
 * **************************************
 */
void I2C_SendByte( uchar dat )
{
	uchar i;
	SDAOUT;
	for ( i = 0; i < 8; i++ )   /* 8位计数器 */
	{
		if ( (dat << i) & 0x80 )
		{
			SDA1;
		}else  {
			SDA0;
		}
		/* SDA = cy;               //送数据口 */
		SCLOUT;
		SCL1;           /* 拉高时钟线 */
		delay_us( 5 );  /* 延时 */
		SCL0;           /* 拉低时钟线 */
		delay_us( 5 );  /* 延时 */
	}
	I2C_RecvACK();
}


/*
 * **************************************
 * 从I2C总线接收一个字节数据
 * **************************************
 */
uchar I2C_RecvByte()
{
	uchar	i;
	uchar	dat = 0, cy;
	SDAOUT;
	SCLOUT;
	SDA1;                           /* 使能内部上拉,准备读取数据, */
	SDAIN;
	for ( i = 0; i < 8; i++ )       /* 8位计数器 */
	{
		dat <<= 1;
		SCL1;                   /* 拉高时钟线 */
		delay_us( 5 );          /* 延时 */
		if ( SDADATA )
		{
			cy = 1;
		}else  {
			cy = 0;
		}
		dat |= cy;              /* 读数据 */
		SCL0;                   /* 拉低时钟线 */
		delay_us( 5 );          /* 延时 */
	}
	SDAOUT;
	return(dat);
}


/*
 * **************************************
 * 向I2C设备写入一个字节数据
 * **************************************
 */
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();                     /* 发送停止信号 */
}


/*
 * **************************************
 * 从I2C设备读取一个字节数据
 * **************************************
 */
uchar I2C_ReadByte( uchar SlaveAddress, uchar REG_Address )
{
	uchar REG_data;
	I2C_Start();                                    /* 起始信号 */
	I2C_SendByte( SlaveAddress );                   /* 发送设备地址+写信号 */
	I2C_SendByte( REG_Address );                    /* 发送存储单元地址,从0开始 */
	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 );            /* rate */
	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 )       /* 读取ADXL345地址看是否有连接成功 */
	{
		delay_ms( 200 );
		return(1);
	}
	return(0);
}


short jiasu_xyz[3];


void ADXL345_GetValue( void )
{
	//float	x;
	//float	y;
	//float	z;

	short	xyz	= 0; /* linshizhi */
	short	qqq	= 0;

	xyz	= (short) I2C_ReadByte( 0xA6, DATAX1 );
	xyz	<<= 8;
	xyz	+= (short) I2C_ReadByte( 0xA6, DATAX0 );
	qqq	= (short) xyz;
	//x	= qqq * 3.9;
        jiasu_xyz[0]	= qqq;

	xyz	= (short) I2C_ReadByte( 0xA6, DATAY1 );
	xyz	<<= 8;
	xyz	+= (short) I2C_ReadByte( 0xA6, DATAY0 );
	qqq	= (short) xyz;
	//y	= qqq * 3.9;
        jiasu_xyz[1]	= qqq;

	xyz	= (short) I2C_ReadByte( 0xA6, DATAZ1 );
	xyz	<<= 8;
	xyz	+= (short) I2C_ReadByte( 0xA6, DATAZ0 );
	qqq	= (short) xyz;
	//z	= qqq * 3.9;
	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

猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/104888418
今日推荐