ガレスタさんのDIY日記

電子回路、Web、組み込み、自作エフェクターを語るblog

SAIペリフェラルでトークスルーを動かす

前回こういう記事を書きました。
gsmcustomeffects.hatenablog.com

これは酔漢氏が作成された手順に基づき何から何までプラットフォームにお世話になって実現しているものです。
なので今回はちょっと変えてみようという考えに基づきやってみた第二段というわけです。

ほんだい!

とりあえず今回やったこと

この二点になります。
ちなみにトークスルーはAnalogDevicesのsampleの名前で入力音をそのまま出力に出すものです。

まずAK4556についてですが金子システムさんのUMB-AK4556-Aを使用させていただいてます。
dsps.shop-pro.jp

このコーデックはピンの論理でICの動作を設定可能(レジスタレス)という特徴を持っているのでADAU1361とは違いI2Cで細かい設定をしなくていいという特徴があります。
開始時のポップ音の対策が必要ですけど・・・・・・


ちなみにボードの初期設定はコーデックマスターの48kHzサンプリングの512

f:id:gsmcustomeffects:20170527180625p:plain

尚酔漢氏の雲仙オーディオフレームワークではコーデック部分は分離されているのでmbedでもこの構成を試すことができると思います。

Nucleoボードとの接続

f:id:gsmcustomeffects:20170527054439p:plain

僕の場合ユニバーサル基板を使ってUEW配線で組みました。

f:id:gsmcustomeffects:20170527173904j:plain

SAIの設定

次にCubeMXでSAIの設定をやって行きます。

f:id:gsmcustomeffects:20170527174304p:plain

クロックは48MHzになるように設定します

f:id:gsmcustomeffects:20170527174339p:plain

詳細設定はこのような感じです。
SAI AのFIFO闘値を1/4にするのがミソです。

f:id:gsmcustomeffects:20170527174448p:plain

次にNVICタブでSAIの割り込みを有効にします。

f:id:gsmcustomeffects:20170528054108p:plain

次にNVICのコンフィグで優先度を決めます。
この辺は自由ですがHALによっては0が優先度最大の場合と15が最大の場合があるので注意
酔漢氏はこれについてF***ともうされています。
f:id:gsmcustomeffects:20170528054419p:plain

という与太話は置いといて
僕は3ぐらいにしました。
f:id:gsmcustomeffects:20170528054503p:plain

そのあとコードを出力します。

あとはmain.cのどこかでコールバックを呼び出せば割り込みから帰ってくるのでその中に送信処理とRX割り込みの再度リクエストを書きます。

f:id:gsmcustomeffects:20170527174711p:plain

これで取りあえずデータスルーはできているので音はなるはずです。

ちなみにCallBackに関してですがstm32f7xx_hal_sai.c上でWEAK修飾子で定義されているのでMain.cで上書き定義できます。

f:id:gsmcustomeffects:20170528054705p:plain


まとめ

ほんの数行で音が出るのは正直言ってかなり驚いた。
あとコーデックドライバ書かなくていいのめちゃくちゃ楽ですねw
SAIの紛らわしい部分はほとんどCubeMxがやってくれるのでユーザーがやるのは処理ルーチンのみとなる。
あとは信号処理がしやすいようにデータをLRLR→LLL、RRRにしたり(I2Sがこのフォーマットなため)、大きさを-1~1にしたりと雲仙の主要部分の移植をしていきたいです。
プロセス時間計測は気が向いたらやる予定なので現状はI2Sのルーチン内に全部書いちゃう予定

5/28 割り込みに関する記述が甘かったので 追記