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