2010年09月15日

I2C→RS232C変換(メモ)

Jz4725B の中華PMPのシリアルは空いていないことが多い。汎用的に使えそうな I/O は I2C だけ。

    RxD が LCD バックライトの PWM に使われていたりする。TxD は、空いているような気がするが、カーネルメッセージを垂れ流していたりしそう。I2C は、FMラジオ(大概オプションになっている) 接続に使っているので、使えるのだ。

    I2C 経由で付けてみたいデバイスは、Bluetooth , キーパッド(or フルキーボード) , GPS , Gセンサ , 温度/湿度計 , 電圧/電流計 ぐらいか。

    温度/湿度計 は ロギングが目的なのだが ... バックライト OFF でいったいどれぐらいバッテリーが持つのだろう? 一度ちゃんと調べてみたい。

      A-33 で ちょっとやってみている。5 時間で 目盛り 1 つ減っただけ。11 時間で目盛り2つ。14 時間で目盛り 3 つ減った。だが 15時間は持たなかった。
      ちなみに、状態は LCD のバックライトを Off にして IDLE 状態。サスペンドしているわけではない。400mAH の容量を 15時間で使うとすれば 平均 26mA 流れていることになる。.. これはまぁそんなものか。
      -- ただどうもおかしい。1 時間ほどで Full 充電になった。今度は A-41 でやってみる。


そういうものにデバイスを付けたい場合、マイクロコントローラでスレーブI2C デバイスを作り、シリアルなどに変換してやる必要がある。

一例として、RS232C を付けたい場合どうしたら良いのか考察してみる。

I2C の性質について


  • I2Cスレーブは、マスタが決めたタイミングで データを返さないといけない。だから、データが用意できるまでホストを待たせるようなことはできず、既にあるデータしか返せない。

  • データの受け取りも同様で、バッファリングできる分しか一時には受け取れない。

  • READ/WRITE はパケットの属性で、SPI のように コマンドを送っての READ という操作はできない。

    ただし、複数のパケットの送受信を連続して行うことはできる。

  • 送られたデータの受け取り拒否はだけはできる。WRITE の場合、スレーブは、バッファ以上のデータを受け取らないことはできるが、READ で 存在しないデータの READ が来てもなんらかのデータを返さなければならない。


こういう性質のもので、一般に 多数の機能がある I2C スレーブ IC などは次のような使い方をする。

  • WRITE する場合、レジスタ番号(or ファンクション番号) を 第一バイトに設定する。次からのデータは、レジスタに書き込むデータ(or その機能に対して送るデータ)。

  • メモリのようなデバイスは、第二、第三バイトにアドレスを設定し、そこから後にデータが続くような使い方をする。

  • READ の場合は、すべてのレジスタを順に送るタイプがある。

  • 最初に レジスタ番号だけ WRITE して、それから READ を行い 該当レジスタのデータを送るようなタイプもある。

  • メモリのようなデバイスは、最初に アドレスだけ設定して データなしの WRITE を行い。次の READ で 該当アドレスからの READ を行う。


プロトコルの基本的な設計

さて、RS232C はストリームなので、アドレッシングの機能は必要ないのだが、バッファーは FULL になる場合が出てくる。READ も同様で バッファーが空のときどうするか考えないといけない。

とりあえず、

  • 制御とかする必要があるので、第一バイトは ファンクション番号とする。
  • READ も複数のデータの種類があるので ファンクション番号だけの WRITE が、READ のデータの種類を 設定する機能と定義

ということにしておこう。

バッファーの 制御については、

  • WRITE で FULL になったら NAK を返し受け取り拒否
  • READ の第一バイトは、最大データ数として データが続く。空になったら 不定のデータを返す。

こんな風にしておけば良さそう。

制御については、

  • 多バイトのコンフィグレーションレジスタを定義する。
  • 1 バイトしか WRITE しなければ 1 バイト目だけを変更する。
  • 後ろの方のバイトに あまり使わない機能を置く。

こんな感じで設計すれば良いだろう。

上記を基本の設計として、すこしモデファイすることにする。

READ で、READ のデータの種類を設定するのに、ファンクション番号だけの WRITE を使うと書いたが、READ のデータの種類を 1 種類にして、WRITE を不要にする。

  • ステータス(1バイト) -- READ 可能なバイト数 -- 実際のデータ
    という風にひとつづきにして、ステータス だけが必要なときは 1 バイトの READ を行う。

    どれだけ READ できるか知りたいときは、2 バイトの READ を行い、あらためて データの READ を行う。

    大きなバッファーを用意して その分を読み込み 有効な データを 後で知るという使い方も OK 。

  • WRITE バッファーの残量をステータスに含めたいところだが、Xon/Xoff のように 1/3 以下になったら bit を立てるというものでも制御するには十分だろう。


プロトコルの詳細な設計

上記の考察をもとに 詳細を決めていこう。

(後述)

どんなマイクロコントローラを使うか

普通なら AVR を使うとして、Tiny2313 で 作れそうな内容。ただバッファーが少ない。GPS などはそれでも十分だろうが、Bluetooth では足りないかも知れない。まぁそういうときは、Mega328P を使えばよい。

ついでに書くと I/O エクスパンダなどは、I2C の線に 加えて 割り込み用の線を持っている。普通だとポーリングするしかないのだが、割り込みを使えれば、オーバヘッドと応答性能を改善できる。

普通と書いたが、USB Bluetoothドングル を使うなら、PIC24FJ64GB002/PIC24FJ32GB002 を使うことになるだろう。

プログラムが作り易く、コンパクトで USB HOST の機能を持っているのはこれぐらいしかないので、これ一択になるはずだ。

I2C スレーブの機能もあるし、メモリも多いので、十分だろう。

おまけ TI の キーパッドスキャン IC TCA8418

I2C は、低速のデバイスを接続するなら十分。キーパッドを付ける専用の IC も出ている。

この IC は、8 ROW x 10 COL で 80個までのキーを扱える。ちょっとデータシートを見てみたが、キーの状態を読み取れるが、キーの PRESS / RELEASE イベントを発生させ 10 個まで FIFO でバッファリングできるようだ。

RS232C の実装でヒントがないか -- バッファリングの部分をチェックしてみようと思う。

おなじような キーパッド制御をするプログラムを書くときにも プロトコルが参考にできそうだ。
( このチップ自身は BGA なので、個人では使えない )
たぶんこういうのも Tiny2313 でぎりぎり実装できるのだろう。

キーの数がすくなければ、14 pin の Tiny44A も使えそうだ。

メモ:I2C 経由で付けてみたいデバイスについて
posted by すz at 00:19| Comment(0) | TrackBack(0) | 日記
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/40713158
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック