H8/3069 で USB_HOST SL811HSTのプログラムを書いています。
その際、USBリセットした後の、デバイスのスピードが、LowSpeed固定で
他のスピードを認識することができません。FUll-speed と HI-speed に 対応した
USBメモリで、LowSpeedに対応しているとは書いてありません。
複数のスピードに対応できるデバイスを、ホストにつなぐ場合、D+の状態以外に
何か確認しないといけないのでしょうか。ネットで調べてもそれらしい情報は無く、途方にくれています。
ネット上で、USBリセット中に、charp で HI-speed と Full-Speed の 区別ができるとありましたが
デバイス側 と ホストで やり取りすると あって。 charp に 応答できないと low speed にしか
ならないのかとも思っています。何か参考文献があれば、教えてほしいのですが。
幽霊会員さん
ちなみに、ホスト側のd+,d-に15kΩのプルダウン抵抗いれてます?
SL811HSTの使い方はサイプレスのフォーラムで色々教えてもらえると思いますよ^^ http://japan.cypress.com/forum
Kirinさん
お返事ありがとうございます
ハードウェアについては、既成ボードで。回路図ではD+,D-とも15KのPULL-DOWN抵抗が入っていますし
33オームのダンピング抵抗が入っています。
ボード添付のドライバの動作がおかしいので、ドライバを使用せずに、ユーザーアプリでレジスタを操作して
動作を確認しています。まだ、ディスクリプタの取得はできていません。
(USBメモリは、arduino + ホストシールドでは、 ディスクリプタの取得までは確認できるので
SL811とUSBメモリの相性か、H8のプログラムが悪いかのどちらかだと思います)
CYpressのページで、書いてある通りにレジスタを操作していたら、ロースピードとしか判定できないので
質問しました。
(手順)
ホストモードにする
割り込みステータスのリセット
USBリセットする
50ms待つ(USB2.0の場合、他に10msとか20msとかとも書いてある資料がある、こちらはusb1.1を想定?)
USBリセット解除する
割り込みステータスを確認する
デバイス検出、着脱のビット確認(差しっぱなしなら、デバイス検知のビットのみ、USBリセット時、省電力モードは解除されているはず)
D+を見る(Lなのでロースピード)
cypressのページには
japan.cypress.com/.../know-inserted-device-full-speed-or-low-speed-when-sl811-host
で
接続したデバイスが、フルスピードかロースピードか知る方法は書いてありますが、複数のスピードに対応したデバイスへの
対処方法は、現在のところ見つけることができていません。
USB2.0対応のパソコンでは、ハイスピード認識されています。(たぶんcharpプロトコル対応)
質問したかったのは、とりあえず、ロースピードでつながった場合
ホスト側で、デバイスに対してFULLスピードで使えるか問い合わせる方法があるかということです。
もしくは、デバイスディスクリプタの情報に、USB2.0と書いてあったら、ホスト側からスピードを変えられるかと
いうことです。
現状、どうにもならないので、ロースピードのままでディスクリプタの取得をやってみるつもりです。またUSB2.0に対応していないPCで、
スピードがどうなるか見てみようと思っています。(おそらく、フルスピードと認識されるでしょうが)
もしかして、USBメモリは組み込み機器への接続はできないのでしょうか(PCとの接続しか想定していないとか)
現状は、こんなところです
USB規格(サイプレスのチップでも)ではロースピードからフルスピードに遷移する仕組みはありません。 試しに、ウエイト時間を変えて動作が変わるか見てみてください。
チップの動作は良く分かりませんけれども、たふん、USB波形をオシロで確認した方が早い気がします。。。
http://www.usb.org/developers/docs/usb20_docs/
横から失礼しますUSBのスピードの設定ですが、SHの例では手順がありまして最初LowSpeedに設定して状況を確認してHI-speedやFull-Speedに設定します、この全てをソフト側の処理で行います、現状の私が使用しているCPUでは自働的には切り替わりません、USBの設定は自分側のみではではなく接続相手がどういう環境でも接続できるようにするため、やり取りの中で通信方法を双方が納得できるようなやりかたで行うため、どんな機器に接続しても必ずHI-speedになるというようなことはありません、それを知る方法はLowSpeedで相手のコンフィグレーションデータを取得して解析することです、その中には可能なspeed、可能な通信タイプ、転送路の数等の情報があります、その中にHI-speedが可能となければ自分がHI-speed可能でも通信は成立せず、LowSpeedとあればLowSpeedで通信することになります、お分かりのことであれば失礼しました。
kirinさん 資料ありがとうございます
Wait時間はいろいろいじってみたいと思います
IKUZOさん おっしゃる通りだと思います。どうやら、USBは、デバイス側に
速度の決定権があるようですね。最初は、ロースピードで接続し
ディスクリプタの内容でスピード変更ができるのかと最初は
考えていましたが、そのような記述はどこにもありませんでした。
それを、ソフトでやるのは相当大変な気がします。
CYpressのアプリケーションノートを読んでいると、USBリセットのやり方や
スピード判定時のレジスタの設定や数値、書き込みの順序や判定方法が手元の
文献の記載と異なっていました。釈然としないのですが、アプリの方法で試して
見ようと思います。レジスタの設定の依存関係がデータシートを読んでもさっぱり
でしたが設定の方法にノウハウが有るようです。
死蔵していた手持ちの機器の中に、ロースピード専用、および、フルスピードでしか
使用できない機器がありましたので、まずこれらの機器のスピードが認識できるよう
プログラムを見直す予定です。
ロースピード USBキーボード
フルスピード USBN9604の試作用基板(D+がPullUpしてあり、フルスピード専用)
どちらも、PCで認識できることは確認できています。
自己レスですが、最終結果を書いておきます。
SL811のマニュアルの読み間違いで、デバイスを接続したままの状態で電源を投入した場合
電源投入後にデバイスを接続した場合、USBリセットを実行した場合のその後のフラグの挙動
など、参照した資料の記述に紛らわしいところがあり混乱したのが原因です
参照した文献の表には、デバイス検出時に1になると書いてあるのに、本文では、1の場合は
デバイスガ存在しないと記載されていて、表の記載でプログラムを書いて失敗しました。
メーカーの英文マニュアルには、表中で 1の場合はデバイスガ存在しないと書いてあった。
(解りにくくても、メーカーのマニュアルを何度も読み直すべきでした)
結局、1でデバイス有りと判定し、D+の状態を読みに行ったらD+はLに決まっているので
ローデバイスにしてしまったのが、処理がおかしくなった原因です。 USBリセットの時間は
それなりで良かったみたいです。