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