IrDA実験ボードを使っての基本送受信の確認実験をしてみました。AT91SAM7のマニュアルには簡単ではありますがIrDAの物理層の説明もあり、モジュレーションの説明として次の図も示されています。ここで、
なるほど、極性が反転していることとパルス幅が違うことを除けば、RS232Cとほぼ同じなので、ハードも簡単に実現できるわけですね。そのため、USARTをIrDAで使うのはとっても簡単で、AT91SAM7S256の場合は初期化時にIrDAモードを指定できるようになっています。ボーレートやパリティ等の設定はRS232Cで使う時とほぼ同じ。ただし、FIDIレジスタには1を設定してやります。通信方式上での大きな相違点は、IrDAは半二重通信であること。相手からの赤外線を受信中に送信ができると、自分の出した赤外線による影響を受けるためのようです。AT91SAM7S256のUSARTでは半二重通信に関する明示的なサポート機能がないので、受信動作時にはトランシーバの送信側LEDの発光を確実に止めるために、送信部をディスエーブルするだけでなく、TXD端子はGPIOに設定してLowレベルを出力するように求めています。
今回の動作確認では、次のように設定してみました。
実験プログラム本体は、さらにデバック・シリアル(DBG)のポートを使うことにしました。DBGから入力された文字を、US1から出力します。すると、このデータがUS0で受信されるので、その結果を文字と16進でDBGポートに出力してやります。と、まぁ、これだけのプログラムです。さっそく、実行してみると。。
めでたく、送信した文字が受信できているようです。自分で送信したデータはちゃんと受信できるようですから、トランシーバとUSARTのIrDAモードの基本動作確認はあっさり完了です。
どうせなら別のデバイスから送信したデータが受信できるかどうかも調べてみたいので、ちょっとIrDAを調べてみようと思いサイトを覗いてみました。基本仕様書である
おぉ! なにやらゾロゾロとデータが受信できました!!購入した資料によると、最初の部分の0xFFがXBOFで、0xC0がフレームの始まりを示すBOF, そして0xC1がフレームの終わりを示すEOFのようです。フレームデータを良く見ると、DOCOMO/N02Aという文字列が含まれており、わたしの使っている携帯です。これだけ拾えているんだったら、SIRの受信はおそらくちゃんとできているのでしょう。ほんとは、フレームの解析をしてCRCの計算して確認しなきゃいけないのですが。
$20で買った資料でどこまで詳細仕様がわかって実装作業ができるのかまだ調べていませんが、IrCOMMでの疎通を目指してみるのもオモシロそうな気がしてきました。ざっと見たところでは、上位層にいくにしたがって説明が貧弱になっていく印象でしたが。
ともかくもちょっとIrDAをかじることができ、簡単ではあるものの勉強になった実験でした。前回の記事にも書いたように、LPC2388やSTM32のUARTにもIrDA機能はあるようですから、オマケ基板で実験してみるのも良いかもしれません。
Transmitter Outputは、USARTの送信部からの出力で、
TXDは、それに変調をかけた結果で、IrDAトランシーバへの入力となる信号です。
なるほど、極性が反転していることとパルス幅が違うことを除けば、RS232Cとほぼ同じなので、ハードも簡単に実現できるわけですね。そのため、USARTをIrDAで使うのはとっても簡単で、AT91SAM7S256の場合は初期化時にIrDAモードを指定できるようになっています。ボーレートやパリティ等の設定はRS232Cで使う時とほぼ同じ。ただし、FIDIレジスタには1を設定してやります。通信方式上での大きな相違点は、IrDAは半二重通信であること。相手からの赤外線を受信中に送信ができると、自分の出した赤外線による影響を受けるためのようです。AT91SAM7S256のUSARTでは半二重通信に関する明示的なサポート機能がないので、受信動作時にはトランシーバの送信側LEDの発光を確実に止めるために、送信部をディスエーブルするだけでなく、TXD端子はGPIOに設定してLowレベルを出力するように求めています。
今回の動作確認では、次のように設定してみました。
- US0を送信、US1を受信用に初期化。US1のTXD端子からはLowレベルを出力。
- IrDA規格との互換性のため、8ビット、1ストップ、パリティ無しに設定。
- ボーレートは9,600bps
実験プログラム本体は、さらにデバック・シリアル(DBG)のポートを使うことにしました。DBGから入力された文字を、US1から出力します。すると、このデータがUS0で受信されるので、その結果を文字と16進でDBGポートに出力してやります。と、まぁ、これだけのプログラムです。さっそく、実行してみると。。
めでたく、送信した文字が受信できているようです。自分で送信したデータはちゃんと受信できるようですから、トランシーバとUSARTのIrDAモードの基本動作確認はあっさり完了です。
どうせなら別のデバイスから送信したデータが受信できるかどうかも調べてみたいので、ちょっとIrDAを調べてみようと思いサイトを覗いてみました。基本仕様書である
IrDA Data Specificationsは$795もするので、とても個人では手が出せません。しょうがないので、代わりに入門ガイド的な本
IrDA Principles and Protocolsを買ってみました。PDF版で、$20なり。前半はIrDA技術の全般的な話ですが、後半ではプロトコル仕様の概要について書かれているので、わたしのような初心者が読むには手ごろな資料のようです。ちょっと読んでみたところ、デバイス間の接続を確立するために、最初は9600bpsでデバイスのサーチをするという仕様になっていることがわかりました。それならば、この実験プログラムのままでもサーチ手順の始めの部分の信号を受信できてもいいハズです。IrDAデバイスと言えば、ノートPCにIrDAが付かなくなった今となっては、携帯電話しかありません。さっそく、自分の携帯電話のプロファイルの赤外線送信メニューを開いて、トランシーバに向けて送信操作をしてみると。。。
おぉ! なにやらゾロゾロとデータが受信できました!!購入した資料によると、最初の部分の0xFFがXBOFで、0xC0がフレームの始まりを示すBOF, そして0xC1がフレームの終わりを示すEOFのようです。フレームデータを良く見ると、DOCOMO/N02Aという文字列が含まれており、わたしの使っている携帯です。これだけ拾えているんだったら、SIRの受信はおそらくちゃんとできているのでしょう。ほんとは、フレームの解析をしてCRCの計算して確認しなきゃいけないのですが。
$20で買った資料でどこまで詳細仕様がわかって実装作業ができるのかまだ調べていませんが、IrCOMMでの疎通を目指してみるのもオモシロそうな気がしてきました。ざっと見たところでは、上位層にいくにしたがって説明が貧弱になっていく印象でしたが。
ともかくもちょっとIrDAをかじることができ、簡単ではあるものの勉強になった実験でした。前回の記事にも書いたように、LPC2388やSTM32のUARTにもIrDA機能はあるようですから、オマケ基板で実験してみるのも良いかもしれません。