楽々PIC

水田除草と言うブログを書いていますが、PIC関連の記事が意外に人気で驚いています。 PICを使った電子工作に興味を持つ方が多いことを知って、一緒にPICを学ぶブログを作りたいと思いました。 「楽々PIC」は教材と言うよりも少し実用性?のある楽しい道具を作りながら学ぶブログを目指します。

Setup

USB CDC IN トランザクション(2)

 「USB CDC IN トランザクション(0) 」で受信した Get_Descriptor ( device ) に対するデータステージについて、経験したことを紹介します。 <PICデバイス=18F2550> ターゲットは秋月電子通商さんの USBマイコンボード 完成品(PIC18F2550) +α の RRP2550-0 です。

前回記事の最後に以下の SETUP ステージ を受信しています。

 BDステータス = 34 ( bit2~bit5 がSETUPを示す)
 受信バッファ  = 80 06 00 01 00 00 12 00

          2byte目 06 は Get_Descriptor()
          4byte目 01 は 標準device
          7byte目 12 は データ・ステージのbyte数( 18byte )


これに続くデータステージを完了するまでに試行錯誤を繰り返しましたが、以下の方法でデータステージ及び、ステータスステージを完了しています。 下図は標準デバイス・ディスクリプタとして準備したデータです。

device_descriptor1

エンドポイント0 のバッファ長に合わせて 8byte 毎にラベルを付けています。

処理は以下の手順で行います。

<<< 1~8byte目送信 >>>
先の Get_Descriptor ( device ) 転送完了割り込みの中で以下の通りバッファとBDステータス等を設定して次フレームの IN トランザクションを待ちます。

 エンドポイント0 IN 側バッファに上図 usbdevdb に続く 8byte を転送
 BD ステータスレジスター(アドレス404H)      値 C8H
 BDアドレスカウンターレジスター(アドレス405H) 値 08H

 BD ステータスレジスター(アドレス400H)      値 88H
 BDアドレスカウンターレジスター(アドレス401H) 値 08H

 UCON<PKTDIS> をクリア


<<< 9~16byte目送信 >>>
上のデータを読み出す IN トランザクションの転送完了割り込みの中で、以下の通りバッファとBDステータス等を設定して次フレームの IN トランザクションを待ちます。

 エンドポイント0 IN 側バッファに上図 usbdevdb1 に続く 8byte を転送
 BD ステータスレジスター(アドレス404H)      値 88H
 BDアドレスカウンターレジスター(アドレス405H) 値 08H

 BD ステータスレジスター(アドレス400H)      値 88H
 BDアドレスカウンターレジスター(アドレス401H) 値 08H

 UCON<PKTDIS> をクリア


<<< 17~18byte目送信 >>>
上のデータを読み出す IN トランザクションの転送完了割り込みの中で、以下の通りバッファとBDステータス等を設定して次フレームの IN トランザクションを待ちます。

 エンドポイント0 IN 側バッファに上図 usbdevdb2 に続く 2byte を転送
 BD ステータスレジスター(アドレス404H)      値 C8H
 BDアドレスカウンターレジスター(アドレス405H) 値 02H

 BD ステータスレジスター(アドレス400H)      値 88H
 BDアドレスカウンターレジスター(アドレス401H) 値 08H

 UCON<PKTDIS> をクリア


以上で、データステージを完了し、続くステータスステージは前々回同様に割り込み無しで完了します。 詳しくは前々回記事をご覧下さい。

次の SETUP ステージでは以下の通り Get_Descriptor ( config ) を受信しました。

 BDステータス = 34 ( bit2~bit5 がSETUPを示す)
 受信バッファ  = 80 06 00 02 00 00 09 00

          2byte目 06 は Get_Descriptor()
          4byte目 01 は 標準構成( Configuration )
          7byte目 09 は データ・ステージのbyte数


USB関連記事のインデックスは右記事の末尾にあります。→ USB CDC 


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。




USB CDC IN トランザクション(0)

 「USB CDC IN トランザクション(1)」の次の記事なのに番号が小さくなったのには訳があります。 今回は前回記事で受信したSETUPステージ( Set_Address()  )に対するステータスステージに当たる、空の IN トランザクションについて説明してみます。 空の意味で (0) です。 <PICデバイス=18F2550> ターゲットは秋月電子通商さんの USBマイコンボード 完成品(PIC18F2550) +α の RRP2550-0 です。

受信した 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目の値が異なります。

DSC00127

USB CDC 実現の取り組みは長期化が予想される為、ブレッドボードを小型のものに変え、電源もPICkit3からの供給に切り替えました。 他の実験と切り離してじっくり取り組みたいと思います。


USB関連記事のインデックスは右記事の末尾にあります。→ USB CDC 


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。



USB CDC IN トランザクション(1)

 前回までに USB ハブからのリセット信号を受けた後に Get_Descriptor ( device ) を受信する SETUP トランザクションを経験しました。 今回は IN トランザクションの経験について説明します。 <PICデバイス=18F2550> ターゲットは秋月電子通商さんの USBマイコンボード 完成品(PIC18F2550) +α の RRP2550-0 です。

Get_Descriptor ( device ) の次のフレームで IN トランザクションを行うことが決まっていて、それまで(1msec未満)に IN トランザクション時に送信するデータとエンドポイント0のINバッファに準備する必要があります。 Device Descriptor として下図を準備しました。

device_desk

エンドポイント0のバッファサイズは 8byte に決まっているようなので、実際にバッファに準備するのは 8byte づつに区切ったデータになります。 まずは最初の 8byte をバッファに転送し、BDステータスレジスターに Data1 , トグル同期させる設定と、BDバイトカウンターレジスターに 8byte を設定します。
ピンポンバッファを使わない設定の場合のBDステータスレジスターとBDアドレスレジスターの値は以下の通りです。

 BD ステータスレジスター(アドレス404H)      値 C8H
 BDアドレスカウンターレジスター(アドレス405H) 値 08H

さらに、IN トランザクションの最後にホストが送ってくる空の OUT トランザクションに自動で ACK 応答するために、エンドポイント0の OUT側 BDステータスレジスターに 88H を書き込みます。

 BD ステータスレジスター(アドレス400H)      値 88H
 BDアドレスカウンターレジスター(アドレス401H) 値 08H

また、SETUP 動作中は UCON<PKTDIS> が自動的にセットされるので、このビットをクリアします。

以上の設定を行って、次のフレームを待つと(Windows XPで) IN トランザクションを完了して、RESET 信号が送られてきます。 先に送られて来た Get_Descriptor ( device ) は以下の通りですから、データ・ステージのbyte数 64byteに対して8byteだけで IN トランザクションが完了したことになりますが、とにかく完了します。

 BDステータス = 34 ( bit2~bit5 がSETUPを示す)
 受信バッファ  = 80 06 00 01 00 00 40 00

          2byte目 06 は Get_Descriptor()
          4byte目 01 は 標準device
          7byte目 40 は データ・ステージのbyte数

セットアップステージに続く、データステージとして IN トランザクションが完了し、ステータスステージでホストからDATA1 として空のデータを送る OUT トランザクションがあるのですが、前述の通り OUT側 BDステータスレジスターに 88H を設定している為に受信バッファを更新することなく(割り込みも無く)ACK応答しています。

BD ステータスレジスターの bit4 ( DTSEN )をセットしていると、指定された DATA0/1 と異なる場合にはバッファを更新せず、割り込みフラグもセットしない(割り込みも発生しない)まま ACK を返す仕様を利用しています。 BD ステータスレジスターの値 88H は bit6 ( DTS )が 0 なので DATA0 を待っているのに対して、DATA1 を受信することで割り込み無しで ACK 応答している訳です。

Windows XPでは、2度目の RESET に続いて、Set_Address() が送られてきます。 受信例は以下の通りでした。

 BDステータス = 34 (bit2~bit5 がSETUPを示す)
 受信バッファ  = 00 05 02 00 00 00 00 00

          2byte目 05 は Set_Address()
          3byte目 02 は デバイス・アドレス


USB関連記事のインデックスは右記事の末尾にあります。→ USB CDC 


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。




USB CDC

 18F1320 を使って色々試しながら幾つか作りたいアイディアを考えていますが、将来的にはパソコンと接続してデータ交換を行う必要が出て来ると感じています。 プログラム定数の書き換えや、ロギング・データの転送と言った場面を想定しています。 これらは MPLAB と PICkit3 があれば何でも出来るのですが、このブログで作る道具を使う人皆が開発環境に投資してくれるとは限りません。 USART で RS-232C と言う手もありますが、PC から RS-232C が無くなっていますから、変換ケーブルなどに余分な出費が生じます。 そこで USB PIC の中から 18F2550 に挑戦することにしました。

PIC18F2550 は Microchip 社が提供しているソースライブラリーを使うことで、比較的簡単にUSB機能を使えるようですが、私はアセンブラに拘りたいと思います。 USB は未経験ですが、PIC18F2550で USB CDC デバイス製作に挑戦です。

Webで調べてもアセンブラで USB CDC を動かして、詳しい情報を公開しているページは見つけられませんでした。 Cで実現しているページを参考に少しづつ試してみるつもりです。 ターゲットは秋月電子通商さんの USBマイコンボード 完成品(PIC18F2550) です。 PICkit3 を接続する為にもブレッドボードに挿して実験開始です。

DSC00123

とりあえず PIC18F1320 で作ったLED点滅が動いたところです。 ヘッダーファイルの差し替えと TIMER0 定数変更( 内臓8MHz → 外付け20MHz による PLL で 48MHz )だけですんなり動いています。

この挑戦は色々調べて試行錯誤が必要になると思います。 これまでのように動作確認してから記事を書き始めるのではなくて、試行錯誤の様子も記事にする予定です。 ステッピングモーターや内臓EEP-ROMの読み書きなど積み残しの課題と並行して少しずつ紹介しますから、気長にお付き合い願えれば幸いです。


以下は関連記事のインデックスにします。

USB CDC 初受信 
 ようやく最初のホストからのSETUPコマンドを受信jするところまで来ました。

USB CDC RESET  
 最初に出くわしたトラブル、ホストからのRESETを検出できないと言う経験について書いてみます。

USB CDC BDT 
 バッファ・ディスクリプタ・テーブル(BDT)について説明します。

USB CDC 初期設定 
 USB機能を使う為の初期設定について説明してみます。

USB CDC Get_D(device)受信 
 これまで紹介した初期設定の下で、Get_Descriptor ( device ) を受信するまでの高位割り込み処理について説明します。

USB CDC IN トランザクション(1) 
 Get_Descriptor ( device ) に続く IN トランザクションの経験について説明します。

USB CDC IN トランザクション(0) 
 前回記事で受信したSETUPステージ( Set_Address()  )に対するステータスステージに当たる、空の IN トランザクションについて説明してみます。

USB CDC IN トランザクション(2) 
 Get_Descriptor ( device ) に対するデータステージについて、経験したことを紹介します。


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。



ダウンロードコーナー
記事検索
アンケートに御協力下さい


アーカイブ
楽々PIC 宛てBlogMail


--- ご了承下さい ---

注意して記事を書いていますが、記事及びリンク先の情報による不利益について、一切責任を負い(負え)ません。
QRコード
QRコード
アクセスカウンター

    Atsuhiro Imai

    バナーを作成


    プロフィール

    jyosou_robot

    • ライブドアブログ