I'm trying to sample adxl345 accelerometer at 1200Hz using I2C on an arduino with atmega328. The maximum BW_RATE interrupt value I can achieve corresponds to 400 Hz. Here is my code:
#include <avr/interrupt.h>
#include <Wire.h>
const uint8_t addr = 0x1d;
int totalCount = 0;
void setup()
{
Serial.begin(115200);
Wire.begin();
//Serial.println("Wire");
Wire.beginTransmission(addr);
Wire.send(0x2d);
Wire.send(0x08);
Wire.endTransmission();
Wire.beginTransmission(addr);
Wire.send(0x2c); //BW_RATE
Wire.send(0x0E); // E = 800 Hz
Wire.endTransmission();
Wire.beginTransmission(addr);
Wire.send(0x31);
Wire.send(0x0b);
Wire.endTransmission();
Wire.beginTransmission(addr);
Wire.send(0x38);
Wire.send(0x9f);
Wire.endTransmission();
//OCR2 = 77;
//Serial.print(OCR2);
}
void loop()
{
int count = 0;
int i, j, k, time;
byte val, val1;
Wire.beginTransmission(addr);
Wire.send(0x39); // fifo stat, how many samples
Wire.endTransmission();
Wire.requestFrom(addr, (uint8_t) 1);
// i = Wire.available(); // should be 1
count = Wire.receive();
//Serial.println(count);
if (!count)
return;
// Serial.print(count, DEC);
// Serial.print(":");
Wire.beginTransmission(addr);
Wire.send(0x32);
Wire.endTransmission();
// could do 7 instead of 6 and repeat if fifo full
Wire.requestFrom(addr, (uint8_t) 6);
// i = Wire.available(); // should be 6
for (j = 0x32; j < 0x38; j++) { // read these registers
val = Wire.receive();
//Serial.println("Loop");
if (!(j & 1)) { // save off LSB
val1 = val;
continue;
}
i = val;
i <<= 8;
i |= val1;
Serial.print(i, DEC);
Serial.print("\t");
}
//time = millis();
//Serial.print(time);
//Serial.print("\t");
//Serial.print(totalCount);
//Serial.println();
totalCount++;
if (totalCount % 1000)
Serial.print("\r\n");
else
Serial.println();
}
Setting BW_RATE to 800Hz results in sampling still coming in at around 400 Hz over serial.