2019年5月16日木曜日

arduino M0 と PCM5102 I2S DAC (不完全版)

先日書いた、
の続編でぇす.

中華様からI2S DACが届いた.TIのPCM5102というDACが載っているボードだ.いつもの通販価格¥400ぐらいだったかな? 回路図は判ってないんだ.

それをarduino M0に接続して動かそうとしているところ.
Arduino M0の資料はここにある.  →回路図      →その他

DACボードの結線はこんなかんじでとりあえず動かせる.
ボードのピンを説明しておく.記憶で書くので間違ってたらごめんよ.
VCC:5V   PCM5102は3.3V電源だが、ボード上に3.3VREGが載っているのでそれにお任せして、電源は5Vを与えておくという意味である
3.3V:    これは3.3V入力ではなくて、3.3V出力であるようだ
FLT:0     アンチエイリアシングフィルタをFIRタイプにする
DMP:0    de-empasisをOFF
SCL:0    本来の意味は256fsだかをinputする端子だが、ここを0固定にすると内部PLLで256fsだかを生成してくれるmodeになる(便利でいいわ)
BCK:     Arduino M0のD1 pinを接続する  (bit clock) ※
DIN:     Arduino M0のD9 pinを接続する    (DATA) ※
LCK:    Arduino M0のD0 pinを接続する    (LR clock) ※
FMT:0     I2Sで使う
XMT:1     MUTEしない

前回でvariant.hに追加した数行でpin番号と思しき行が3つあった.これの9,1,0はArduinoのD9,D1,D0のことだった.
  #define PIN_I2S_SD          (9u)
  #define PIN_I2S_SCK         (1u)
  #define PIN_I2S_FS          (0u)

------
とりあえず、fs=32kHz/Lch=100Hz/Rch=300Hz を出力する簡単なArduino sourceを下記リンクに置く.
     I2S_SawToothGen_simple.ino
これの中で使っているI2Sライブラリ関数は、I2S.begin()とI2S.write()だけだ.
bufferやDMAを使ってないので、loop()にはfs周期より高速で働いてもらわにゃならん.
ところが、Arduino M0の動作速度はそんなに速くないみたいよ.fs 32kHz以下なら円満に動くのだが、fs 48kHzよりも高いとバケてしまう.ダメだこりゃ.

それと、Arduino M0のUSBコネクタ経由でCOM通信する際には、SerialUSB.xxx()を使うべしという地雷がある.Serial.xxx()やSerial1.xxx()では全然動きやしない. →こちら

というわけで、32kHz以下のfsでなら上記codeで音声出力できたけれど、ちょっとそれじゃぁいまいちだわな.

抜本的解決策は、2本のbufferを交互にDMAでI2Sへ流し込むようにするしかないかしらね? それは検討中ってことで.....

間違ってたら素直に死んでくれ.

かしこ

0 件のコメント:

コメントを投稿