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

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