Акселерометр ADXL345 представляет собой 3-осевой датчик ускорения с возможностью связи как по интерфейсу SPI, так и по I2C. Он довольно дешев и прост в эксплуатации, поэтому хорошо подходит для несложных приложений инерциальной навигации.

Представленный код позволяет наладить взаимодействие между ADXL345 и микроконтроллером (в данном случае код для PIC16 и компилятора CCS PICC, но при желании можно переделать под любой МК) по шине I2C. С помощью него можно инициализировать, настраивать акселерометр, записывая в него данные по определенному адресу, и считывать данные с самого акселерометра.
#define ADXL_SDA PIN_C4
#define ADXL_SCL PIN_C3
#define ADXL_CS PIN_C0
#use i2c(master, sda=ADXL_SDA, scl=ADXL_SCL)
void init_adxl345()
{
output_float(ADXL_SCL);
output_float(ADXL_SDA);
output_high(ADXL_CS);
}
BOOLEAN adxl345_ready()
{
int1 ack;
i2c_start(); // Если команда записи распознана,,
ack = i2c_write(0x3a); // значит устройство готово.
i2c_stop();
return !ack;
}
void write_adxl345(BYTE address, BYTE data)
{
while(!adxl345_ready());
i2c_start();
i2c_write(0x3a);
i2c_write(address);
i2c_write(data);
i2c_stop();
}
BYTE read_adxl345(BYTE address)
{
BYTE data;
while(!adxl345_ready());
i2c_start();
i2c_write(0x3a);
i2c_write(address);
i2c_start();
i2c_write(0x3b);
data=i2c_read(0);
i2c_stop();
return(data);
}
int16 read_adxl345_axis(BYTE address)
{
BYTE msb,lsb;
while(!adxl345_ready());
i2c_start();
i2c_write(0x3a);
i2c_write(address);
i2c_start();
i2c_write(0x3b);
lsb=i2c_read(1);
msb=i2c_read(0);
i2c_stop();
return((msb<<8)|lsb);
}
Перевод © digitrode.ru