標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第642回]
●PIC18F14K50のHIDプログラム(その初期設定部分その3)
このところ多忙で、ほんの少しずつしか書く時間がありません。
気長にお付き合いをお願いいたします。
今回もPIC18F14K50を使ったHIDプログラムの初期設定部分の続きです。
; call setbd0 call setbd1 call setbd2 ;
エンドポイントEP0(OUT)DATA0、EP0(OUT)DATA1、EP0(IN)をPIC18F14K50内蔵のUSBSIE(Serial Interface Engine)が使えるように設定をします。
それぞれサブルーチンsetbd0、setbd1、setbd2をcallします。
その各サブルーチンです。
; ;ep0 out data0(even) setbd0 lfsr 1,203 movlw 02;address high movwf POSTDEC1 movlw 20;address low movwf POSTDEC1 movlw 08;bytes movwf POSTDEC1 movlw 88;STAS(even)********************* movwf POSTDEC1 return ;ep0 out data1(odd) setbd1 lfsr 1,207 movlw 02;address high movwf POSTDEC1 movlw 28;address low movwf POSTDEC1 movlw 08;bytes movwf POSTDEC1 movlw 0c8;STAS(odd) movwf INDF1 return ; ; ;***** set DEVICE DESCRIPTOR ***** ; ;set DEVICE DESCRIPTOR top 8 bytes ; setbd2 lfsr 1,230 ; movlw 12;size(bytes) movwf POSTINC1 movlw 01;type(DEVUCE DESCRIPTOR) movwf POSTINC1 movlw 00;USB version 02.00(Low) movwf POSTINC1 movlw 02;(High) movwf POSTINC1 movlw 00;HID class movwf POSTINC1 movlw 00;SUB class movwf POSTINC1 movlw 00;protocol code movwf POSTINC1 movlw 08;max packet size of EP0 movwf POSTINC1 ; call setbd2odd movlw 1 movwf bd2mk;=1 return ; ; setbd2odd lfsr 1,20b movlw 02;address high movwf POSTDEC1 movlw 30; movwf POSTDEC1 movlw 8;bytes movwf POSTDEC1 movlw 0c8 movwf INDF1 return ;
ここは[第639回]で説明しました各エンドポイントのBUFFER DESCRIPTOR TABLEに所定のデータを書き込むためのルーチンです。
EP0(OUT)DATA0のテーブルアドレスは200〜203、EP0(OUT)DATA1は204〜207です。
EP0(OUT)DATA0のバッファアドレスは220〜227、EP0(OUT)DATA1のバッファアドレスは228〜22Fです。
BUFFER DESCRIPTOR TABLEはエンドポイント毎にアドレスが決まっていますが、バッファそのものは任意のアドレスに置くことができます(といってもアドレス200〜2FFの範囲で未使用のところに限ります)。
後ろから書いているのは、先頭のBDnSTATに値を書き込むことでSIEが直ちにそのエンドポイントに対してアクティブに働くようになりますから、その前に必要なパラメータ(バッファアドレス、バッファサイズ)をセットしておくためです。
EP0(OUT)に対しての設定は簡単ですがEP0(IN)はちょっと様子が異なります。
EP0(OUT)は、USBホストコントローラから見て”OUT”ですから、PIC18F14K50は”IN”になります。
送られてくるデータ(コマンド)を受け取れるようにすればよいだけですから設定は簡単です。
それに対してEP0(IN)はPIC18F14K50からUSBホストコントローラにデータを送信しなければなりません。
USBホストコントローラが「送信要求」を送ってきたらすぐにデータを送信できるように、データバッファに送信データをセットしたうえでBUFFER DESCRIPTOR TABLEに必要な値をセットしなければなりません。
EP0(IN)のデータバッファはアドレス230〜237です。
最初にこのバッファアドレスに書いておくデータは、DEVICE DESCRIPTORの先頭の8バイトです。
USBデバイスを接続したときに、USBホストコントローラがそのUSBデバイスに最初に送る送信要求コマンドは、DEVICE DESCRIPTORの送信要求だからです。
ここはHIDデバイスのデバイスデスクリプタの書き方にしたがって値を設定します。
デスクリプタの先頭にはそのデスクリプタのバイト数を書きます。12は16進数です。
デバイスデスクリプタは18バイトです。ここではその最初の8バイトをセットします。
次はデスクリプタのタイプを書きます。デバイスデスクリプタは01です。
その次2バイトはUSBのバージョンを書きます。2.0ですから、ここは00 02にします。
その次はクラスコードです。
HIDの場合ここは00でよいようです。
最後にエンドポイントEP0のパケットサイズを指定します。
ここは8(バイト)にします。
そのようにバッファに値をセットしてから、EP0(IN)のBUFFER DESCRIPTOR TABLE(アドレス208〜20B)をセットします。
セットするためのサブルーチンsetbd2oddをCALLします。
サブルーチンsetbd2oddでは、バッファアドレス230と、バッファサイズ8(バイト)を指定したあと、最後にBDnSTATに値を設定します。
最初のデバイスデスクリプタの送信は、USBホストコントローラの送信要求コマンド(ホストからのコマンドはDATA0ではじまります)に対する返信ということになりますから、DATA1で送信します(ということのようです)。
そこで、このバッファデータはDATA1で送る、ということをSIEに知らせるために、BDnSTATにはC8をセットします。
DATA0の場合にはここは88をセットします。
BDnSTATについては[第482回]にdatasheetがあります。
PIC18F4550のものですがPIC18F14K50でも同じです。
ビット6とビット3が関係します。
なおBUFFER DESCRIPTORについては、[第637回]と[第638回]もあわせてお読みください。
setbd2oddをCALLしたあと、ワークレジスタbd2mkに1をセットしています。そのようにする理由については、もう少し先になってから説明をいたします。
2010.10.20upload
前へ
次へ
ホームページトップへ戻る