ArmマイコンにTRY6 I2Cを使ってみる。


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

2024.01.25

はじめに
 「ARMマイコンにTRY6」では、I2CにTRYです。
 SDRトランシーバーでは、今まで、PICマイコンでPLLやデジタルポテンションメーターなどのICをI2C制御で使ってきましたが、今回はSTM32F446マイコンを マスターモードとして制御してみます。

STM32F446のI2C
 STM32F446のI2Cは、7bit叉は10bitアドレスモード、100k/400k/1Mのクロック対応で、PLL IC(Si5351)やデジタルポテンション(MCP4018)の制御 には十分なスペックです。
 

プロジェクトの作成、コード生成
 まずは、制御データが1ヶのみの簡単なMCP4018でTRYしてみます。
-1.「Lチカ」でのプロジェクト作成手順に同じですが、プロジェクト名は適当に「renshyuI2C」とします。
-2.続いて、ピン配置の設定。PB8をI2C1 SCL、PB9をI2C1 SDAに設定、デフォルト状態では、それ以外のピンも設定されていますが、reset_stateにします。
-3.続いて、パラメーターの設定、Categories欄をクリックConectivity > I2C1にチェック ModeをI2C、他はデフォルトでOK。
ちなみにデフォルト状態では、speedがstandard(100k)ですが、Fast modeにすれば400kを選択できます。
-6.次にメニュー欄のコード生成ボタン(歯車マーク)をクリックで、ひな型コードが表示されます。

  ソースコードの記述1

 /* User code Begin2 */ 〜 /* User code End2 */ の間に、左図ソースコード(クリックで拡大)を挿入。
 MCP4018のアドレスは0x2Fですが、LSBにWriteモードを示す0を挿入するので、1bit分左シフトします。アドレスはシフトした結果の0x5Eと記述してもOKです。
92行目で書き込むデータを配列で準備、ここではMCP4018にセットする値のデータを書き込むので配列要素数1ヶ分になり 配列名は適当にi2c_buf、要素数は[1]とします。
93行目に書き込むデータを配列[0]に設定します、ここでは適当に0x5Fとしています。
 95行目にHAL関数、第3引数で配列名を記述してi2c_buf{0}のデーターを、第4引数で送出するデーター数(この場合1)、第5引数でタイムアウト(msec)を記述します。
 次に、ビルド(トンカチマークアイコン)をクリックしてエラーがなければ、PCとボードをUSB接続してRunをクリックすればプログラムが書き込まれ、データに応じた出力 電圧がでます。
 

 

ソースコードの記述2

 次に、Si5351にTRYします、MC4018に比較し書き込みレジスタやデーターが複数あるので書き込みフローは、少し複雑になります。
 /* User code Begin2 */ 〜 /* User code End2 */ の間に、左図ソースコード(クリックで拡大)を挿入。
 Si5351の周波数、パラメーター設定のやり方はこちらを参考にして、パラメーターは事前に計算された値を使用します。
 ここでは、CLK0を7.96MHz、パラメーターはPLL部 P1=2748(0x0ABC) P2=27136(0x6A00) P3=65536(0xFFFF)
シンセ部 P1=9728(0x2600) P2=0(0x00) P3=1(0x01)で入力します。
 Si5351のアドレスは0x60ですが、LSBにWriteモードを示す0を挿入するので、1bit分左シフトします。アドレスはシフトした結果の0xC0と記述してもOKです。
92〜95行目で書き込むデータを配列で準備、配列要素[0]にレジスタアドレス、続いてデータを記述し、配列名は適当にreg_xxxとし、要素数はアドレスの1ヶと書き込む データー数を加えた数とします。
 連続した複数レジスタへの書き込みは、配列要素[0]に先頭アドレスを書けば、自動的にアドレスがインクリメントされていきます。
 97〜100行目でHAL関数を使って初期設定と周波数パラメーター設定、第3引数で配列名を記述して、第4引数で送出するデーター数(この場合1)、第5引数でタイムアウト (msec)を記述します。
 その後、パワーON等の処理の為、配列データーを変更して、再度HAL関数でデータを書き込みます。
 ビルド(トンカチマークアイコン)をクリックしてエラーがなければ、PCとボードをUSB接続してRunをクリックすればプログラムが書き込まれ、7.95980MHzが出力されます。
HAL関数は、他にHAL_Mem_Write()という関数もあったり、もっとうまいやり方もありそうですが、今後の課題とします。
 

 

テスト回路

 左図外付け回路(クリックで拡大)を追加しボード上コネクタCN5-9、10に接続、プルアップ抵抗は4.7k、3.3Vは外部から供給しました。
 Si5351は秋月電子のモジュールを使用しました

 

今後の進め方
 Lチカからスタートした「STMマイコンにTRY」ですが、ここまではほとんどコードを書かずHAL関数のみできました。次回からは、SDRとしてまとめるにもう少し実践的な ソフトにTRYです。

ADに戻る

   Top Menu