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