I have a nano matter.
I have nothing connected to it other than usb c.
I want to connect an OLED i2c display i bought. Before i connect it i want to run the i2c scanner to confirm the address.
The few examples i find compile and run but they say there is a device on every address.
Like this: (truncated)
I2C device found at address 0x5E !
I2C device found at address 0x5F !
I2C device found at address 0x60 !
I2C device found at address 0x61 !
I2C device found at address 0x62 !
I2C device found at address 0x63 !
I2C device found at address 0x64 !
I2C device found at address 0x65 !
I am using the latest IDE 2.3.3.
The manual doesn't say anything about i2c.
Are the typical arduino examples not compatible with nano matter?
The sequence is easy enough to explain because a standard I2C scanner (here is one: Arduino Playground - I2cScanner) builds an address starting at 1, tries it, then proceeds likewise until 127 . I don't know enough to explain the systematic false detections in this case, though.
// --------------------------------------
// 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
}
Was there any resolution to this? I'm trying the same on Wire and Wire1 and on two different boards. There is literally nothing connected to it and it's finding things on every address.
I2C / SMBUS is an open drain interface. This means that while there is a logic low level defined, there is no logic high but rather high impedance. For this reason, external pull-up resistors are required on the SCL / SDA lines to soft park the lines. If you are running without true I2C hardware mated to the board and the pull-ups are missing then it is just noise being falsely detected by the processor. You should find that the phantom I2C nodes will disappear once you apply the required pull-up resistors of say 2k2 - 10k each on the SCL and SDA lines.