マイコン工作実験日記

Microcontroller を用いての工作、実験記録

High Speedを確かめる - その3

2017-06-03 16:31:49 | Weblog
なかなか進まないHigh Speedでのアイソクロナス転送の動作確認。前回の記事で書き忘れていたことがあったので、書き加えておきます。

そもそもCubeMXの吐いたコードでは、USB FiFoへの転送にDMAを使うように設定するとちゃんと動いてくれませんでした。STM32 Forumを探したら同じような人を発見。どうも最近のHALのアップデートでおかしくなっているらしい。そしてもう少し探していたら、パッチを出してくれている人を発見。このパッチを入れたら、DMAでマイクロフレームあたり2つのパケットを出すことができるようになったのですが、3つ出そうとするとやはりうまく動いてくれません。ステータスレジスタを読んでIN endpointの動作状況を調べてみると...



どうやら3つ目のパケットを送信しようとした時点で、送信FIFOにまだデータの準備が整っていないようです。DMAでFIFOにデータ送っているハズなんですが、DMA転送が間に合っていないってことなんでしょうか?USBの内部DMAについてはマニュアルを読んでもほとんど説明がありません。そもそもOTG_HSの説明すらあまり充実しているとは言えないのですが、その背景にはUSB OTG部分そのものがSynopsisから買ってきたIPを使っているからという大人の事情があるのかもしれません。

どうすればDMAが正しく動くようになるのか見当もつかなかったので、試しにDMAを使わずにソフトでTx FIFOに書き込むようにしてみたら、なんと1マイクロフレームに3パケット送れるようになりました。とりあえず、3パケット送れることは確認できましたが、どれだけ実用的に使えるのは不安ですね。

STM32のHigh SpeedってSTM32F2の時代からあるのでとっくに枯れているのだと思っていましたが、実際にCubeMXのアイソクロナス転送を使ってみるとドライバのコードは1マイクロフレームで1パケットしか送れないコードになっていました。デバイス側だけでなく、ホスト側の処理も同じようです。その程度の使われ方しか想定していないんでしょうかね。