データシートなしでI2Cアドレスを決定

I2C通信を設定するときは、デバイスのデータシートを持っていて、その方法でデバイスのI2Cアドレスを見つけることが確実に理想的であることを知っています。ただし、リバースエンジニアリングアプリケーションの中には、利用可能なデータシートがないものがあります。 (または、あなたはそれを見つけることができないかもしれません...)

Without the datasheet, how do you determine the default I2C address of a device? Also, what tool(s)/equipment do you need? (e.g. is a microcontroller with I2C support enough, or do you need an oscilloscope?)

4
@crasic私の現在の知識レベルでは、これは1回行われ、アドレスは書き留められるでしょう...起動時のI2Cの決定は難しいように思えます。 :)(あまり関係がないのであれば、その方向へのヒントもあれば助かります。)
追加された 著者 Anders D,
Bus Pirateには、I2Cアドレスを検索するためのコマンド(「1」)があります。 dangerousprototypes.com/bus-pirate-manual/i2c-guide
追加された 著者 reconbot,
@Passerbyアドレスを取得すると、どのデバイスがタイプ別に存在しているかを把握するのに役立ちます。その後、データシート検索がより有益になります。 (私は、OPが物理的な検査によってどのデバイスがバス上に存在しているかを判断できないと思います。)
追加された 著者 jason saldo,
任意のホストのIPアドレスを見つけるのと同じ方法:難しい方法。
追加された 著者 Dan,
それを書き留めたり、デバイスの電源を入れるたびに新しいデバイスのi2cアドレスを決定したりするために、これを1回実行しようとしていますか?
追加された 著者 MaryBeth,
アドレスは、i2cデバイスのごく一部です。データシートがないと、どのコマンドを送信すればよいのでしょうか。
追加された 著者 Eloise Coramsfield,

4 答え

マイクロコントローラ用のI2C「ping」ユーティリティを書くのはかなり簡単です。あなたがする必要があるのは〜128までのアドレスを通してそしてそれぞれのためにスキャンすることです:

  1. I2C開始条件を送信する
  2. アドレスを表す1バイトを送信し、ACK/NAKを取得します。
  3. 停止条件を送信します。

ACKがある場合(9番目のクロックサイクルでデータラインがLowに保持されている)、そのアドレスを持つデバイスがI2Cバス上に存在します。 ACKがない場合は、デバイスは存在しません。

Don't forget that I2C addresses are in the upper 7 bits of the byte (the last bit is for read/write). Also, don't forget to ignore the special I2C addresses in your scan: http://www.i2c-bus.org/addressing/

ハードウェアに関してはほとんど何でもうまくいくでしょう。あなたのデバイスがI2Cをサポートしていなくても、それはあなたがそれを少し強打することができるところでそれは十分に簡単な(そして十分に遅い)プロトコルです。使用するものすべてがI2Cラインをハイに、ローにしか駆動しないことを確認してください(仕様に従って)。

10
追加された
@Passerby良い点です。多くのI2Cデバイスには少なくとも1つのハードウェア選択可能アドレスビットがあり、EEPROMなどにはそれ以上のものがあります。私が使用したEEPROMには4があります。どんな種類のハードウェアスキャンでも、現在設定されているアドレスしか取得できず、そのデバイスで使用可能なアドレスはすべて取得できません。
追加された 著者 Fase,
ちょっとしたメモ、i2cデバイスが何をするのかを知ることも助けになるでしょう。たとえば、i2c Eepromsは複数のアドレスを確認できます。
追加された 著者 Eloise Coramsfield,
はい、そうですが、大きいi2c eepromは、同じアドレスを持つ複数の小さいi2c eepromと同じように機能します。 4kb eepromは1つのアドレスにしか応答しませんが、32kb eepromは4kb eepromと同じアドレスを含む複数のアドレスに応答します。これは、ページがアドレスの一部であるためです。
追加された 著者 Eloise Coramsfield,

手動でしたくない場合は、

  • ラズベリーパイを作ろう
  • sudo i2cdetect -y 0を実行します
  • sudo i2cdetect -y 0を実行しても動作しない場合は、sudo i2cdetect -y 1を実行してください
7
追加された

これが私が使用するArduinoのコードの断片です:

for (int address=1; address <= 126; address++) {
  Wire.beginTransmission(address);//Select address
  if (!Wire.endTransmission()) Serial.printf("Found device at: %02Xh\n", address); 
}
2
追加された

SCL/SDAをArduinoボードに接続し、I2Cデバイスの電源を入れてから、Arduinoボードで次のコードを実行します。

// i2c_scanner
 //
//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.
 //
//This sketch tests the standard 7-bit addresses
//from 0 to 127. Devices with higher bit address
//might not be seen properly.
 //
//Adapted to be as simple as possible by Arduino.cc user Krodal

#include 

void setup()
{
    Wire.begin();
    Serial.begin(115200);
    Serial.println("\nI2C Scanner");
}

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

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

    nDevices = 0;
    for(address = 0; address <= 127; 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("Unknow 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(30000);
 }
1
追加された