標準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

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