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

●BUFFER DESCRIPTOR

前回、PIC18F14K50のRAMアドレス200からのエリアにセットされるBUFFER DESCREPTOR TABLEのマップについて説明をしました。
EP0からはじまるエンドポイント毎に4バイトのエリアが割り当てられます。
その割り当てられるアドレスははじめから決められています。
ping−pong BUFFERを使わない設定のとき、アドレス200〜203はEP0(OUT)のBUFFER DESCREPTORになります。
ping−pong BUFFERを使う設定のときは、アドレス200〜203はEP0(OUT)のEven(DATA0)に割り当てられます。
前回説明をしましたように、ND80ZVのPIC18F14K50では、EP0(OUT)のみping−pong BUFFERを使います。
SETUPのために、EP0(IN)も必須です。
通常のデータの送受信のためにEP1(OUT)とEP1(IN)を使います。
ですから、アドレス200からのBUFFER DESCREPTORの配置は次のようになります。

200〜203 EP0(OUT)DATA0
204〜207 EP0(OUT)DATA1
208〜20B EP0(IN)
20C〜20F EP1(OUT)
210〜213 EP1(IN)

それではそのBUFFER DESCREPTORの中身はいったいどういうものなのか、ということなのですが、それについては、[第482回]●Buffer Descriptors(BD)で簡単にですが説明しておりますのでそちらもお読みくださいませ。
そのときの説明はPIC18F4550についてでしたが、PIC18F14K50でも全く同じです。


[出典]Microchip社PIC18F14K50DataSheet

バッファデスクリプタの第1バイト、BDnSTATがSIE(PIC内蔵のUSBコントローラ)とメインプログラムの間でのバッファのアクセス権を規定する重要なレジスタです。
BDnSTATについても[第482回]●BDnSTATで説明をしています。
BDnSTATのビット7を1にすると、SIEはUSBホストコントローラから、そのエンドポイントに対する送信、受信の要求にオートマチックに応答して、必要な処理をしてくれます。
送信、受信が完了すると、BDnSTATのビット7は0になります。
ですから、このビットをプログラムで監視することによって、そのエンドポイントの送信、受信が完了したかどうかを判断することができます。
OUTエンドポイント(ホストから見てOUTです)で、このBDnSTATのビット7が1→0になったとき、そのエンドポイントの受信バッファには、ホストから送られてきたデータが格納されています。
INエンドポイント(ホストから見てINです)で、このBDnSTATのビット7が1→0になったとき、そのエンドポイントの送信バッファにセットされていたデータが、ホストに送信されたこと(送信完了)を示しています。

バッファデスクリプタの第2バイトには、そのエンドポイントのバッファサイズを記入します。
第3バイトと第4バイトには、そのエンドポイントのバッファアドレスを記入します。
上の図のアドレス202(BD0ADRL)は00h、203(BD0ADRH)は05hになっていますが、これはミスプリでしょう。
図の場合でしたらここはそれぞれ、80h、02hにしなければなりません。

どうやら(多分)PIC18F4550のDataSheetをそのまま使ってPIC18F14K50のDataSheetを作成したときに、アドレスを修正するのを忘れてしまったようですねえ。

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

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