« USB入門 | トップページ | USB入門 »

2006年11月 1日 (水)

USB入門

USBデバイスを作る3

AVRでUSBホストからのパケットを受信する事が出来たので、
次は送信部のコードといきたいところだが、その前に少し下準備
をする。

USBでは受信したパケットの誤りを検出するためCRCが用いられ
る。そこで用意したパケットに添付すべく、CRCを計算する必要が
ある。また、実際のUSBの信号線には、NRZIという方法で符号化
したデータが流れている。これは、送受信器間で同期を失う事を
防ぐために0や1が連続して送信する事を抑制する働きをする。
なので、HEXデータ(Decimalで表記してもいいが・・・)をNRZIで符
号化する事も必要になる。

まず、CRC計算部だが、実の所このCRC計算法にしてもNZRIに
しても、今回USBを調べて始めて知り得たにわか知識なので、こ
れらの事を調べる事から始めなければいけない。

CRC計算ルーチンを書くにあたって計算法を調べてみた。幸い幾
つかの説明とサンプルコードを掲載しているサイトを見つける事が
できたので、早速コードを書いてみる。先日のパケット受信実験で
得られたデータパケットのCRCを実際に計算し、そのパケットに添
えられていたCRCを比較してみたが、値が一致しない。この事で2
晩程悩んだが、HEROさんの所の "AVRusb.ZIP" に含まれる資料
から "ハードウェアCRC16計算回路" を見て納得。計算方法が違って
いた。この回路をエミュレートする形で計算部を実装してみると、
うまく値が一致した。

次に、データをNRZI符号化するコードを考える。こちらはそんなに
難しくはないのだが、バイト単位のデータをビットの連続として捕ら
えなければならないので、実装がちょっとめんどくさい。また、1が
6ビット連続するデータを変換する場合1ビットの0を挿入するので、
変換後のデータは必ずしも8の倍数にならない。故に変換後の
データはバイト単位ではなくビット単位で管理する必要があり、
ここら辺の実装も幾らか煩雑になる気がする。これらを踏まえて実
際のコードを書く。

しかし、それなりに思い悩んだ末に書き上げたたコードなのに、
エディタ上で眺めてみると、思っていたほど高度に見えないのは
なんでだろう。

|

« USB入門 | トップページ | USB入門 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/180469/12517505

この記事へのトラックバック一覧です: USB入門:

« USB入門 | トップページ | USB入門 »