8ピンATTINYでi2cスレーブ
I2C経由の、3ビットほどのスイッチ入力が必要になる。
適当なI/Oエクステンダを物色...PCA9536あたりか。
わざわざ調達するほどのものでもないような気がしてきたので、手持ちのATTINY85で、
i2cスレーブを作ってみる。
汎用シリアルのUSIをつかうために、マニュアルを読む。
UARTやSPI、I2Cとして動作できるとある。
netの情報では、UARTとして使う作例がよくあるようだ。
しかしこりゃ、通信ペリフェラルというより、ただのカウンタ付のシフトレジスタだな...
クロック同期通信ならともかく、UARTとして使うのは、かえってたいへんなような。
ボーレートジェネレータっぽい動作をさせるために、タイマーはこれに取られるみたいだし。
------
さて、i2cスレーブとして使う場合は、バス上のスタートコンディションを、割り込みイベントとして拾うように設定。
まずはここから始める。
この割り込みハンドラ内で、クロックカウンタのオーバーフロー割り込みを許可設定して、8ビット分の受信が終わるのを待つ。
オーバーフローが発生したら、SDAの入出力を切り替え、ACKを返す準備をする。
この時、次のオーバーフローカウンタの初期値を0x0fとしておいて、ACKスロットが終了したら割り込みが発生するようにする。
この時の受信データが、スレーブアドレス+R/Wなので、自分あてのアドレスかどうかチェック。
自分あてなら、ACKを返して処理を継続。
違うなら何もせずNACKを返し、次のスタートコンディションの割り込みを許可し、イベントを待つ。
以下これの繰り返し。
また、次の8ビットが読み込みの場合、カウンタのクロック動作エッジの設定を切り替えないと、うまくいかないようだ。
(データ出力側は、半クロック早く動作しないといけないため。)
------
8ビット(データ)と、1ビット(ACKスロット)交互に割り込みを発生させて、半自動でi2cをハンドリングする感じ。
i2cマスターなら、ソフトウエアで実装してもいいけど、スタートコンディション検出など、スレーブ側はちょっと苦しい。
オーバーフローも割り込みが使えるから、完全にソフトウエアでi2cを実現するよりは、かなりましだ。
------
しかし誤算が一つ。
8MHzの内蔵クロックでは、100KHzクロックでの動作が限界の様だ。
まあ、100KHzが本来のi2cの上限クロックだから、ダメってわけじゃないんだが...
今あるようなチップは、最低でも400KHzクロックに対応しているので、ちょっと残念ではある。
性能はともかく、8ピンのATTINYで、色々自由度の高いi2cスレーブとして動かすことはできた。
何かの時に使えることもあるかな。
| 固定リンク | 0
コメント