I2Cプロトコルでは、スレーブデバイスのレジスタ内容を読み取る前に、レジスタアドレスを書き込む必要があります。アドレスを書き込まずにレジスタの内容を読み取ろうとする操作は、I2Cプロトコルに準拠していません。
スレーブデバイスの特定のレジスタの内容を読み取るには、読み取り操作を実行する前に、読み取りたいレジスタのアドレスをスレーブデバイスに書き込む操作を行う必要があります。
I2Cプロトコルでスレーブデバイスのレジスタ内容を読み取る手順は以下のとおりです。
START -> スレーブの7ビットアドレス -> R/W=0 (書き込み操作) -> ACK -> レジスタアドレス (1バイト) -> ACK -> Sr (再スタート) -> スレーブの7ビットアドレス -> R/W=1 (読み取り操作) -> ACK -> レジスタからのデータ -> NACK (送信するデータがなくなったため、スレーブから) -> STOP。
I2Cプロトコルの詳細については、Texas Instrumentsのドキュメント「Understanding the I2C Bus」を参照してください:Understanding the I2C Bus I2Cバスの理解
readReg
関数は、スレーブから2バイトを読み取るように設計されています。1バイトのみを読み取る場合は、サイズが1バイトに変更されていることを確認する必要があります。
Reg0レジスタは、通常EN/RESETレジスタです。 Reg0を読み取る前に、このレジスタにデータを書き込んだかどうかなど、実行された操作を確認する必要があります。
Reg4など、別のレジスタの内容にアクセスして、レジスタに書き込まれた内容を読み取ることができるかどうかを確認することをお勧めします。
RA6M4のMCP9808温度センサーから生の温度バイトを読み取るためにアドレス0x05のレジスタにアクセスする例:最初に書き込みを実行し、読み取りたいレジスタのアドレスであるスレーブ0x05に書き込み、その後約100ms(タイムアウトをチェックするwhileループがいくつかあるため)で、このレジスタから内容を読み取るプロセスが実行されます。