秋月で256Kbit EEPROMの"AT24C256"が売られていたので、ATmega88pのI2C通信の練習用に買ってみました。
しばらくブレッドボード上で接続したまま放っておいたのですが、5月の連休を利用して動かしてみました。
なんとか1文字を放り込んで取り出すのが精一杯ですが、まぁなんとか動いています。
今回、参考にしたのは以下のサイトです。
全体の構成
おおまかには"ATmega88p"+"AT24C256"+"AE-UM2232R"をブレッドボード上に接続しています。
"AE-UM232R"はデバッグ用のメッセージを出力させるために使用しています。
このコードは以前作成したものを使い回しました。
EEPROMもAVRもATMEL社製なので、データシートはどちらも同じような体裁で、どちらも読み易く構成されていると思いました。
英語なので細かいところまでは読まずに斜め読みでしたが、こんなドキュメントが構成できるようになりたいものです。
最初はデータシートとAVRのI2C通信について書かれたコードを手本に進めたのですが、
いくつかはまってしまうポイントがありました。
- AVRマイコン側
- twi.hの使い方
- デバッグ用USART(シリアル)通信の文字化け
- MT, MRモード用コードの送信タイミング
- EEPROM側
- "A0","A1"ピンの意味
- SDA/SCLピンのプルアップ
twi.hの使い方
AVRでI2C通信をしようとAVR Freaksに辿り着くとtwi.hを使わずにコーディングしている方がいました。
まぁうまく動かないから投稿されていたわけですが、さすがにそのパワーはありません。
I2C通信をしたくてWinAVRを使っているならtwi.hを使うべしというのは、いろいろ検索してすぐに分かったのですが、微妙にコードが古かったり、RTCと接続したりする例があって、使えるかどうか微妙な感じでした。
I2C通信を始めるならコードをコピーするのではなく最初はいろいろ試行錯誤するのがお勧めです。
デバッグ用シリアル通信で文字化け
これは原因不明ですが、突然デバッグ用に使っていたkermitに出力される文字列が化けてしまいました。
出力自体はされているのですが、プログラムを以前テストした単純にエコーバックするものをロード仕直しましたが、それも上手く動きませんでした。
電源はAE-UM232Rから3.3Vを取っていたので、一度USBケーブルを抜き差しして電源を入れ直して、kermitを立ち上げ直してみたところうまく動きました。こんな事もあるんだなぁ。
MT, MRモード用コードの送信タイミング
ATmega88pのデータシートにはTWDRにSTARTコードをセットした後、TWDRにSLA_W、SLA_Rを設定する事でMaster TransmitterモードあるいはMaster Receiverモードを切り替えるようなサンプルコードが載っています。twi.hの中には"SLA+W", "SLA+R"の文字列でコメントがありますが、該当しそうなものは"TW_WRITE"、"TW_READ"のマクロがあります。
AT24C256のデータシートにはSTARTコードの後にデバイス指定のコードを加えて8bitを送信するように書かれています。 後から参考にしたリンク先のコードをみてわかったのですが、このタイミングでWRIETモードの時は"0xA0"、READモードの時は"0xA1"を送信する事で解決しました。
"A0","A1"ピンの意味
AT24C256のチップを複数バスに接続するために、固有のデバイス番号を振るために使う事ができます。 何にも接続しないとGNDになるようになっているようですが、微妙な条件があったので安心のためにはGNDと接続してしまうのが良さそうです。
このピンをプルアップすると、STARTコードの次に送るSLA_W, SLA_Rとして送信するコードが"0xA0", "0xA1"から変化します。
今度秋月に注文する時にAT24C256を追加して、バスらしくI2C通信を使ってみようと思います。
SDA/SCLピンのプルアップ
よくデータシートを読めばよかったのですが、SDA, SCLピンのプルアップの必要性に気がつくのに少し時間がかかりました。
プログラムを試す前にデータシートを読み直していて気がつきましたが、判っていれば当然な事だと思います。
しかしわかっていないと延々に見落してしまうところかもしれません。
0 件のコメント:
コメントを投稿