SeeeduinoXIAO で I2S 出力する


概要

SeeeduinoXIAOは公式ではI2S出力ができないことになっているが、SoCのデータシートを良くみるとI2S出力が可能である。

PinNoを緑、I2S部分を黄色で纏めると以下の通り。

コード修正

初期状態ではI2Sが無効化されているので、下記のように修正する必要がある。

C:/Users/(YourName)/Documents/ArduinoData/packages/Seeeduino/hardware/samd/1.7.9/variants/XIAO_m0/variant.h

variant.h
// I2S Interfaces
// --------------
#define I2S_INTERFACES_COUNT 2

#define I2S_DEVICE           0
#define I2S_CLOCK_GENERATOR  3
#define PIN_I2S_SD           (8u) // PA07:I2S/SD[0]
#define PIN_I2S_SCK          (2u) // PA10:I2S/SCK[0]
#define PIN_I2S_FS           (3u) // PA11:I2S/FS[0]

サンプルコードの実行

I2Sの出力サンプルが提供されているので、実行。

C:/Users/(YourName)/Documents/ArduinoData/packages/Seeeduino/hardware/samd/1.7.9/libraries/I2S/examples/SimpleTone

実行結果

PCM5102a で音出た。

その他

  • I2S-MCLKもコード弄れば出せる。
  • PLLが載っていないので、各周波数は 48MHz の整数分周でしか出せない。 周波数毎に誤差をまとめると、以下の通り。 44.1kHzと48kHzの16bitならば十分使える領域。
SamplingFreq BitDepth 分周率 実周波数 エラーレート
44100 16 34 44118 0.000400
44100 32 17 44118 0.000400
88200 16 17 88235 0.000400
88200 32 9 83333 -0.055178
48000 16 31 48387 0.008065
48000 32 16 46875 -0.023438
96000 16 16 93750 -0.023438
96000 32 8 93750 -0.023438