ArmマイコンUSB-シリアル変換モジュールを使ってみる。


写真はNECLEO STM32F446RE評価ボードとUSB-シリアル変換モジュールでシリアル通信の様子。

2024.10.27

はじめに
 今回はUART通信にTRYします。
 以前はこちらのページでUSB通信にTRYしましたが、通信速度がPC性能に制約を受けてしまい、USBのスピードが活かせません。
 USB-シリアル変換モジュールを使いバーチャルコムポート(VCP)のスピードアップを目指します。

なぜUART
 STM32F446のUSBは、USB2.0対応で、スピードは2.0Mbpsですが、PCとの通信でUSB CDCを使う場合、PC側のCOMポートの速度は機種にもよりますが、MAX128000〜921600 bpsです。
 ちなみに当局のPC(Win10)は128000bpsがMAXで、16bit 1024パケットを受信するのに0.128secかかり、実際にはスタートビットやストップビット、I/Qデータ分 も必要になるので、ちょっと遅延が大きく叉データー受信バッファなどの処理も複雑になります。
 そこでUSB-シリアル変換モジュールを使い、ドライバも新たに組み込むことで、より高速化を狙います。  

機種選定
 要求仕様として、STMと変換モジュール間I/Fは3.3V、通信速度2.0Mbps以上、使用チップFTDI製、という条件で秋月で探すと、FT234X+ADuM121N使用絶縁USB-シリアル 変換モジュールが使えそうです。
 絶縁型でなくてもいいのですが、PC側とアイソレーションが取れるとノイズ対策に有効かもしれません。

テスト回路、ジャンパー設定

 左図はSTMと変換モジュールの接続です。注意点としてSTMのUSART2 TXと変換モジュールのRxD、USART RXとモジュールのTxDを接続します。丁度 RS-232Cのクロスケーブルのイメージです。
 VDD 3.3VはSTM側の3.3Vと接続。他STM基板裏側のジャンパー(SB)接続を変更、購入時の設定はSB13,14 ON SB62,63 OFFに設定してありますが、それぞれ SB13,14 OFF SB62,63 ONに変更します。これらのSBは1005サイズのチップジャンパが使われているので、外す際には、細めのコテサキ2本でチップ電極 をつまむようにして外します。  

  ドライバーのダウンロード、ボーレートの設定
 ドライバーのインストールについては、ICデータシートにリンク先が記載されています。
 ボーレート設定はデーターシートpage12に書いてあり以下の計算式になっています。
Baud Rate = 3000000/(n+x)
nは2〜16384まで、xは0、0.125、0.25、0.375、0.5、0.625、0.75、叉は0.875のいずれかの値で決定されるボーレートにします。 特別な設定で、nが1、0の場合はそれぞれ2Mbpsと3Mbpsのになります。叉計算値の+/-3%以内の誤差で似意のボーレートに設定できるようです。 (例 n=2 x=0なら標準は1.5Mbpsですが1.545Mbpsでも使える)
 SDR#4では出来るだけ高速で使いたいので、2Mbpsで確認したところ結果OKでした、試しに3Mbpsでやってみましたが、正しく通信できませんでした。やはり USB2.0の規格上2MがMAXでした。

   

プロジェクトの作成、コード生成

 プロジェクトの作成手順は -1.「Lチカ」を参考に、プロジェクト名は適当に「UART」とします。
-2.続いて、ピン配置の設定。PA2 USART_TX、PA3 USART_RXに設定、他にデバック用としてPA5 LED、PC13 GPIO inputに設定
-3.続いて、パラメーターの設定、Categories欄をクリックConectivity > USART2にチェック ModeをAsynchronous、
パラメータの設定、ボーレート2000000Bit/sec、他デフォルト。送信にDMA転送を使うので、DMAの設定、受信割り込みを使うので、割り込み設定。
-4.クロック設定は、関係する部分を左図に設定(クリックで拡大) -5.次にメニュー欄のコード生成ボタン(歯車マーク)をクリックで、ひな型コードが表示されます。

 

  作成プログラムの概要
 SDR実機に組み込みを想定して、少し実践的な練習プログラムにTRYしてみます。
内容、16bit Sound DATA I/Q各1024パケットの送信を想定して、代わりに数字データ1024から3072までの2048パケット分のデータをtx_buf[]に格納して UART経由でPCへ送信する。
 PCからの簡単なコマンドを受け、マイコンボードのLEDをON/OFFする

ソースコードの記述1

   /* User code Begin PV*/ 〜 /* User code End PV*/ の間に、左図ソースコード(クリックで拡大)を挿入。
 ad_buf[ ]、sum、ad_event、offsetは今後使う予定の変数で今回は不要です。
 叉tx_buf[ ]の要素数も、今後のプログラム用に大きめに取っています。  

 

ソースコードの記述2

   /* User code Begin2 */ 〜 /* User code End2 */ の間に、左図ソースコード(クリックで拡大)を挿入。
次に、tx_bufのデータ作成、tx_buf[0]=1024としてるのは、2Byteデータにするためです。
 while()の中では、受信コマンドを受けて、LED ON OFFの確認をしています。

 

 

ソースコードの記述3

 PCから'S'を送るとtx_bufのデータを送信します。uint16_t tx_buf[2048]は4096バイト のデータになるので4096バイト分送信します。

 

  動作確認
 ビルドが成功したらプログラム実行状態で、デバイスマネージャーなどでCOMポートが認識されているか確認。当局の場合COM6 として認識されました。
 TeraTermやAcknwrich等のシリアル通信ソフトを立ち上げ動作確認します。今回はAcknWrichを使いましたが、TeraTermに比較して、BinaryとASCIIの切り替えや 1行当たりの表示文字数が設定できるので、動作確認だけならAcknwrichが使いやすいかもしれません。
 シリアルポートの設定を合わせ、ASCII文字で 1 を送るとするとSTMボード内のLEDがON、0 でLED OFFになります。
 S を送るとと、バイナリーデーターが受信されますが、文字化けしている場合はバイナリー表示モードにします。
 受信データをみると、最初の2バイトは00 04になっています、16Bitの下位、上位の順にデータを送ってくるので数値データ―としては、0400(HEX)で1024、最後の データはFF 0B数値データは0BFF(3071DEC)となっているので正常に1024から3071までの2048データ(4096Byte)分送られて、データの化け等もないことが確認出来ます。
   データ通信時間の目安として8bit*4096Byte/2000000bps = 0.0163sec 実際にはStop Bit分が加算されますが、まずは目標としたスピードで通信出来ることが確認出来ました

今後の進め方
 実際のSDRに組み込みの場合は、16bit IQデーターを送ることになりますが、今回は2Mbpsで通信できることが確認できたので、今後は音声をADして2Mbpsで送り、音の途切れ などの確認を進めていきます。

I2Cに戻る

   Top Menu