2

デバイスの動作を構成するために別のデバイスの EEPROM に書き込もうとしており、Arduino Uno でデバイスを制御しています。

このウェブページによると、SCK はピン 13 に接続され、SDA はピン 11 に接続されています。

この例から取ったi2c_eeprom_write_byteとの2 つの関数があります。i2c_eeprom_read_byte

void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
    Wire.begin(deviceaddress); // MUST INCLUDE, otherwise Wire.endTransmission hangs
    // called once, in setup
    int rdata = data;
    Wire.beginTransmission(deviceaddress);

    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB    
    Wire.write(rdata);

    Wire.endTransmission(false);

}
byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
    byte rdata = 0xFF;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    delay(10);
    Wire.requestFrom(deviceaddress,1);


    int avail = Wire.available();
    Serial.println(avail);
    if (Wire.available()) rdata = Wire.read();

    // there's a bug here with Wire.available. It's returning 0 (ie, 0 bytes to be read),
    // when it should be returning 1, since I want 1 byte.

    return rdata;
}

私の問題は、Wire.available()常に 0 を返すことです。これは、スレーブ デバイスがマスター デバイスである Arduino に何も送信していないことを意味します。

スレーブデバイスから読み取るにはどうすればよいですか?

4

2 に答える 2

0

オシロスコープやロジック アナライザーを使用せずにハードウェアをデバッグするのは困難です。

簡単な二重チェックは、コード化したアドレスを構成するためにアドレス ピンが配線されていることを確認することです。運が良ければ、間違ったアドレスを見つけて修正するだけで、すべてが機能し始めます。

デバッグ方法に注意してください。これ

delay(10);

あなたが追加したのは、100 kbit/s (またはそれ以上) で動作するデバイスにとっては膨大な時間です。遅延は、デバッグに役立つだけでなく、通信を妨害する可能性もあります。デバイスについては言及していませんが、その大きな一時停止に耐えられるかどうかを確認してください。メモリへの書き込みは実行に時間がかかる場合がありますが、読み取りは 100 kHz のクロック レートと比較してほぼ瞬時です。

同様に、トランザクションの途中でこれを追加します

 println(...

問題の一部になる可能性があります。デフォルトの 9600 ボーでシリアルを使用している場合、その 1 文字を送信すると I2C トランザクションが中断されます。

スコープを持っている場合、私が提供できる唯一のトリックは、プルアップ抵抗を、SDA と SCL を論理 1 の電圧にプルする抵抗分圧器のペアに置き換えることですが、Vcc とは等しくありません (あなたの場合は 5 V ですか?) . たとえば、ラインを 4.8 V に保持する 1 組の抵抗を選択します。この配置により、バスを駆動するデバイスがない場合と、ロジック 1 を駆動するデバイスの違いがわかります。

于 2013-06-01T06:51:44.103 に答える