« 2014年4月 | トップページ | 2014年6月 »

2014年5月

2014年5月17日 (土)

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) | トラックバック (0)

« 2014年4月 | トップページ | 2014年6月 »