1.I2C通信
STマイクロエレクトロニクス社のSTM32F446マイクロコントローラに搭載されているシリアル・オーディオ・インタフェース(SAI)を利用した多チャンネル音声再生用オーディオ基板の制作で、アンプへの出力調整用にマイコンから制御が出来るMCP4451デジタルポテンショメータを使用しました。
マイコンからはI2C通信でコントロールするのですが、その時に発生したI2Cのトラブルについて紹介します。
2.トラブル発生
マイコンのソフト作成には、STマイクロエレクトロニクス社が提供している開発環境のSTM32CubeIDEを使用しました。マイコンがI2Cマスターでポテンショメータ側はスレーブとするので、STM32CubeIDEのコンフィグ設定でI2Cはマスターを選択、通信速度などの他の設定をしてコンフィグレータを終了。STM32CubeIDEのコード生成でI2C通信関連のAPI関数などは作成してくれるので、生成されたAPI関数をそのまま使います。
送信API関数の内部まで調べてみると、ステータスがビジーとなっていて関数から返っていることが分かり、さらに詳しくレジスタ辺りを見てみると、通信が始まっていないのにステータスレジスタ2(I2C_SR2)のBUSYフラグがONでした。
マイコンはI2Cマスターのはずなのに、I2Cバス内で通信中状態になっていたのです。
3.レジスタの設定順序
STマイクロエレクトロニクス社のサイトを検索してみると、I2C端子の設定方法についての記事を見つけました。
その記事の内容は、I2C関連の各レジスタの設定には順序がありそれを守らないと通信が始まっていないのにビジーになる、というもの。
STM32CubeIDEが生成したI2C初期化関数の内容も、記事の順序でレジスタの設定しているようでしたが、念のためレジスタ設定関数を作り実行。
これで上手く動作すると思ったのですが、結果は同じで各レジスタの設定後にI2Cのクロックを有効にした直後にステータスレジスタのBUSYフラグがONになってしまいます。同じオーディオ基板上にあるDACモジュールともI2Cでつなげており、同じI2C通信用のAPI関数を使って通信していますが、こちらは正常に動作しているので、ポテンショメータとの間で何か不都合が起こっているようです。
4.I2C通信関数の自作
I2C端子の信号の状態などを調べて調整しようと思ったのですが、まずソフトで対応したみることにし、マイコンのI2C機能を使う事を諦めて、I2C端子を通常のGPIOとして使ってI2Cの通信部分を自作することにしました。マイコンのGPIOを操作するAPI関数を使ってシリアルクロック(SCL)とシリアルデータ(SDA)の端子からON/OFFを出力します。
ソフトでスタートコンディションやストップコンディションの状態を作り出してデータを送受信します。スレーブからのACKやNACKの確認やデータの受信の時は、SDAの端子を入力側に切替えて受信します。SCLとSDAのON/OFFの出力切替えのタイミングは、サイクルカウンター(DWT)を利用しました。
ポテンショメータとの通信が正常に行え、情報の取得と設定がうまく出来ましたのでこのまま自作関数を使うことにしました。
5.あとがき
もっと良い方法があるかとは思いますが、今回はソフト面での対策となりました。STM32CubeIDEなどのツールが生成する関数などは、作成時間の短縮にもなり便利なのですが、頼り切ってしまうとその関数でトラブルがあった時は困ることになります。扱うデバイスの仕様や通信プロトコルなどを理解して、自分で実装出来ることも重要だなと思いました。
本文中にあったSTM32のシリアル・オーディオ・インタフェース(SAI)の機能を使った多チャンネル音声の再生機能についての話は、また後日機会があれば紹介する予定です。
フォームが表示されるまでしばらくお待ち下さい。
恐れ入りますが、しばらくお待ちいただいてもフォームが表示されない場合は、こちらまでお問い合わせください。