« 2007年6月 | トップページ | 2008年7月 »

2007年10月21日 (日)

USB入門

USBCOMIO

最初は日々色々な事を書き綴ろうと始めたブログだが、このブログなんか電子工作ブログになってしまった感がある。結果、その筋のネタがないと書き込むべき記事が無くて、更新する気が起きなくなる。

いかん。

で、昨年からだらだらと続けている"AVRでUSB"であるが、最近
http://hp.vector.co.jp/authors/VA000177/html/FrontPage.html
AVRUSBEasyLoggerというのを知る。

これが凄い!何が凄いかと言うと、内蔵CR発振源のクロックで動作するUSBファームを書き上げている。実際ロースピードのUSBパケット1つを拾うのに必要な精度を以前計算した事があるが、とてもCR発振源では必要精度を満足させる事は出来ない気がする。
実際セラロックを使ってUSBファームを書いて見たが、特定のハードウェアではうまく動作しなかった。大半のマシンでは動作するのが、PCIバスに挿したUSB拡張カードでは不安定で認識にしくじる事がある。やっぱりクリスタルは必須かと思っていたが、そこに、

「内蔵CR発振源!?」

である。早速ソースコードを読んで見る。

「なるほど!やられた。」

物凄い衝撃を受けた。脳天に特大の金たらいが落下したくらいの衝撃!正直妬ましいくらいのアイディア。

簡単に説明すると、私のシステムの場合20MHzのセラロックを発信源に使っている。この場合、ロースピード1.5MHzのパケットを送受信するには、1ビットを13.333・・・クロックのタイミングでサンプリングする必要がある。

Bitsamp1

 

 

 

ただし、AVRで少数を含む数値をカウント出来ないので、3ビットサンプリングする毎に13,13,14クロックでサンプリングすれば、小数部の誤差をカバー出来る。
この方法で、20MHzの発信源を使ったAVRでも1.5MHzで作動するパケットを送受信できるが、1パケット送受信する間サンプリングするタイミングがきちんと拾うビットの遷移期間に収まっている精度が発信源に求められる。セラロックでは非常に微妙だ。

そこにCR発信源である。どう考えても必要精度を満たしていない気がするし、実際満たしていない。で、EasyLoggerでは何をやっているかと言うと、NRZIのビット挿入を省いた8ビット分(つまり1バイト)をサンプリングするために、必要なクロックより少ないクロックでサンプリングするループを組む。必然的にサンプリングタイミングは前方にずれる事になる。
そこで、各ビットをサンプリングする際、ビットの遷移期間の前方境界直後とビットの中央部をサンプリングして、この値が異なればサンプリングタイミングを後ろにずらすという方法で同期を取っている。

Bitsamp2  

 

 

連続するビットが同じ値だと同期のずれを検出出来ないが、データはNRZIで符号化されていて、6ビット以上同じ値が続く事は無く、この方法は有効である。

「凄いわ。このコード」

このコードを読んで一気に発奮!同期補正を行うコードを組み込んで見る。
動作原理はこうだ。8ビット(1バイト)を1つのループで組み、各ビットを14,13,13,14,13,13,14クロックの周期でサンプリングする。これだと1バイトサンプリングする毎に0.333・・・クロック分サンプリングタイミングが後ろにずれる事になる。
そこで、1ビットサンプリングする際にビット中央部と後方境界を比較し同期を補正する。この方法で同期補正のついでに、0.333・・・のクロック誤差も補正する。

Bitsamp3  

 

 

この方法でファームを書いてテスト。

「おおぉ。認識する!」

今まで接続が不安定だったPCとでも、安定して通信できる。
気を良くしたので、一気にWindows側のドライバも書き上げて見る。
出来上がったのがこれ。

Avrusbcomio01 

 

 

 

 

 

  Avrusbcomio02  

 

 

 

 

 

 

 
AVR Tiny2313を使った汎用I/O。WindowsからはCOMポートとして見えるので、シリアル通信を行うアプリケーションからAVR Tiny2313のポートBを操作出来る。
senshuさんから紹介してもらったキットを参考にして、ブレッドボードに挿せるようにして見た。

Avrusbcomio03  

 

 

 

 

 

 

ブレッドボード上で実験。うまく動作しているようだ。
取り掛かってから約1年掛かったが、何とかAVRでUSBデバイスを作る事が出来た。
一応「車輪の再発明」完結。

AVR Tiny2313 USB 汎用 I/O:ダウンロード

| | コメント (21) | トラックバック (0)

« 2007年6月 | トップページ | 2008年7月 »