I2C / スレーブモードのときのプログラミング手順

pp.608-609

非公式訳
スレーブモードのときは、I2Cの初期化とデータの送受信とができなければなりません。STARTコンディションもSTOPコンディションも送信できません。スレーブデバイスはバスをlistenしながら、マスターデバイス、general callのどちらかによってアドレス指定されるのを待っていなければなりません。

初期化する

I2Cモジュールをスレーブモードとして初期化するときは、下の手順を実行しなければなりません。

  1. TWARレジスタに値を設定してスレーブアドレスを設定する。前に述べたように、TWARの上位7ビットがスレーブアドレスであり、残りの1ビットがTWGCEビットです。このビットを1にセットした場合は、general callアドレス($00)に応答します。それ以外の場合はgeneral callアドレスは無視されます。
  2. TWCRレジスタTWENビットを1にセットしてI2Cモジュールを有効化する。
  3. TWCRレジスタTWENTWINTTWEAの各ビットを1にセットする。これで、I2Cが有効化されるとともにACKが生成される設定になります。
    手順2、3は一度には実行できませんので注意してください。I2Cモジュールを有効化してから手順3を実行しなければなりません。

バスをlistenする

スレーブデバイスは、I2Cモジュールが初期化されたあと、バスをlistenしながらマスターデバイスからアドレス指定されるのを待たなければなりません。スレーブデバイスは、自分のアドレスがバスに流れてきたのを見つけると、ACKを返してからTWCRレジスタTWINTフラグを1にセットします。スレーブがマスターデバイスからアドレス指定されたかどうかを知るためには、TWINTフラグをポーリングで監視している必要があります。

データを送信する

マスターデバイスからアドレス指定され、読み出し要求を受けた場合は、以下の手順を実行して1バイトのデータを送信しなければなりません。

  1. 1バイトデータをTWDRにコピーする。
  2. TWCRレジスタTWENTWEATWINTの各ビットを1にセットしてバイトデータの送信を開始する。データを受信したあとにACKを受信しなくてもよい場合は、TWEAはクリアしたままにしておいても問題ありません。その理由は、マスター側でのACKの生成には影響しないからであり、I2Cモジュールの内部状態が変化するにすぎないからです。ただしTWCRレジスタTWEAビットはとにかく1にセットすることを推奨します。
  3. TWCRレジスタTWINTフラグをポーリングで監視しながら、バイトデータの送信が完了したかどうかを確認する。

データを受信する

マスターデバイスからアドレス指定され、書き込み要求を受けた場合は、以下の手順を実行して1バイトのデータを受信しなければなりません。

  1. TWCRレジスタTWENビットおよびTWINTビットを1にセットして1バイトの受信を開始する。データを受信したあとACKを返したい場合は、TWCRレジスタTWEAビットも1にセットする必要があります。
  2. TWCRレジスタTWINTフラグをポーリングで監視しながら、バイトデータの受信が完了したかどうかを確認する。
  3. 受信したバイトデータをTWDRから別のレジスタ(または別の変数)へコピーして保存する。