こんなボードがありまして...
I2S波形をきちんと見たことがなかったので,見てみました。
とにかく波形を出してみる
GND A3
5V A2 I2S1_SD
I2S1_WS A4 A1 I2S1_CK
A5 A0
I2S1_MCK A6 NR
A7 GND
A8 3V3
A11 C15 OSC_EN OSC32_OUT
A12 C14 TIM1_BK2 OSC32_IN
B6 B7
ioc設定 クロックは64MHzに変更
まずは16ビットで試す。
0 1 2 3 ... と送ってみる。
/* USER CODE BEGIN 2 */
uint16_t data[256];
for (int i=0; i<256; i++) {
data[i]=i;
HAL_I2S_Transmit(&hi2s1, (uint16_t *)&data, 16, HAL_MAX_DELAY);
成功! PulseViewは I2S Philips で読むようだ。
32ビットフレーム24ビットに変更します。
ビットの切れ目がわかりやすいようにデータも変更します。
uint16_t data[256];
for (int i=0; i<256; i++) {
data[i]=0;
}
data[2]=0x1234;
data[3]=0x5678;
data[4]=0x9abc;
data[5]=0xdef0;
成功したようです。
RM0444によれば,24ビット扱う場合,最初のデータでMSB 16ビット送信,次のデータのMSB 8ビットのみを使ってあとは0で埋めるとのことですので,data[3]=0x5678;
の 78 の部分が捨てられました。その時のI2Sのデータは24ビットで 0x12345600
となりました。
どのくらいデータを準備したらいいのか
44.1kHzサンプリング 20Hzのデータを準備するとします。
44100/20=2205個のサンプリングデータが少なくとも必要です。
1サンプルで16ビットのデータが4つ必要なので,
2205x4=8820個の16ビットデータとなります。
8820x2=17640バイト -> 約 17kbyte
STM32G031F8P6 は RAM:8KB ROM:64KB なので ROM領域に置くことになりますね。転送間に合うのだろうか?
見直し
24ビット 44.1kHzサンプリングを指定したのですが,-5.3%という表記が気になっていました。
基準信号ぐらいなので,16ビットで十分だし,使おうと思っていたDACはMCKが不要なのでちょっと見直してみました。
同様に計算すると9.3kbyteです。まだまだ足りませんが,帯域を絞ればなんとかなるか...