PiicoDev LIS3DH i2c not working

PiicoDev LIS3DH not working

I am using the I2C communication protocol to communicate between my uno r3 and the piccodev LIS3DH (an 3 axis accelerometer that operates with i2c). I'm also using a logic level shifter to switch between the 5V of the arduino and the 3.3V that the LIS3DH runs on. When I tried to get acceleration values, it didn't work, then I tried an I2C scanner and it said No I2C devices were found. Anyone know how I can fix this issue? Another thing I should add is that while checking the voltage that the sda and cam pin was at it showed 3.3V.

Here is my wiring:

Arduino UNO: Logic shifter: LIS3DH.:
A4. B3. SDA
A5. B2. SCL
GND. GND
5V HV.
3.3V LV
3.3V VCC

Here is the i2c scanner code: (I just copy and pasted it from the internet and i'm not sure if I need any adjustment)

// SPDX-FileCopyrightText: 2023 Carter Nelson for Adafruit Industries
//
// SPDX-License-Identifier: MIT
// --------------------------------------
// i2c_scanner
//
// Modified from https://playground.arduino.cc/Main/I2cScanner/
// --------------------------------------

#include <Wire.h>

// Set I2C bus to use: Wire, Wire1, etc.
#define WIRE Wire

void setup() {
  WIRE.begin();

  Serial.begin(9600);
  while (!Serial)
     delay(10);
  Serial.println("\nI2C Scanner");
}


void loop() {
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    WIRE.beginTransmission(address);
    error = WIRE.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

Can you show a photo ? Perhaps there is something wrong with the level shifter.

I tried using a voltage meter to test if the values where changing and they were working.

Any other idea's on why it might not be working?

Did you try the I2C pins SDA and SCL on the other side of the board by the usb connector?

yeah I have tried that a few times.

What logic level shifter is that?
Usually the pins are labeled LVx and HVx.

Edit: I2C requires a bidirectional shifter.

TXB0104 Bi-Directional Level Shifter - TXB0104 | Adafruit ADA1875 | Core Electronics Australia (core-electronics.com.au)

This One.

From the level shifter page you posted:

Only thing that doesn't work well with this chip is i2c (because it uses strong pullups which confuse auto-direction sensor)

You need "bidirectional" AND "i2c compatible". Sparkfun and Adafruit have those.

Maybe I sent the wrong link because the back of the logic level shifter says Works with I2C.

Like this?

yeah, that looks like it.

That looks like it?
Does yours have BSS138 on it?
Or TXB0104?

It has BSS138

That looks like the correct i2c scanner code.
Then either bad connection or device failure.

yeah. Ok, just one more thing. What voltage should my SDA and SCL pins be getting at each stage of the program? Is there any way to tell?

Cheers, Matthew.

BSS138 datasheet states 10k pullups on the data pins, so on the Uno side, 5 volts, and the accelerometer will be 3.3 volts through a 10k resistor.
.

Yeah, that is what mine is showing.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.