freedomhit

ADXL345数据读出I2C的配置

0
阅读(14485)
#include "ADuC7026.h"
#include "I2C_Master.h"

//Device address for ADXL345
#define I2CWRITEADDR 0xA6     // I2C address for wirte
#define I2CREADADDR  0xA7     // I2C address for read

//I2C process step, used for ADuC702X I2C master
#define I2C_IDLE    	0         //I2C idle
#define I2C_WRITE1  	1         //write 1 byte
#define I2C_WRITE2  	2         //write 2 byte
#define I2C_READ    	3         //I2C read
#define I2C_SET_ADDR    4         //set I2C read register address


unsigned char  I2CWriteValue;       //data to write 
signed char  ReadRegister;           //data read back from register
unsigned char Status =I2C_IDLE;      //I2C process step, initialize with Idle

//write "WriteValue" to "RegisterAddr" of ADXL345
void I2C_WRITE_REGISTER(unsigned char RegisterAddr, unsigned char WriteValue) 
{

    Status = I2C_WRITE1;             //write 1 byte
	I2CWriteValue = WriteValue;     //set  Writevalue
	I2C1ADR = I2CWRITEADDR;        // set device address for I2C write
	I2C1MTX = RegisterAddr;        // set regsiter address

	while(I2C_IDLE != Status)	   // wait until I2C command finish 
	{
	    ;
	}

}

// Set register address for I2C read command
void I2C_SET_READ_ADDR(unsigned char RegisterAddr) 
{
	Status = I2C_SET_ADDR;                     //  set I2C read register address

	I2C1ADR = I2CWRITEADDR;               //set device address for I2C write
	I2C1MTX = RegisterAddr;          //set regsiter address

	while (I2C_IDLE != Status)			 // wait until I2C command finish 
	{
	    ;
	}
}

//Read register from ADXL345
signed char I2C_READ_REGISTER(unsigned char RegisterAddr)   
{
	

	I2C_SET_READ_ADDR(RegisterAddr);	 //  set I2C read register address
	Status = I2C_READ;                       //I2C read
	I2C1ADR = I2CREADADDR;                  //set device address for I2C read
     
	
	while (I2C_IDLE != Status)			   // wait until I2C command finish
	{
	    ;
	}


	return ReadRegister;			 //return result
  
	
}       

//I2C interrupt
 void FIQ_Handler() __fiq      
{

	// Master Transmit  
	if(((I2C1MSTA & 0x4) == 0x4) && (Status == I2C_WRITE1) )	// 1 byte (register address) has been send out, then send the 2 byte (write value)
	{
		Status = I2C_WRITE2;
		I2C1MTX = I2CWriteValue;
	}		
	else if(((I2C1MSTA & 0x4) == 0x4) && (Status == I2C_WRITE2))	// 	2 byte (write value) has been send out, write command finished
	{						  
	    Status = I2C_IDLE;
	}	

	else if(((I2C1MSTA & 0x4) == 0x4) && (Status == I2C_SET_ADDR))   // set I2C read register address finished
	{
	    Status = I2C_IDLE;
	}

    // Master Receive    
	else if (((I2C1MSTA & 0x8) == 0x8) && (Status == I2C_READ))		// 	read command finished, 
	{	   
       	ReadRegister =  I2C1MRX;
        Status = I2C_IDLE;		  
	}     
} 
  

读出的数据如下: