の続編でぇす.
中華様からI2S DACが届いた.TIのPCM5102というDACが載っているボードだ.いつもの通販価格¥400ぐらいだったかな? 回路図は判ってないんだ.
それをarduino M0に接続して動かそうとしているところ.
Arduino M0の資料はここにある. →回路図 →その他
ボードのピンを説明しておく.記憶で書くので間違ってたらごめんよ.
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 件のコメント:
コメントを投稿