随分と前になってしまいましたが、前記事ではWT32をUARTにつなげたので、次はPCM信号をI2SでSTM32L476につなげます。もともとSTM32ではSPIがI2S機能をサポートしていましたが、近頃の新しめのデバイスではSAI (Serial Audio Interface)という機能が備わっているので、こいつを使うことにします。SAIにはPCM u-Law/A-Lawの圧縮/伸張機能も備わっていたりするので、W-SIMのようなデバイスをつなげるのにも適しているのですが、W-SIM自体が無くなってしまったのが残念なところです。
SAIはBlok AとBlock Bで一組になっており、片方をもう片方に同期して使えばSAI_CLKとSAI_FSを共有することができます。SLIC側とつなぐADC/DACも同じPCM_SYNCで外部トリガをかけて変換動作をすることで、WT32側とSLIC側の処理が同期して進み、音声が流れることになります。SAI, ADC/DACは全てDMAを使って動かします。SAIで受信したデータを直接 DMAでDACに渡すことはできませんし、この記事で述べたようにPCM信号の符号反転処理も必要になるので、間にバッファを置いて処理を行います。
この方針でSTM32CubeMXを使ってSAIの設定をしようとしたのですが..
Output ModeでMonoを選択できません。I2SなのでHFPの音声がステレオのフォーマットで送られてきますが、そのうちの片方のデータだけを受信してDACに送りたいので、SAIではMono modeを選択したいところなんです。SAIの設定としては、Monoを選択するには、Slot数を2にしておかねばならないようなのですが、そのようにしてもOutput ModeではStereoしか選択できません。どうやら、CubeMXのバグのようです。
CubeMXの生成する .ico ファイルを修正すれば何とかなるだろうと考えたのですが、ico ファイルを見てもそれらしいパラメータが出力されていません。コード生成された main.c を開いて SAIの初期化コードを修正して対応するしかなさそうです。
SAIはBlok AとBlock Bで一組になっており、片方をもう片方に同期して使えばSAI_CLKとSAI_FSを共有することができます。SLIC側とつなぐADC/DACも同じPCM_SYNCで外部トリガをかけて変換動作をすることで、WT32側とSLIC側の処理が同期して進み、音声が流れることになります。SAI, ADC/DACは全てDMAを使って動かします。SAIで受信したデータを直接 DMAでDACに渡すことはできませんし、この記事で述べたようにPCM信号の符号反転処理も必要になるので、間にバッファを置いて処理を行います。
この方針でSTM32CubeMXを使ってSAIの設定をしようとしたのですが..
Output ModeでMonoを選択できません。I2SなのでHFPの音声がステレオのフォーマットで送られてきますが、そのうちの片方のデータだけを受信してDACに送りたいので、SAIではMono modeを選択したいところなんです。SAIの設定としては、Monoを選択するには、Slot数を2にしておかねばならないようなのですが、そのようにしてもOutput ModeではStereoしか選択できません。どうやら、CubeMXのバグのようです。
CubeMXの生成する .ico ファイルを修正すれば何とかなるだろうと考えたのですが、ico ファイルを見てもそれらしいパラメータが出力されていません。コード生成された main.c を開いて SAIの初期化コードを修正して対応するしかなさそうです。