マイコン工作実験日記

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パケットしか送れないコードになっていました。デバイス側だけでなく、ホスト側の処理も同じようです。その程度の使われ方しか想定していないんでしょうかね。



ワイアレスデータ転送

2017-05-30 15:19:25 | Weblog


今さならながら10代工学の動画でPO-32を知りました。ワイヤレスデータ転送が新機能のひとつの売りのようです。懐かしい音に感激しちゃいますが、WiFiとかBluetoothじゃなくてマイクで拾うというのが、かえって新鮮に見えるのかもしれません。

High Speedを確かめる - その2

2017-05-27 20:55:52 | Weblog
STM32F446を使ったUSB High SpeedのUVCの続きです。VGAの画面をUVCの非圧縮 YUV形式で送ろうとすると 640*480*2 = 61440バイト/フレームのデータ送信が必要となります。High speedのアイソクロナス転送ではトランザクションあたり1024バイトを送ることができますので、1フレームを送るには614400/1024 = 600トランザクションが必要です。1マイクロフレームに1トランザクションしか使わなければ 8000/600 = 13.3フレーム/秒までしか送れません。これ以上のフレームレートで送るためには、1マイクロフレームで複数回の転送が必要になります。

High speedでは1マイクロフレームで3回までのアイソクロナス転送が可能ですが、まずは2回での動作確認をしてみます。準備としてはCofnig Descriptorを変更してやります。High speed対応のエンドポイントでは、次のようにwMaxPacketSizeで1回あたりの転送量とマイクロフレームあたりの転送回数を指定します。



これでDataInのハンドラが呼ばれた時に最大2048バイトを転送してみたのですが... 画面は真っ黒なままで何も表示されません。前回と同じようにDataInのハンドラが呼び出された回数を確認してみると...



ダメダメです。マイクロフレームに2回どころか、2マイクロフレームに1回も送れてないじゃないですかぁ。そこで送信のコードを追いかけててみたところ、stm32f4xx_ll_usb.c の USB_EPStartXfer()に次のコードを見つけました。
      if (ep->type == EP_TYPE_ISOC)
      {
        USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT);
        USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & (1 <

DIEPTSIZレジスタのMULフィールドには1マイクロフレームで送る転送数をセットしなければいけないのですが、これでは常に1回しか送らないことになってしまいます。この部分を修正したとろろ、ちゃんと2倍の速度で動くようになりました。

続いて3倍に挑戦してみたのですが、今度は全く動かず。DataInが1回しか呼び出されません。転送終了の割り込みがかからないということでしょうか?FIFOのサイズ設定を変更してみたりとかもしてみたのですが、やはり3パケットを送ることができません。もともと1パケットしか送れないコードだったくらいですから、これまでアイソクロナス転送で複数パケットを送るような使い方をされておらず、全くバグ取りができていないということでしょうか?

High Speedを確かめる

2017-05-26 22:31:26 | Weblog


ようやくMacとUVC接続できるようになったものの、表示させたカラーバーのスクロール速度がとても遅くて、1ラスタずつスクロールしていると縦方向480ラスタを移動するのに1分ちょっとかかってしまっています。1秒間に8フレームも送れていない計算になります。

確かにFull speedには出せない転送速度は出てはいるものの、High speedにしては遅すぎるので、ちょっと調べて見ました。具体的にはSOF割り込みの回数(sof_total) と アイソクロナス転送要求の回数 (datain_total)、そして1秒あたりの転送要求回数 (datain_sec)を数えてみました。High speedでは マイクロフレーム(125usec)毎にSOFと転送がかかるので、1秒間に8000回のSOF/転送が発生するはずなのですが、10秒ほどカメラを動かすと次のような結果となりました。



どうやら半分しか転送処理が走っていないようです。アイソクロナス転送で送るラスターデータを、その度に作成してから送信していたので、どうやら1回あたりのデータ作成とその送信処理が125usec以内に間に合わなかったために、2回に1回しか送信ができていなかったようです。そこで、あらかじめRGBのデータを用意しておきて、それにUVCのヘッダ情報を加えるだけに処理を簡略化してみました。



今度は、毎秒8000回の送信が回るようになり、画面のスクロール速度も倍になりました。現在はアイソクロナス転送で使用するエンドポイントのサイズを1024バイトにしているので、これで想定通り64Mbpsで送れていることになります。さて、High speedでは1マイクロフレームで、アイソクロナス転送を3回送ることが可能な仕様になっていますので、今度はこれに挑戦してみることにします。

MacOSで再挑戦

2017-05-23 23:52:23 | Weblog


昨年UVCを使ってSTM32L476をMacOSとつなげようとした際には、Config descriptorの読み取りはするものの、その後MacOS側から何のアクセスもないために接続できずにいました。今回 STM32F446 と USB3300を使って再挑戦して、試行錯誤しておりましたが、何とか動作確認のためのカラーバー画面を出すことができました。

動作確認に使っているソフトはPhoto Boothです。



画面サイズは VGAサイズ(640x480)を使っています。今回の実験でわかったのですが、どうやらPhoto Boothは VGAよりも小さい画面サイズだとカメラとして使ってくれないようです。これでUSBハイスピードで画像データを送れることを確認できたのですが、何だかスクロール表示速度が遅いようなので、もう少しちゃんと転送速度を確認した方が良さそうです。

USB3300をつなげた

2017-05-14 10:40:51 | Weblog


eBayで購入してあったUSB3300 PHYをようやくとNucleo-F466REに接続。
PHY用のULPIに割り当てた端子と直結するだけでですが、Nucleoボード上で使用されている端子が2つあるのでこれらについてはジャンパ変更が必要です。
  • PA3 (ULPI_D0)は ST-LinkのVCOM用UARTとして使われているのでSB13を取り外して、切り離し。
  • PA5(ULPI_CLK)はボード上の緑LEDとつながっているので、念の為SB21を取り外して切り離し。

これでUSB High Speedを試す準備は整ったので、あとはソフトの作成です。とりあえず、CubeMXを使ってCDCデバイスのドライバを組み込んで動かして見たところ、アプリケーションは何も書かなくても、CDCデバイスとしての認識はできたのでハードウェアとしては機能している様です。デバイス側のドライバは基本的に割り込みで動作する様に作られているので、アプリケーションが無くてもUSBデバイスのエニュメレーションまでは動いてくれるのでした。

今後の予定としてはSTM32L476で中途半端な状態で断念したUVCに、このSTM32F466でHigh speedで再挑戦して見るつもりです。カメラをつなげてUVCカメラとすべくカメラ接続用のコネクタも用意しておきました。


LinkIt 7697

2017-04-28 12:52:49 | Weblog


seedのFusion PCBが値下げされて随分と安くなったのに驚き。この値段だったらちょっとした変換基板はさっさと作った方がいいくらいな気がしてきます。

Seedでもうひとつ気になったのが、LinkIt 7697です。WiFiとBluetoothのコンボなんでESP32対抗として興味深いところです。コアがCodex-M4ということで、自分としては使いやすいかも。SeedのベージやMediaTek Japanの製品概要を見ると、Bluetooth 4.2 (Low Energy)という表記になっていて、BLEしかサポートしていないような印象を受けるのですが、データシートをダウンロードして読んで見るとBDR/EDRもサポートするように書かれています。うーん、どっちが正しいんでしょうね。データシートの方が正しいと思いたいのですが、今時データシートも別製品の説明のコピペから編集して作成しているために往往にして間違っていることもありますしね。

SDKも出ているようなの覗いてみたところ、ベースはFreeRTOS+lwipのようです。この点もESP32と同じですね。Bluetooth Classicのプロファイルもしっかり用意されており、SPP, HFPに始まりA2DPやPBAPまで揃っているようです。さすがにこの部分はソースではなくライブラリのバイナリ提供ですが。

Seedのヘッダーボードを確認してみると、USBシリアル変換を介してUART経由での書き込みとデバック出力ができるようですが、残念なことにJTAGコネクタが用意されていません。うーん、JTAG無しでのデバックは辛そう。自分でコネクタつければいいかと思い直してPIN割り当てを調べて見ると、見事に書き込み用UARTと重なっていてヘッダーに信号が出ていないではありませんか。うーん、もう少し使いやすい開発ボードが欲しいです。

4/29追記
どうやらBDR/EDRをサポートしているようなデータシートの記述はやはり間違いのようです。SDKにBluetooth classicのプロファイルが含まれているのは、デュアルモードをサポートできるMT2523もSDKのサポートチップに含まれているからのようです。

USB3330

2017-04-22 19:11:49 | Weblog


連休中に遊んでみるつもりで、随分と前(半年くらい前?)に買ったまま放置されていたUSB High speed PHYを引っ張り出しました。この記事にも書いたように、STM32シリーズではSTM32F7x3を除けば USB High speedに対応しているデバイスでもUSB PHYは内蔵していないので、外部にPHYが必要となります。実験に便利なように出来合いのボードを探したのですが、評価ボードを除けばこのWaveshareのボードしか見つけられませんでした。STM32のForumを調べても、このボードを使っている人が多いようです。

STM32とはULPIというインターフェースでつながりますが、データ線8本とクロック、制御信号を持ったパラレルのインターフェースのようです。USB2.0のHigh speedでは480Mbpsの転送速度をサポートしますが、8ビットパラレルに変換することで、マイコンとのインターフェース速度は60Mに低減できるというわけですね。ボード上には24MHzのクリスタルが載ってていますが、USB3300がこのクロックから60MHzのクロックを生成してULPIのCLKOUT信号として供給してくれます。

つなげ先としてはNucleo-F446REを使う予定です。

ESP-IDF 2.0

2017-04-11 12:45:09 | Weblog
気づくともう一月記事を書いていませんでした。なんか仕事や体調不良が続いて、自分の作業には全くの進展なしです。

秋月でESP32-DeviKitCの取り扱いが始まったので、自分も人並みにESP32を触ってみようかという気になってきています。少しは勉強しなければいけないかなと思っていたら、ESP-IDF 2.0がリリースされた事を知りました。なるほど、実際にどんなAPIが用意されているのかは、IDFの内容をチェックすればいいのですね。見るとやはりWiFi/BLEが中心という感じです。Classic Bluetoothはまだサポートされていないんですね。ちょっと期待してたのに。。

探してみたらBtstackのESP32へのポートがあることが判明。とりあえずSPPまでは動くみたいですが、タイミング的にIDF 2.0の出る直前なので、IDF2.0で動くかどうかは確認必要でしょうか。別に急がないので、しばらく様子見かなぁ。

32F723EDISCOVERY

2017-03-03 12:13:34 | Weblog


遅まきながら、32F723EDISCOVERYが発表されてすでに販売されていることを知りました。今までのDISCOVERYと大きく印象が異なるのは、STMod+とか呼ばれる拡張コネクタとそれを使って、Grove, Click board, ESP-01に対応していることですね。Groveのモジュールは秋月などでも入手可能ですので、便利そうです。Clock boardはMicroChipを筆頭に採用するボードが増えてきているようなのですが、残念ながら国内の大手販売店ではまだ取り扱いがないようです。

STM32F723についてちょっと興味を引かれるのは、USB High Speed PHY を内蔵しているという点。STM32シリーズでは今のところこのラインの製品だけがPHY内蔵なんじゃないでしょうか。実は、HIgh Speedに挑戦してみたくなって、先日USB PHYを購入したところで手付かずのままになっています。なかなか動かすための作業ができないでいるのですが、近いうちに、USB PHYだけでも紹介する記事を書こうかと思います。