N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
<< AVRマイコン プログラムでEEPROMが読めても書けなかったのは | main | Make: Tokyo Meeting 07 出展 >>
I2C マスタ・レシーバで可変長のデータを送受信するには?
AVRでI2Cの通信を実装してる最中、可変長のデータを転送する方法でちょっと悩んだ。

I2Cの仕様では、「Start条件からStop条件間の1回の転送で伝送できるバイト数には制限がなく、何バイトでも送ることができます。」とある。これ自体は何ら問題がない。

転送するデータ長(バイト数)が固定でなく、応答に応じて変化する場合は、ACKかNOACKを返すことにより転送の打ち切りを示すことが出来る。これもAgree.

この辺のことは、こちらにとてもわかりやすくまとまっている。

上記で1つ問題になるのは、マスタ・レシーバ状態、すなわちスレーブ側からマスタにデータ転送する場合にスレーブ側から転送を終了するモードである。

例えば、スレーブ側が可変長の文字列をマスタに返すことを考えてみる。
返される文字列の長さはマスターは知らず、スレーブしか知らない。
このような使用例は沢山あると思うのだが…

マスタ・レシーバのデータ転送中にACK/NOACKを返すのは常にマスタであるので、スレーブ側はNOACKを返すこともできず、ひたすらマスタからの要求に従って結果を返し続けなくてはならない。

一体、どうすれば良いのだろう?

I2Cの仕様書を見てみたが、やっぱりわからない。

あれこれ実験してみたが、そこは省略。

最終的には、
スレーブは、最後のデータを送信した後は0xFFしか返さないように実装。
マスタは、受信で0xFFが返ってきたら、もうデータが無いと判断して、Stop条件で転送を完了するように実装する。

特に0xFFでなくても良いのだが、スレーブが応答しないときもSDAがHiに張り付いて0xFFになるので、これに合わせるのが順当だろう。

なお、この方法では0xFFが特殊な意味に使われてしまうので、バイナリデータ転送では使えない。この場合には、データの最初にデータ長を指定するなどの方法で対処するしかなさそうだ。

いずれにせよ、もっとスマートな方法は無いのだろうか?




| その他 | 09:29 | - | - |
PROFILE
Follow
CATEGORIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND