ADXL345 Accelerometer No Longer Giving Readings

I just began using the ADXL345 using the basic code provided here and was getting results output to the Serial Monitor.

// Add the SPI library so we can communicate with the ADXL345 sensor
#include <SPI.h>

// Assign Chip Select to pin 10
int CS = 9;

// This is a list of some of the registers available on the ADXL345.
// To learn more about these and the rest of the registers on the ADXL345, read the datasheet!
char POWER_CTL = 0x2D;    // Power Control Register
char DATA_FORMAT = 0x31;
char DATAX0 = 0x32;   // X-Axis Data 0
char DATAX1 = 0x33;   // X-Axis Data 1
char DATAY0 = 0x34;   // Y-Axis Data 0
char DATAY1 = 0x35;   // Y-Axis Data 1
char DATAZ0 = 0x36;   // Z-Axis Data 0
char DATAZ1 = 0x37;   // Z-Axis Data 1

// This buffer will hold values read from the ADXL345 registers.
char values[10];

// These variables will be used to hold the x,y and z axis accelerometer values.
int x, y, z;

void setup()
{
  Serial.begin(9600);

  // Initiate an SPI communication instance
  SPI.begin();

  // Configure the SPI connection for the ADXL345
  SPI.setDataMode(SPI_MODE3);

  // Setup the Chip Select pin to be an output from the Arduino
  pinMode(CS, OUTPUT);

  // Before communication starts, the Chip Select pin
  //  needs to be set high
  digitalWrite(CS, HIGH);

  // Put the ADXL345 into +/- 2G range by writing
  //  0x00 to the DATA_FORMAT register.
  writeRegister(DATA_FORMAT, 0x00);

  // Put the ADXL345 into Measurement Mode by writing 0x08 to
  //  the POWER_CTL register.
  writeRegister(POWER_CTL, 0x08);
}

void loop()
{
  // Reading 6 bytes of data starting at register DATAX0 will
  //  retrieve the x,y,z acceleration values
  // The results of the read operation will get stored to the values[] buffer.
  readRegister(DATAX0, 6, values);

  // 10-bit acceleration values are stored as bytes.
  //  to get the full value, two bytes must be combined for each axis.
  // The X value is stored in values[0] and values[1]
  x = ((int)values[1] << 8) | (int)values[0];
  //The Y value is stored in values[2] and values[3].
  y = ((int)values[3] << 8) | (int)values[2];
  //The Z value is stored in values[4] and values[5].
  z = ((int)values[5] << 8) | (int)values[4];

  //Print the results to the terminal.
  Serial.print(x, DEC);
  Serial.print(',');
  Serial.print(y, DEC);
  Serial.print(',');
  Serial.println(z, DEC);
  delay(100);
}



// This function will write a value to a register
//  Parameters:
//   char registerAddress - The register to write a value to
//   char value - The value to be written to the specified register
void writeRegister(char registerAddress, char value)
{
  // Set Chip Select pin low to signal the beginning of an SPI packet
  digitalWrite(CS, LOW);

  // Transfer the register address over SPI
  SPI.transfer(registerAddress);
  // Transfer the desired register value over SPI
  SPI.transfer(value);

  // Set the Chip Select pin high to signal the end of an SPI packet
  digitalWrite(CS, HIGH);
}



// This function will read a certain number of registers starting
// from a specified address and store their values in a buffer.
//  Parameters:
//   char registerAddress - The register address to start the read sequence from.
//   int numBytes - the number of registers that should be read.
//   char * values - A pointer to a buffer where the results of
//    the operation should be stored.
void readRegister(char registerAddress, int numBytes, char * values)
{
  // Since we're performing a read operation, the most significant bit
  //  of the register address should be set.
  char address = 0x80 | registerAddress;
  // If we're doing a multi-byte read, bit 6 needs to be set as well.
  if (numBytes > 1) address = address | 0x40;

  // Set the Chip select pin low to start an SPI packet.
  digitalWrite(CS, LOW);
  // Transfer the starting register address that needs to be read.
  SPI.transfer(address);
  // Continue to read registers until we've read the number specified
  //  storing the results to the input buffer.
  for (int i = 0; i < numBytes; i++)
  {
    values[i] = SPI.transfer(0x00);
  }
  // Set the Chips Select pin high to end the SPI packet.
  digitalWrite(CS, HIGH);
}

I changed

  //Print the results to the terminal.
  Serial.print(x, DEC);

into

  //Print the results to the terminal.
  Serial.print(x);

in order to see what the value of x was without being converted. When I did this the serial monitor began printing all 0,0,0.

Now when I reupload the original code it does not work and first outputs -53,-53,-53 and then continuously prints 0,0,0.

I've tried pressing the reset button on the board, unplugging it, and switching the chip select pin just hoping for something to work again.

Is there some significance to the initial -53,-53,-53 reading, and is there anything I can do to troubleshoot this?

Thanks

Double check the wiring. You are using a 3.3V Arduino, or logic level shifters, of course.

Yes, it has remained plugged into the 3.3V source on the Arduino. I checked the rest of the connections and they're all where they are shown in the diagram.

That doesn't answer the question completely. If you are using a 5V Arduino, are you using level shifters on the logic connections?

If not, there is a good chance that the accelerometer has been destroyed.

Sparkfun has an extremely bad policy of ignoring this basic fact of electronics in many of their tutorials, even though they sell the level shifters.

No, I wasn't using level shifters unfortunately. I've been looking into it and trying to understand their uses. From what I can understand the 3.3V source on the Arduino does its job by only sending at most the 3.3V to the Vcc pin, but the CS pin was receiving 5V since it was connected to directly to an output pin, and likely fried the chip. Am I correct in my understanding?

The CS pin was receiving 5V since it was connected to directly to an output pin

If you use the SPI interface, the Arduino MOSI and CLK pins are also ~5 V.

It is possible that this has not destroyed the ADXL345, so you should cross your fingers and check all the other connections and devices for problems. On the other hand, you may have damaged a pin on the Arduino (less likely).

In any case, you should always employ level shifters, or at least a series resistor to limit the current (in the range of 1K - 10K) for every 5V -> 3.3V connection.

I've posted a complaint about that tutorial (and others) on the Sparkfun forum. Who knows if they care?

Thanks for your help and information!