受信した Set_Address() は以下の通りでした。
BDステータス = 34 (bit2~bit5 がSETUPを示す)
受信バッファ = 00 05 02 00 00 00 00 00
2byte目 05 は Set_Address()
3byte目 02 は デバイス・アドレス
受信したら、エンドポイント0の OUT 側の再設定と、UCON<PKTDIS> クリアを行います。
Set_Address() はデータステージが無い為、次のフレームでは空の IN トランザクションに対応する必要があります。 この IN トランザクション完了の直後に、受信済みのデバイス・アドレスを UADDR に書き込むんで次の SETUP ステージを正常に受け取れるように備えます。
具体的には Set_Address() 受信直後に、空の IN トランザクションに応答する為に、エンドポイント0の IN 側に以下の設定をして転送完了割り込みを受けて、UADDR に受信していたデバイス・アドレスを書き込みます。
BD ステータスレジスター(アドレス404H) 値 C8H
BDアドレスカウンターレジスター(アドレス405H) 値 00H
Set_Address() 受信直後に、次の SETUP ステージに備えてエンドポイント0の OUT 側も忘れずに設定し、UCON<PKTDIS> をクリアします。
BD ステータスレジスター(アドレス400H) 値 88H
BDアドレスカウンターレジスター(アドレス401H) 値 08H
そして次の SETUP ステージで再び Get_Descriptor ( device ) を受信しました。
BDステータス = 34 ( bit2~bit5 がSETUPを示す)
受信バッファ = 80 06 00 01 00 00 12 00
2byte目 06 は Get_Descriptor()
4byte目 01 は 標準device
7byte目 12 は データ・ステージのbyte数
最初に受信した Get_Descriptor ( device ) と比べると7byte目の値が異なります。
USB CDC 実現の取り組みは長期化が予想される為、ブレッドボードを小型のものに変え、電源もPICkit3からの供給に切り替えました。 他の実験と切り離してじっくり取り組みたいと思います。
USB関連記事のインデックスは右記事の末尾にあります。→ USB CDC
「楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。