山根さんの本を読みながら、AVRのTWI(I2C)i/f
のデータと処理の流れについて整理していました。
gccやarduino等のコンパイラを使ってしまえばそれほど
難しいものでもないのですが、アセンブラで組むとなると
状況はちょっと違ってきまして…
というのは、以前TINY2313用に作ったスプライト
表示器や背景表示器↓
http://picavr.uunyan.com/avr_m_sprite.html
http://picavr.uunyan.com/avr_m_bg.html
をMEGA48用に作り変えつつ、TWIi/f対応かつ
カラー表示にも対応しようかと思っていて…
これらはシビアなタイミングで動かさないといけないので、
NOP命令などで1クロック単位でタイミング調整しながら
動いている代物。当然フルアセンブラなんです。
USARTならダブルバッファが効いていているし、
制御は物凄く簡単に済ませられるのですが、TWI
(I2C)となると話は別。通信プロトコルを
1ビット単位で解ってないと…。
というわけで、改めて山根さんの本の解説文やサンプル
プログラムを熟読し、データと処理の流れを理解
し直してました。
とりあえず、バスマスター側(こっちは高級言語で良い)
とスレーブ側(こっちは上記のとおりフルアセンブル)と、
その間を流れるTWIバス(I2Cバス)上の電圧の状態や、
バスを更新するのがマスタなのかスレーブなのか、
それはソフト側で処理するのか、内蔵ハードが勝手に
処理してくれるのか、等など、かなり厄介なことを図に
まとめてみました。
あ、そうそうすみません。AVR専用です。さらに、
ハードウェアTWI登載機だけです。
(USIのTWIモードはクロックもマスター側が
ソフトで生成する必要があるとか、スレーブ側は
スレーブアドレスをソフトで判別しないとならない
とか…色々制約があって正直実用性に乏しい…)
マスターからスレーブに1バイトのデータを送信(書き込み)
する時のスキームです。2バイト以上続けて送る時には
色が濃くなっているところを繰り返すだけ(のはず)です。
この図だけご覧になっても「なんのこっちゃ」だと思うので、
いずれサイト上に解説付きでアップしておきたいと思います。
(①~⑦がなんなのかも書いてませんし…)
まぁ、私の頭の中はかなりすっきり整理できました。
山根さんの本だと、マスター側はマスター側だけ、
スレーブ側はスレーブ側だけで分けて描かれていたり、
解説文が「マスター」の話なのか「スレーブ」の
話なのか明示されていなかったり(主にマスター側の
処理が書かれているのですが)と、なかなかか
解読が大変だったのですが、こんな風に整理しておけば
ひとまずデータ送受信処理をプログラムする際の情報
として役に立ちそうです(アセンブラでも)。
ちなみに、エラー処理は全然考慮してません。
(ステータスが多すぎて…)
マルチバスマスターの調停なども考慮してません。
(処理の枝分かれが多すぎて…)
いずれにしても、山根さんの本に纏められている
表4-6-1~表4-6-4のステータスコード一覧
は便利。
さすが本のタイトルに「リファレンス」を謳っている
だけのことはあります。
書き込みはこんな感じで良いんですが、この逆にデータを
読み出す場合はさらにもう少し厄介な処理が必要なんですよね。
最終的には、スプライトや背景表示を、シリアルEEPROM
のICと同じようなアクセス方法で制御できるように
したいと思っています。そうすれば、gccやarduino
等からでも簡単に使えますし、シリアルEEPROM等も
スプライト表示器並行してバス上に並べて使うことも
出来ますし。
どうなることやら…
|