PDG2で生成されるI2C通信関数について

PDG2が生成するI2C通信の送信関数"R_PG_I2C_MasterSend_CX"について、第二パラメータのスレーブアドレスに0x55を設定してもSDAのラインでは0x54で通信してしまうようです。
EEPROMへの通信は最後尾ビットがLowで間違いないかと思うのですが、他I2Cデバイスに対応できるようにする方法はないでしょうか?
PDG2が生成するI2C通信関数はEEPROM用途でしか考慮されていないのでしょうか?

  • わわいです
    IICという規格上、スレーブアドレスの最下位ビットは、書き込み/読み出しの判定ビットとなってます
    ということで、スレーブアドレスは常に偶数でなければなりません。
    これはEEPROMには限りません。IICであればどのようなデバイスでも共通です。

    ということで、奇数のスレーブアドレスというのはあなたの勘違いですので、その、他I2Cデバイスというモノのデータシートをよく読んでみてください。
  • PDG2のマニュアルには以下のように書かれています。

     「 スレーブアドレスは、7ビットアドレスの場合は指定した値の7~1ビットが出力されます。

    スレーブアドレスが0x55なら、0xAAを指定するという事です。

    I2Cのスレーブアドレス指定ではLSBはアドレスフェーズのRnWビット用に空けてある事が多いのでこういう仕様なのだと思います。

  • 御回答有難うございます。もう一度データシートを読み直します。
  • Samuraiさん、こんにちは。NoMaYと申します。

    以前に私が関わったスレッドでボッシュさんのBMP180気圧センサのデータシートを見たことがあるのですが、以下のようになっていました。もし差支えが無いようでしたら、ご使用予定のデバイスの名前やデータシートのURLなど教えて頂くことは出来ませんか?

    BMP180データシートPDF - Bosch
    画面コピー


  • 他の方も書かれている通り、マスター送信において、最初にスレーブアドレスを送信するときb7~b1がアドレスで、b0が送信/受信を示すビットになります。

    送信なのでb0に0が自動設定されると思います。

    これがマスター受信の場合は、b0が1になります。

  • I2Cのスレーブアドレス指定ではRnWビットがLSBに入る事が、奇数アドレスは無いという勘違いを生む原因になってます。

    スレーブアドレスだけ考えればA[6:0]で当然奇数はあるのですが、厄介なのはI2CデバイスのデータシートでもRnWビット込みの8bitでスレーブアドレスを表記している物もあるという事です。

    I2Cマスタコントローラではアドレスフェーズの送信データはRnWビット込みの8bitで扱う方が都合が良いので、制御レジスタやAPIの仕様もRnWビット込みの8bit扱いになっている事が多いです。

    要するに、「I2Cのスレーブアドレス」と言った時には「7bitのアドレスだけ」を指しているのか、「RnWビット込みの8bit」の事を指しているのかを意識する必要があるという事です。

    RnWビットがMSBにあればこんな混乱する事も無いのにと思いましたが、スレーブ側では自身が選択されているかどうかを1bitでも早く検出したいという事なのでしょうね。

  • Samuraiさん、こんにちは。NoMaYです。

    すみません。必ずしもSamuraiさんが御使用予定のデバイスでなくても、具体的なデバイスを自力で探せばよかったことに気付きました。ググってみたところ、NXPさんの加速度センサMMA8491Qが見付かりました。これが、このスレッドに役立ちそうだと思いましたので、引用してみました。

    MMA8491QデータシートPDF - NXP
    画面コピー


  • チョコです。
    何を使うかはあまり気にする必要はなく,Samuraiさんが,0x55が7ビットでのアドレスならば,単純にこの後に
    0を追加して,0xAAを設定すればいいのではないでしょうか。
    ちなみに,EEPROMは通常上位4ビットが0xAのようです(ビット3-1は内部のアドレスで使用したり,複数使いの
    選択用に使用しています)。
    ところで,MMA8491Qの[7:1]Device Addressが「01010101」と8ビットあるのはおかしいですね。ここは,「1010101」
    が正しい記述でしょうね。
  • 回答頂いた方々大変深謝致します。スレーブアドレス0xAAで試したところ、送信先デバイスからACKが返ってきたようです。
    また何かありましたら宜しくお願い致します。