« stm32ループバック | トップページ | stm32の動作 »

2010年6月12日 (土)

stm32でuusbdをためしてみたら

がた老さんの手作りダブルバッファ+空振り作戦により
stm32もループバックをさせることができるようになりました。
そこで78kでもやったようにi2c制御をくっつけてみたら
あっさり動きました。
i2cは、78kでのノウハウ(とまではいえないか)
に加え、ねむいさんが公開してたもの
http://nemuisan.blog.bai.ne.jp/?eid=157305
があったので
参考にさせてもらった(いや、ほとんどパクッた)のが
大きかったです。

で、次の段階として78kでやったように仮想comからuusbdに移行して
処理高速化を図ろうとしました。

78kのときはPCアプリケーションでは決めうちのインタフェース番号、
エンドポイント番号にでつなげましたが、共通化のため
bulkのエンドポイントが2つそろって入っているインタフェースを
見つけるロジックをなんとかつくりました。
これも意外とすんなりいきました。

しかし問題発生。
データ転送でぶっとんでしまいます。
stm32側は何も変えないので、バルク転送でデータをやり取りすることに
なりますが、データをstm32に送ったら直ちにレスポンスを待ちます。
このときレスポンスデータが0個だったらエラーという風にしてましたが
別にそれ以上の処理をしてなくて現象となってました。

※これ以下、勘違いして書いていることが多いので注意!!
0個、よく考えたらstm32では「空振り」させるようになってるから
あたりまえなのか。
でも78kの時は0個を送ってくることはなく、いっぺんにほしいだけ
(2、30バイトくらいですけど)とれていたので
そういうつくりにしてました。

そう考えると、「空振り」を回避したくなりました。
で、データがないのにPC側からINの要求が来たら、
データを渡すんじゃなくてなにかあるのでは?
と、ネットで検索。
そういう時はNAKを出すと。
ということは、いまの状態はACKを出してたのかな、
と思いました。

そこで送信しないときNAKの状態にして
やる方法がないか、ソースを検索してたら

    SetEPTxStatus(ENDP1, EP_TX_NAK);

とすればできそうなことがわかりました。
※これは入れても入れなくても何も変わらないとわかりました。

早速、STM32_USB-FS-Device_Lib_V3.1.1を
ループバックに修正してmainループにはいる直前と
mainでデータ受信を検出した直後に上記を入れ、
送信データの設定をした後に

    SetEPTxValid(ENDP1);

を入れてみるとあっさり通信がうまくいきました。
※すみません。これは必ず入れないといけないもので
勘違いでかいてました。(なにもわかってなかったともいえますけど。)

0個のデータでなくほしい個数のデータが
くるようになりました。
仮想comでも大丈夫です。

さらにどうせなら受信完了直後にNAKの状態
にしたいと、EP1_IN_Callback()の中においてみたら
これも問題なし。
「ride7stm32vcp_loopback2.zip」をダウンロード
※あとで確認しました。
メインループに入る前とEP1_IN_Callback()に入ったときの
状態は確認時いつもnak状態でした。
つまり不要です。

私はSTM32_USB-FS-Device_Lib_V3.1.1では
USB通信が全くうまくいかなかったので
がた老さんの手作りダブルバッファ+空振りを
使わせてもらってました。
もしかするとがた老さんのプログラムでも
nak状態に入れるよう修正すれば
手作りダブルバッファ+空振りがいらなくなるのか?
と、ちょっとやってみました。
「stmvcpd_kai.zip」をダウンロード

一見うまくいってるような…。
※オリジナルでの時間計測では表示上2Mbps出てますが、
私の修正版では
USB_PutLine()ごとに転送してるから350kbps程度です。
効率よく64byteずつ転送すると逆に4Mbps程度となります。
「stmvcpd_kai_main2.zip」をダウンロード →main.cを入れ替えると
時間計測の部分だけ64byteずつになります。
「stmvcpd_kai_main2hex.zip」をダウンロード→そのhex/dfu です。
…さらに訂正。うまくいかなくなる状況がありました。USB HUBを
使ったときで他にもデバイスをいくつかさしていたときです。
他のデバイスを抜いたりしたらうまくいきます。

少なくとも私がやってるような、
データをもらったらそれにあわせてレスポンスを出す、
くらいな処理ならこれでいいのかも。
※きたときだけ送る方式なので大丈夫だったようです。
またUSB HUBにさしていた場合、他にさしている
デバイスの影響で、64byteごとで全く問題ない場合と
そうでない場合がありました。他のデバイスを抜いたり、
直接PCにさして試すほうがよさそうです。

|

« stm32ループバック | トップページ | stm32の動作 »

stm32」カテゴリの記事

usb」カテゴリの記事

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1096208/35212327

この記事へのトラックバック一覧です: stm32でuusbdをためしてみたら:

« stm32ループバック | トップページ | stm32の動作 »