Adxl345 I2C Max datarate

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.

The I2C library for the arduino runs the I2C bus at only 100KHz, therefore you can't get more data through it. It is possible to hack it to run at four times the speed, that is 400KHz. Not all I2C devices will work at that speed but yours will.