AVRのI2C通信によるEEPROMへのアクセス
 

 音声クロックの製作にあたり、I2C通信によるEEPROMへのアクセス方法を勉強した。

I2C通信(AVRではTWIとも言う)
 2本の信号線でデータ通信(比較的低速度)が手軽にできるが、その分ソフト処理が複雑である。
 幸い、AVRにはI2C通信(TWI)のインターフェイスを持った機種があり、それを使えば比較的簡単に実現できる。

試験回路
 
今回は、CPUは音声クロックで使用するMEGA88Pを使い、PCとRS-232Cで接続しデータの書き込み・読み出しの
テストを行った。
 RS-232インターフェイスは、秋月のFT232RLチップを使用したUSB変換モジュールを使いPCと接続した。
 I2Cの接続は、AVRとEEPROMのSCL/SDAをそれぞれ接続し、2.2kΩのプルアップ抵抗を接続した。
 EEPROMは、ATMELのAT24C1024 1Mbit(128kByte)を使用した。
 通信状態(正常終了、異常)がわかるようにLEDを2つ付けた。
 


I2C通信の手順eeprom_write.asmの内容説明)
 AVRのI2C用のレジスタ
  TWBR:ビット速度レジスタ
  TWCR:制御レジスタ
  TWSR:状態レジスタ
  TWDR:アドレス/データレジスタ

 書込処理
 @初期化処理 
  転送速度の設定、今回CPU2MHz動作でTWBR,TWSRを0としてやや遅めの125kHzとした。  2MHz/16+2x0x1=125k
 A送信開始(スタートコンディション) 
  TWCRに開始条件を設定 → TWSRレスポンス $08
 BSLA_W
  TWDRにデバイスアドレスおよびメモリアドレスの17bitをP、およびW/Rに0を設定する。
  デバイスアドレス101000(最下位はA1の状態)+P+0  101000P0
  TWDRを送信 → TWSRレスポンス $18
 Cメモリ上位アドレス送信
  TWDRに上位アドレスを設定  TWDRを送信 → TWSRレスポンス $28
 Dメモリ下位アドレス送信
  TWDRに下位アドレスを設定   TWDRを送信 → TWSRレスポンス $28
 Eデータ送信
  TWDRにデータを設定    TWDRを送信 → TWSRレスポンス $28
   送信するデータ数繰り返す(最大256バイト)
  ※メモリ下位アドレスは書込実施後、インクリメント(+1)される。但し、$ffの次は$0となるが上位アドレスは変わらない
   よって、通常$00から$FFまで256バイトの書込(ページライト)
 
F停止処理
  TWCRに終了条件に設定
 
  1ページ(256バイト)を超えるデータを送信する場合は、ライトサイクル(10ms)以上待ってからAから繰返

 読込処理
  読出アドレスの設定(ダミーライト処理) 上記@〜D
 G再送開始
  TWCRに再送開始条件を設定 → TWSRレスポンス $10
 HSLA_R
  TWDRにデバイスアドレスおよびメモリアドレスの17bitをP、およびW/Rに1を設定する。
  デバイスアドレス101000(最下位はA1の状態)+P+1  101000P1
  TWDRを送信 → TWSRレスポンス $40
 Iデータ受信
  TWDRを読込、TWCRにACK応答設定 → TWSRレスポンス $50
   受信するデータ数−1回繰返す
   受信後メモリアドレスは順次インクリメントされる。(17bit・上位も含めインクリメントされデータ数の制限なし)
 J最終データ受信
  TWDRを読込、TWCRにNACK応答設定 → TWSRレスポンス $58
 K停止処理
  TWCRに終了条件に設定
  ※停止処理をせず、違うアドレスからの読出を継続して行う場合は、Gへ

 全体処理の流れ(データ書込、照合)
  PCから1バイトづつ読込、ページライト(256バイト)を繰り返し$1fe00まで行う。
  書込データを読出、PCに送信する。
  PC側の処理は、VBAのマクロで作成。 転送ソフト
   読み書き処理が、すべて正常に終わればLED_OKが点灯。VBAでは「一致しました」と表示
  途中でエラー(TWSRのレスポンスが異なった場合)となれば、LED_ERRが点灯する。
  また、エラーの情報(処理コード、TWSR)をCPUのEEPROMに保存されるのでそれによって、内容が確認できる。 
   コード:意味:正常な状態符号
      1:送信開始:$08、2:SLA+W:$18、3:SLA+R:$40、4:データ送信:$28
      5:データ受信:$50、6:ラストデータ送信$58、11:再送開始:$10