PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.7.11

前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆USBデバッグツール

フリーのUSBデバッグツールSnoopy.proの紹介です。

[第57回]

●Snoopy.proで確かめてみました

[第53回][第54回]で、
1)HIDレポートディスクリプタの値を64バイト以外の値、たとえば32バイトに変更しても、WriteFile()での送信バイト数は常に64バイト(設定値としては65バイト)にしなければならない。
2)その場合には、HIDでの実際の送信は、32バイトずつ2回に分けて送信されるらしい。
ということを書きました。

PIC18F4550に送信されたデータを、PIC18F4550がさらにRS485で当社のBASIC制御ボードZB25Kに送信したデータを分析してみると、どうもそういうことらしい、という結論になりました。

とにかくWriteFile()としては、必ず64バイトのデータとして送信しなければならない、ということのようですから、それならば、わざわざHIDレポートディスクリプタの値を64バイト以外の値に設定して、ことさら処理を複雑にしてしまう必要は全くありません。

でも。
それはそうなのですけれど、せっかくSnoopy.Proもご紹介申し上げたところですから、ひとつ、そのSnoopy.Proで確認してみる、というのはいかがでしょうか?
まあ、余興みたいなものですけれど。

で、Snoopy君に調査していただきましたところ。
こういう報告でありました。

うう。
これって…。
おかしいじゃないの?
64バイト1回で送信しましたあ?

そんなはずは…。
ないのでありますけれど、そこはそれ、なんたってSnoopyなのでありますから、どうも、平気でデータを捏造してくれてしまうらしいのであります。

と、そのように断言してしまいますと、Snoopyファンでありますとか、全国愛犬家協会みたいなところから抗議されてしまうかもしれません。

でもですね。
64バイト一括ってことはないはずなのですよ。
2回に分けて送っているはずなのですけれど。

どうもWindowsサイドのソフトから見る限りでは64バイト1回で送信している、ということになってしまうようです。

おお。ひらめきました。
実は、[第55回]で、PIC18F4550のHIDの送受信の説明のところを書くために、PIC18F4550DataSheetを読んでいて気が付いたことがあります。

●BD BYTE COUNT


[出典]Microchip社PIC18F4550DataSheet

[第55回]で説明しましたBuffer Descriptor(BD)の第2バイトがBDnCNT(BD BYTE COUNT)レジスタです。
[第55回]では省略してしまいましたけれど、上の引用文が、そのBD BYTE COUNTの説明です。
そこの、For an OUT transferのところを読みますと、
(このレジスタは、OUTバッファ(受信バッファ)の最大受信可能バイト数を定義しておきますが)
After an OUT transfer,the SIE will return the actual number of bytes received.
と書いてあります。
おお。そうなのですね。
データを受信すると、実際に受信したバイト数が、SIE(USBコントローラ)によってこのレジスタに書き込まれる、のだそうです。

それなら、受信後にこのレジスタの値を確認すれば、そのとき実際に何バイト受信したのかがわかるじゃありませんか。

さっそくPICのプログラムを直して試してみましたよ。
これが、その結果です。


[第54回]
と同じことをしていますが、今回はPIC18F4550がWindowsマシンから受信したデータをそのままZB25Kに送るのではなくて、上で説明したBYTE COUNTレジスタの値を、ZB25Kに送るデータの第1バイトに上書きしてから、送信するようにPIC18F4550のプログラムを変更したうえで実行したのです。

ZB25Kが受け取ったデータの解析です。
[第54回]で説明しましたように、水色で囲った数値はZB25Kの文字変数の格納文字数です。
その次からが実際に受信した文字列データです。
受信した文字の先頭の値(黄色で囲った値)は20になっています。
ここは [第54回]では73になっていました。73は文字sのASCIIコードです。
今回はその上に、BYTE COUNTレジスタの値を上書きしてZB25Kに送りました。
その値が20ということは、やっぱりこのときWindowsマシンから送られてきたのは20(=32)バイトだったのです!

そして、これも[第54回]で説明しましたように、その次に受信したデータの第1バイトは、アドレスF327にあります。
黄色で囲った20です。
ここは [第54回]では67になっていました。
そこにBYTE COUNTレジスタの値が上書きされています。
ここもやはり20です。
おお。間違いありません。
やっぱりWindowsマシンからは、64バイト1回の送信ではなくて、32バイトずつ2回に分けて送信されていたのです。

こら。Snoopy。ほんとのことを言わなきゃだめじゃないか。
CPUをつくろう!第484回(2010.4.23upload)を再編集

PICでUSBを![第57回]
2011.7.11upload

前へ
次へ
目次へ戻る
ホームページトップへ戻る