LoginSignup
1
1

STM32G031ボード I2S波形を出してみる

Posted at

こんなボードがありまして...

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ビットで試す。

image.png

0 1 2 3 ... と送ってみる。

main.c
  /* 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 で読むようだ。

image.png

32ビットフレーム24ビットに変更します。

image.png

ビットの切れ目がわかりやすいようにデータも変更します。

main.c
  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;

成功したようです。

image.png

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が不要なのでちょっと見直してみました。

image.png

同様に計算すると9.3kbyteです。まだまだ足りませんが,帯域を絞ればなんとかなるか...

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1