Hardware or software problem that TWI does not work

Recently I tried i2c communication, but it didn't work despite everything being perfect.

I got the logic analyzer, plugged it in, and got some weird results.

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    https://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
 
#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  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
}

The code above is the i2c scanner I used.

This is what it looked like when I first uploaded it to Uno R3. Naturally, everything is connected correctly.


No signal is output and SCL is HIGH.

(The image was not uploaded, so I uploaded it as an external link.)
This is what it looked like when I linked to arduino clone I had, and it's trying to scan normally.

Something is wrong. The A4 and A5 pins of uno are even working normally.

I found this myself while searching for the i2c's freezing problem.
https://forum.arduino.cc/t/arduino-uno-i2c-wire-endtransmission-freeze/247620

I will continue using other working devices, but I was wondering if there is any information on any hardware or firmware errors reported for the same situation as mine.

Check your pull up resistors, if they are correct post a schematic showing all connections, not a frizzy picture. Also post links to technical information on all hardware devices.

Questions:

  1. What I2C device do you have connected to your Arduino?
  2. What Arduino board are you using.
  3. If there is a I2C device connected, what pins are they/it connected to?
  4. Please describe what you define as not working? i.e. valid device connected but not found by scanner etc.
  5. Is your Arduino and your I2C device both 5V or both 3.3V? i.e. could you have one 5V and one 3.3v?

1. As a first step of trouble shooting, check if you can make the following I2C setup (between two Arduinos, Fig-1) working. And then remove UNO-Slave and connect yout I2C sensors one-by-one.


Figure-1:

2. Upload the following sketch in UNO-Master.

#include <Wire.h>

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  //--------------
  Wire.beginTransmission(0x23);  //roll call Slave
  byte busStatus = Wire.endTransmission();
  //--------------
  if(busStatus !=0)
  {
    Serial.print("Slave is not found at address 0x23!");
    while(1);  //wait for ever
  }
  Serial.print("Slave is found at address 0x23.");
}

void loop()
{
}

3. Upload the following sketch in UNO-Slave.

#include <Wire.h>

void setup()
{
  Serial.begin(9600);
  Wire.begin(0x23);  //Slave address is 0x23
}

void loop()
{
}

4. Check that SM1 (Serial Monitor 1) of Master shows the following message:
Slave is found at address 0x23.

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