USB1.1 およびUSB2.0におけるエニュメレーションの違いが知りたい

H8/3069で、USBコントローラSL811で、USB機器の検出と接続速度の判定はできるようになったのですが

エニュメレーションのとっかかりで、うまくゆきません。何か参考になる資料をご存じないでしょうか。

SOFに同期させて送信しないとかいけないとか、1フレームに1トランザクション以上はだめとか

そんな情報が書いてある資料の情報とか、xxxに書いてあるといった情報がほしいのです。

SL811でうまくゆかない、下記のUSBメモリも、USB2.0準拠のコントローラMAX3421Eで、ディスクリプタが

取得できることは確認できています。(arduino+ホストシールドで確認。ただし、何をやっているのかは

MAX3421の使い方がわからないので、サンプルプログラムで確認しただけです)

 したがってSL811ではどうやっても無理なのかもしれませんが、それが判断できなくて困っています

ロジアナを引っ張り出しても、何が悪いのかわからないと対策の取りようがありません。

(現状は、ロジアナは使用せず、ソフトで要所要所でシリアルポートに進捗情報を出力する様な処理を

 入れて確認しています)

最悪は使えるメモリにあたるまで、試してみるしかないでしょうが、地方なので入手できるメーカや品番は

限られています。

現在分かっていること(SL811は、ホストとして使用) 各デバイスは、PCでディスクリプタの内容を事前に確認

1.ロースピードのキーボード(USB2.0対応)

「HOST」SETUPパケット+データ(ディスクリプタ要求

「DEVICE」ACK(SL811のフラグで確認)

「HOST」 INパケット(Sl811内のレジスタを設定して送信)

「DEVICE」 データ(SL811内の受信用のバッファが更新されていることで確認)

「HOST」 ACK(確認できないので推定)

2.フルスピードのSDカードリーダー(USB1.1対応:ディスクリプタの情報)

「HOST」SETUPパケット+データ(ディスクリプタ要求

「DEVICE」ACK 

「HOST」 INパケット

「DEVICE」 データ 

「HOST」 ACK 

3.USBメモリ1

「HOST」  SETUPパケット+データ(ディスクリプタ要求)

DEVICE」 ACK

「HOST」 INパケット

「DEVICE」無応等

リトライしても変化なし 

4.USBメモリ2

「HOST」  SETUPパケット+データ(ディスクリプタ要求)

DEVICE」 無応答

リトライしても変化なし

プログラムの途中で、シリアルポートへ経過を出力しているので、タイミングはむちゃくちゃだと思います

以上の様に、USB1.1のフルスピードの機器とはエニュメレーションできていますが、USB2.0でフルスピードの

機器とはエニュメレーションがうまくいっていません。全然だめな場合と、最初はACkが戻るが、以降はだめの場合あり

恐らく USB2.0の仕様を満足していないためだと思いますが、この辺が俗に言う相性問題の様な気がします。

Parents
  • USBプロトコルアナライザというものがあります、PC側にインストールしてパケットの内容が確認できます、無料で入手できます。

  • 幽霊会員さん

    USB1.1規格はUSB2.0に内包されていて、
    フルスピードの後にChirpが始まるのでChirpを行わなければ
    ロースピードとフルスピードはUSB1.1と2.0で共通です。

    USBの動作は以下の仕様書に全て記載されています。
    http://www.usb.org/developers/docs/usb20_docs/

    TECH I シリーズ Vol.40にSL811の特集があるのでそれを見たほうが早いかもしれませんね。
    http://shop.cqpub.co.jp/hanbai/books/49/49941.html

  • Kirinさん

    ご紹介のあったTECH I シリーズ Vol.40にSL811の特集ですが、あまりに説明不足や図表の誤りが多く

    プログラム以外参考になりません。アマゾンの評価でも、あまり良い評価ではなかったですが、自分も

    読んでみて納得しました。特に、知りたいことが書いてないのは痛いです。SOFタイマー割り込みの

    使い方、SOF同期の使い方に触れておらず。プログラムにも記載が無いので、どうやって使えばいいのか

    わかりません。フルスピードの時に使えばいいらしいのですが、うまく使えていません。

     ネット上では、1フレームに1トランザクションしか流れないのでスピードが出ないとか書いてありましたが

    データシートを見る限り、そのように解釈できる個所はなく半信半疑です。

     いくつか参考になるプログラムをネットで見つけましたが、手元の環境ではうまくゆきませんでした

    今となっては、過去のデバイスですから手元の基板に載っていなければスルーして、USB2.0に準拠した

    コントローラを使いたいところです。

    >ロースピードとフルスピードはUSB1.1と2.0で共通です。

    資料を見る限り、そのように思いますが、手元の環境ではUSB1.x のフルスピード と USB2.0の

    フルスピードのデバイスで挙動が違い、首をかしげています。(なんで同じデータを送って返事が違うのか

    理解に苦しんでいます。エニュメレーションのデータなのでデバイスのクラスが違っても方法は同じはず)

    万策尽きたので、(考えるより、うまくいくホストと行かないホストの違いを実際のBUSのデータで見た方が

    よさそうなので)、ローコストのロジアナ(簡易USBプロトコルアナライザ機能がある機種)を購入し調べるつもりです。

    最大でも8ms分ぐらいしか記録できないようですが、エニュメレーションぐらいなら何とかなると思っています。

  • なかなか解決しないようですね、内容を拝見していると、ハード的な問題でもあるように思いました、実績のあるハードウェアでしょうか?USBに関してはUSBのクロックや伝送路のハード品質が適正でないと、ツボにはまります、いくらソフトで解決しようとしても無理です、私はいやというほど記憶しています、評価ボードのような実績のあるものでされることは推奨されることです、新規デバイスで新規基板製作なら評価回路図もないところから始めるならリスクを覚悟しておかないといけません、USBは非常にシビアです、簡単そうですが甘くみているとひどい目に会います。

  • 自己レスですが、エニュメレーションに関しては解決したのでご報告します。

    (方法)

     プロトコル解析機能つきのロジアナ(zeroplus LAP-C)でUSBバスの状態を確認。

     手持ちの大半のUSBメモリおよびデバイスではエニュメレーションは問題なく実行できた

     (ひとつだけ、エニュメレーションに失敗するUSBメモリあり、

      この場合も arduino+ホストシールドの組み合わせでは、エニュメレーションに成功する。

       もともとのH8のプログラムの挙動(ある組込OSのドライバ)

        USBバスリセット

        速度判定と初期設定

        SETUP( デバイスデスクリプタ要求)

        ACK 受信

        IN (データ要求)

        NAK 受信

        数フレーム時間を置く

        IN (データ要求) 

        NAK 受信

        以降 INと-NAKの繰り返し で リトライ回数オーバーで エニュメレーション失敗

        (ほとんどのUSBメモリは、IN-NAKの後に時間を置いても、次のINに対しACKが返るが

         ひとつだけ、だめなものがあった。)

        ackが返った場合は、以降のエニュメレーションは正常にできている。

       だめなUSBメモリをarduino+ホストシールドでエニュメレーションした時の挙動

        USBバスリセット

        速度判定と初期設定

        SETUP( デバイスデスクリプタ要求)

        ACK 受信

        IN (データ要求)

        NAK 受信

        以降 ACKが返るまで、IN-NAKを繰り返す。

        ACKが返ったら、エニュメレーション続行

        以降の処理は正常に実行できていることを確認。

     以前記載した手順のデバッグでは、テスト用にプログラムを組み、SL811の処理と並行して

     シリアルポートに実行経過を出力してパソコンで確認するという手順を踏んだが、USBの

     ハンドシェークに比べて時間がかかりすぎ 本来のUSBのハンドシェークに影響を与えて

     処理の流れが乱れて、正確な評価ができなかったのが 混乱の原因のようです

      バスが高速な場合、ロジアナというより、簡易版でもプロトコル解析機能のある機器

      (あるいは、解析機能を持つハードウェア)を利用しないと解析が長引くことを痛感しました。

Reply
  • 自己レスですが、エニュメレーションに関しては解決したのでご報告します。

    (方法)

     プロトコル解析機能つきのロジアナ(zeroplus LAP-C)でUSBバスの状態を確認。

     手持ちの大半のUSBメモリおよびデバイスではエニュメレーションは問題なく実行できた

     (ひとつだけ、エニュメレーションに失敗するUSBメモリあり、

      この場合も arduino+ホストシールドの組み合わせでは、エニュメレーションに成功する。

       もともとのH8のプログラムの挙動(ある組込OSのドライバ)

        USBバスリセット

        速度判定と初期設定

        SETUP( デバイスデスクリプタ要求)

        ACK 受信

        IN (データ要求)

        NAK 受信

        数フレーム時間を置く

        IN (データ要求) 

        NAK 受信

        以降 INと-NAKの繰り返し で リトライ回数オーバーで エニュメレーション失敗

        (ほとんどのUSBメモリは、IN-NAKの後に時間を置いても、次のINに対しACKが返るが

         ひとつだけ、だめなものがあった。)

        ackが返った場合は、以降のエニュメレーションは正常にできている。

       だめなUSBメモリをarduino+ホストシールドでエニュメレーションした時の挙動

        USBバスリセット

        速度判定と初期設定

        SETUP( デバイスデスクリプタ要求)

        ACK 受信

        IN (データ要求)

        NAK 受信

        以降 ACKが返るまで、IN-NAKを繰り返す。

        ACKが返ったら、エニュメレーション続行

        以降の処理は正常に実行できていることを確認。

     以前記載した手順のデバッグでは、テスト用にプログラムを組み、SL811の処理と並行して

     シリアルポートに実行経過を出力してパソコンで確認するという手順を踏んだが、USBの

     ハンドシェークに比べて時間がかかりすぎ 本来のUSBのハンドシェークに影響を与えて

     処理の流れが乱れて、正確な評価ができなかったのが 混乱の原因のようです

      バスが高速な場合、ロジアナというより、簡易版でもプロトコル解析機能のある機器

      (あるいは、解析機能を持つハードウェア)を利用しないと解析が長引くことを痛感しました。

Children
No Data