ESP32-S3 AF信号処理ボード(I2Sの設定)

I2S接続のCODECはとりあえず動いているが,設定に関してもう少し把握しておきたいので調べてみた.具体的にはヘッダファイル i2s.h じっくりながめただけ.

気になっていたのは,MCLKに関しては何も設定を書いていないのにGPIO0から出ていること.GPIO0はストラップピンで boot スイッチにつながっているので気持ちが悪い. ESP32-S3のスペックとしてはどのピンにもアサインできるので MCLK は別のポートに変更したい.

参考にしたサイトのコードにはそれらしい部分はなかったが,ヘッダファイルをみると i2s_pin_config_t; のメンバーの中に int mck_io_num; がいた.
そこで下のように自分のソースコードに 1行(ハイライト部分)追加した.

  i2s_pin_config_t pin_config = {
        .mck_io_num = 39,
        .bck_io_num = 42,
        .ws_io_num = 2,
        .data_out_num = 41,
        .data_in_num = 1
    };
  i2s_set_pin( I2S_NUM_0, &pin_config);

これで,MCLK がGPIO39から出てくるようになった.
回路も修正して問題なく動作している.

もう一つ,MCLKの周波数も特に設定していないが256fs が出てきている.これは変更することはないと思うが確認しておかないと気持ちが悪い.

こちらも i2s_config_t のメンバーに mclk_multiple がいるようで,これをセットすればよさそう.

  i2s_config_t i2s_config = {
    .mode =  (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX  | I2S_MODE_RX),
    .sample_rate = fsample,
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,
    .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
    .communication_format = I2S_COMM_FORMAT_STAND_I2S,
    .intr_alloc_flags = ESP_INTR_FLAG_LOWMED,
    .dma_buf_count = 6,
    .dma_buf_len = BLOCK_SAMPLES*4,
    .use_apll = false,
    .tx_desc_auto_clear = true,
    .fixed_mclk = 0,
    .mclk_multiple = I2S_MCLK_MULTIPLE_256,
  };
  i2s_driver_install( I2S_NUM_0, &i2s_config, 0, NULL);

その他の変更はないが,i2s_types.h, esp_intr_alloc.h を参照してそこで定義されているものはラベルに変更した.