標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第648回]

●USTATレジスタ

やっとUSTATの説明にとりかかります。
いつものようにDataSheetを見てみましょう。


[出典]Microchip社PIC18F14K50DataSheet

これがまたよくわからないレジスタです。
SIEが実行したトランザクションについての情報を保持するレジスタのようなのですが、ンなものは必要無いと思うのですけれど…。
DataSheetの説明では、

When the SIE issues a USB transfer complete interrupt,USTAT should be read to determine the status of the transfer.

と書いてありまして、should be read なんだそうです。
ええ。
でも私のプログラムでは、読んでいません。
だって、必要ありませんから。

ところがこのUSTATレジスタがなかなかにくせもののようなのです。
FIGURE22−3にありますように、USTATレジスタは4バイトのFIFO(first in first out)構造をしています。

どういう状況を想定しているのか、ちょっとピンとはこないのですけれど、ともかくSIEがトランザクションを実行し終わると、UIRのビット3、TRNIFを1にセットするのですが、(上のデータシートの説明とは少しニュアンスが違うのですけれど)もしもプログラムがそのTRNIFをクリアするよりも前に、別のトランザクションが実行されてしまったら、どうしましょうか?というお話のようです。
そこで、そのときには、そのエンドポイントの情報をUSTAT FIFOに蓄えておいて、UIRのTRNIFビットがプログラムによってクリアされたならば、そのときにUSTAT FIFOを1バイトPUSHして、蓄えておいたエンドポイントの情報を押し出すとともに、再びTRNIFをONにする、というように働きます(ということのようです)。

私の作ったHIDプログラムでは、その情報は使いませんから、そんなものはそのままさわらないでおけばいいのですけれど、どうやらそうはいかないようなのです。
もしもプログラムでUIRのTRNIFをクリアしないでおくと、FIFOが積みあがったままになってしまいます。
するとどうなるかといいますと、

Note: If an endpoint request is received while the USTAT FIFO is full,the SIE will automatically issue a NAK back to the host.

FIFOがフルの状態のときに、USBホストコントローラから次のリクエストが送られてきたら、automaticallyにNAKを送り返してしまうのだそうです。
そんなことをしてもらっては困りますから、それで[第646回]のプログラムのはじめのところで、 clrf UIRを実行するようにしているのです。
このプログラム部分は繰り返し実行されるところですから、FIFOはつねに空っぽ状態になります。
FIFOが空っぽのときに、UIRのTRNIFをクリアするとどうなるかと言いますと、もともと0のところを0クリアするだけですから、別にどうということはありません。

2010.10.28upload

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