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