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

●BUFFER DESCRIPTOR TABLE メモリマップ

前回、PIC18F14K50のRAMアドレス200からのエリアにセットされるBUFFER DESCREPTOR TABLEのマップについて説明をしました。
PIC18F14K50のアドレス200〜2FFはUSBバッファとして使うための特殊なRAMになっています。
PIC18F14K50のRAMメモリマップは以前にもお見せしていますが、下に再掲いたします。


[出典]Microchip社PIC18F14K50DataSheet

PIC18F14K50のRAMは図のようにアドレス000〜2FFとF53〜FFFが実装されています。
300〜F52にはメモリは実装されていません。
図の実装されているRAMのうち、アドレス200〜2FFの256バイトだけが、そのほかのRAMと異なった機能をもっています。
この範囲の256バイトのメモリはPIC18F14K50内蔵のUSBSIE(USB Serial Interface Engine)とユーザープログラムを実行するCPUの両方がアクセスできるという機能です。
しかし上図でアドレス200〜2FFの範囲にもGPR(General Purpose RAM)と書いてありますように、USBに用途を限定しているわけではありませんから、USBバッファとして使わないところは汎用のメモリとして使うことができます。

前回のマップではアドレス200〜2FFの範囲のほとんどが4バイトずつに区切られたBUFFER DESCREPTOR TABLEに割り当てられていましたが、それはEP0〜EP7の全てを使って、しかも全てのエンドポイントをping−pong BUFFERとして使う指定をしたときにはそのようになります。

ND80ZVのPIC18F14K50の場合にはEP0(OUT)のみping−pong BUFFERとして使いますが、そのほかにはEP0(IN)、EP1(OUT)、EP1(IN)のみを使います。
ですからその各エンドポイントのBUFFER DESCRIPTOR TABLEに割り当てられた範囲のアドレス(200〜213)以外のメモリは汎用として使うことができます。

ただし、USBSIEとCPUの両方がアクセスするメモリはBUFFER DESCRIPTORだけではありません。
肝心のデータバッファもUSBSIEとCPUの両方からアクセスしなければなりません。
ですから各エンドポイントのデータバッファも、アドレス200〜2FFの範囲のメモリに置く必要があります。

PIC18F14K50では、わずか256バイトしかUSBメモリとして使うことができません。
幸い、EP0(OUT)、EP0(IN)は各8バイトですし、またデータ送受信用のEP1(OUT)、EP1(IN)もHIDの場合には一度に64バイトしか送信、受信できませんから、下図のように、アドレス200〜2BFまでに全ての必要なUSBメモリBUFFERが収まってしまいました。


右端に記入してある値は、各エンドポイントにおけるBUFFER DESCREPTOR TABLEの値です。
値が88/c8になっているところは、DATA0とDATA1とで異なる指定にするために、プログラムで書き換えます。
それぞれのテーブルの2バイト目はバッファのバイト数で、3バイト目はバッファ先頭の下位アドレス、4バイト目は上位アドレスです。
アドレス2C0〜2FFはSIEがアクセスするUSBバッファではありません。
汎用のバッファとして使っています。

本日は時間がなくなってしまいました。この続きは次回にいたします。
2010.10.16upload

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