標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第651回]
●ふたたびBDnSTAT
前回、BDnSTATの説明が少し舌足らずでした。
BDnSTATはSIEがアクセスするときとCPUがアクセスするときとでビットの意味が異なります。
INエンドポイントに対して、BDnSTATのビット7が0のときに、CPUはバッファにデータ、コマンドをセットして、それから、BDnSTATのビット7を1にします。
OUTエンドポイントに対しては、BDnSTATのビット7が0のときに、CPUはバッファのデータ、コマンドを参照(引き取り)してから、それから、BDnSTATのビット7を1にします。
INエンドポイントでUSBホストコントローラから送信要求があると、SIEはBDnSTATのビット7が1のときに、バッファのデータ、コマンドをホストコントローラに送出します。それから、BDnSTATのビット7を0にします。
OUTエンドポイントでUSBホストコントローラからデータ、コマンドが送信されてくると、BDnSTATのビット7が1ときに、バッファにそのデータ、コマンドを書き込んでから、ビット7を0にします。
ですからCPUはBDnSTATのビット7が0であることを確認してから、バッファにデータをセットし、またバッファからデータ、コマンドを引き取るようにします。その作業が済んだら速やかにBDnSTATのビット7を1にしておかなければなりません。
BDnSTATについては前回もDataSheetのコピーをお見せしましたが、CPUモードとSIEモードを対比するために、以下にあらためて再掲いたします。
こちらがUOWN=0(CPUモード)のときのBDnSTATです。
[出典]Microchip社PIC18F14K50DataSheet
タイトルのところに(DATA IS WRITTEN TO THE SIDE)とありますが、おそらく TO THE SIE の間違いだと思います。
こちらがUOWN=1のときのBDnSTATです。
[出典]Microchip社PIC18F14K50DataSheet
こちらもタイトルのところの BY THE SIDE は BY THE SIE の間違いだと思います。
ついでながら、上で CPU という語を使っていますから、ここで MCU というのは不統一です。 ここも CPU とすべきでしょう。
さて前回取りかかったsetupckルーチンの中身です。
setupck movlw 08 movwf UCON;clear bit4,for SIE enbl lfsr 0,200 btfsc INDF0,7 goto ck_bd1 lfsr 1,220 goto setupck1 ck_bd1 lfsr 0,204 btfsc INDF0,7 goto notsetup lfsr 1,228 setupck1 movf INDF0,w andlw 3c sublw 34;PID="1101" SETUP bz setupck2 call setbd0 call setbd1 notsetup bcf STATUS,z return ;(1)"setup" received setupck2 movf POSTINC1,w movwf db0 movf POSTINC1,w movwf db1 movf POSTINC1,w movwf db2 movf POSTINC1,w movwf db3 movf POSTINC1,w;dummy db4 movf POSTINC1,w;dummy db5 movf POSTINC1,w movwf db6;send request data bytes call setbd0 call setbd1 bsf STATUS,z return
前回も書きましたが、ここでは、EP0(OUT)のDATA0バッファが受信されたことを示す、BD0STAT(アドレス200)のビット7と、EP0(OUT)のDATA1バッファが受信されたことを示す、BD1SAT(アドレス204)のビット7をチェックしています。
EP0(OUT)はPing−Pong Bufferになっていますから、DATA0とDATA1のどちらにもデータが送られてきますから、このように両方のチェックをしています。
もっともコマンドはDATA0で送られてくるはずなのですが。
DATA0もDATA1も受信されていない(どちらのBDnSTATのビット7も0になっていない)ときは notsetup でzフラグをクリアしてリターンします。
どちらかのビット7が0になっていたら、そのBDnSTATのビット2〜5をチェックします。
ここにはSIEによって、受信したパケットのPIDが書き込まれています。
PIDについては[第424回]で少しだけ説明しています。
PIDは4ビットでそのパケットの種類を示しています。
SETUPコマンドは、PID=”1101”です。
ですから、それをチェックすることで、ホストから送られてきたコマンドを検出することができます。
PID=”1101”を確認したら、こんどは送られてきたコマンドを確認するために、ワークレジスタにコマンド(8バイト)を転記してから、次のコマンド受信にそなえて、BDnSTATのビット7を1にセットして(call setbd0、call setbd1)リターンします。
2010.11.1upload
前へ
次へ
ホームページトップへ戻る