ArmマイコンにTRY8 USBを使ってみる。


写真はNECLEO STM32F446RE評価ボードで、プログラム作成にTRYの様子。

2024.07.16

はじめに
 「ARMマイコンにTRY8」では、USB通信にTRYです。
 今まで、SDRトランシーバーのハードウェア制御にはRS232シリアル通信、I/Qオーディオインターフェイスにはステレオアナログ 信号を使ってメインPC部とやり取りしていました。
 SDR#4号機では、ハード制御及びオーディオインターフェイスをUSBでやり取りすることを、妄想しています。今回は「STMマイコンでUSBを使ってみる」 にTRYです。

USBでTRYする内容
 STMマイコン側でAD〜FIRフィルター処理した信号(40ksps 16bit I/Q信号)を、そのままデジタル信号としてPCへ出力し、途切れなく再生できるのか。
 PC側から、SDRハード部のリレー制御などのコマンドをSTMマイコン側に送信して、SDR復調が途切れずにやれるのか。など疑問点も多いのですが まずはTRYしていきます。

STM32F446のUSBとPC側シリアルポート
 STM32F446のUSBは、USB2.0対応で、スピードは2.0Mbps、オーディオストリーミング再生用のオーディオクラス、RS232と類似のコミュニケーションディバイスクラス (以下CDC)など、機能的には十分なスペックです。
 当初、USBオーディオクラスの採用を検討しましたが、ハードルが高すぎて先に進めません、一方USB CDCなら遅延時間を許容すれば、使用例や参考ソースも多いので まずは、USB CDCに慣れるところからスタートです。
 USB CDCは、従来のPCとPICマイコン間シリアル通信で、USB-シリアル変換ケーブルを利用して通信していたのを、STMマイコン内部に、 USB-シリアル変換機能を内蔵したイメージで、PCとSTMマイコン間は直接USBケーブルで接続通信できます。
 ただ残念ながら、PC側のシリアル通信(COMポート)のスピードはMAX 115200bps程度と遅いのでUSBのスピードが活かせません。
 スピードの確認は、デバイスマネージャーでCOMポートのプロパティ―から確認できます。ちなみに当局のPC(Win10)は128000bpsがMAXで、もう一方のPC(Win7)は、 USB-シリアル変換ケーブル(FTDI)を接続した状態で921600bpsまで対応していました。

プロジェクトの作成、コード生成
 USBを組み込む、プロジェクトの作成には以下のHPを参考にさせていただきました。
ZeptoElectronicDesign STM32とPCをUSBで接続してシリアル通信する方法
 記事中にも紹介されていますが、当局の場合もInclude passの追加をしないとビルド成功せず、雑誌に紹介されているような方法ではうまくできませんでした。

  作成プログラムの概要
 SDR実機に組み込みを想定して、少し実践的な練習プログラムにTRYしてみます。
内容、1kHz COS信号とSIN信号を16kHzサンプリングした16bitデジタル波形データをCOSとSINを交互に各1024パケット分PCへ送信する。
 PCからの簡単なコマンドを受け、マイコンボードのLEDをON/OFFする

ソースコードの記述1

 USER CODE BEGIN INCLUDE部分に、#include "usbd_cdc_if.h" と "math.h"をインクルードして
 /* User code Begin PV*/ 〜 /* User code End PV*/ の間に、左図ソースコード(クリックで拡大)を挿入。
 1kHzの信号のcos成分とsin成分をそれぞれreal[]とimag[]、信号の振幅をamp、位相をphaseとします。
 

 

ソースコードの記述2

 次に、波形データの作成です。
 /* User code Begin2 */ 〜 /* User code End2 */ の間に、左図ソースコード(クリックで拡大)を挿入。
 offset 32000は65536/2(FFFF/2)よりやや小さくした値。M_PIは"math.h"で定義されるπです。
 real[0]とimag[0]がtx_buf[0]と[1]に書き込まれ、以下繰り返しでtx_buf[2048]まで書き込みます。
 位相が2PIを超えると、2PIを減算して位相を2PI以内に制限しています。

 

 

ソースコードの記述3

 次に、送受部分の作成
 /* User code Begin While */ 〜 /* User code End While */ の間に、左図ソースコード(クリックで拡大)を挿入。
 PCから'1'を送るとSTMボード内のLED ON、'0'でOFF、'2'を受信するとtx_bufのデータを送信します。uint16_t tx_buf[2048]は4096バイト のデータになるので4096バイト分送信します。

 

  ソースコードの記述4

 次に、usb_cdc_if.cの中にコードを追加します
 /* User code Begin 5 */ 〜 /* User code End 5 */ の間に、左図ソースコード(クリックで拡大)を挿入。
 ラインコーディングの内容を、スピード230400bps データを16bitに設定し直しました。

 

  テスト回路

 左図外付け回路、USBケーブルはジャンクマウスのケーブルを外して、STMボード側に直接接続しました。
 USBケーブルの色分けはたぶん共通と思います、分圧抵抗によりUSBが接続されたことを検出するようにしましたが、無くても動作はする筈です。
 USBケーブルがST Link用と2本必要になります。

  動作確認
 ビルドが成功したらプログラム実行状態で、デバイスマネージャーなどでCOMポートが認識されているか確認。当局の場合ST LinkがCOM3、今回のUSBはCOM4 として認識されました。

 左図は、TeraTermでの受信画面。TeraTermを立ち上げシリアルポートの設定を合わせ、マウスをTeraTermの表示エリアに置いて、コマンド 1 をクリックするとSTMボード 内のLEDがON、0 をクリックでLED OFFになります。
 2 をクリックすると、バイナリーデーターが受信されますが、文字化けしている場合はshift+Escを2回(叉は数回)押してバイナリー表示モードにします。
 受信データをみると、最初の2バイトは00 FAになっています、16Bitの下位、上位の順にデータを送ってくるので数値データ―としては、FA00(64000)=、32000 * cos(0) + 32000、次のデータは00 7D数値データは7D00(32000) = 32000 * sin(0) + 32000となっているので正常にcosとsinが交互に送られています。
   データ通信時間の目安として8bit*4096Byte/230400bps = 0.14sec 実際にはStop Bit分が加算される。実機としてまとめる場合はもう少し早くしたいので、今後の 課題になります。

今後の進め方
 Lチカからスタートした「STMマイコンにTRY」は一通りの各要素プログラムの練習が終わり、いよいよSDRとしてのプログラム作成していきます。
 SDRStudy側に、このデータ受信プログラムを組み込めば、音として確認出来るはずですが、音の途切れや、ノイズ混入などの確認はもう少し先になりそうです。

I2Cに戻る

   Top Menu