ADXL345数据读出I2C的配置
0赞
发表于 2/25/2012 9:05:11 AM
阅读(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;
}
}
读出的数据如下:

