以前公開したプログラムのDSD256以上対応版です。
未テストなので問題があればコメントなりで突っ込んでください。
コネクタ6番ピンをArduinoの2番ピン このピンは割り込みに使用しているのでわからない方は変更しないで下さい
コネクタ3番ピンをArduinoの8番ピン、コネクタ4番ピンをArduinoの7番ピンへ接続します。
DSD512はAK4490で利用できないのでコメントアウトしてあります。
#include <Wire.h> #define DACADDR 0x11 // DACのアドレス #define LED_DSD 2 // コネクタ6番ピン #define LED_DSDM 8 // コネクタ3番ピン #define LED_DSDM2 7 // コネクタ4番ピン volatile bool chn; byte reg[] = { 0x4, 0x22, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0 }; // モード切替用の列挙定数 enum dacmode { PCM, DSD64, DSD128, DSD256, DSD512 }; void setup() { pinMode(LED_DSDM, INPUT); // DSDのモード判定用のpinを入力用に設定 pinMode(LED_DSDM2, INPUT); // DSDのモード判定用のpin2を入力用に設定 pinMode(LED_DSD, INPUT); // P/Dモード判定用のpinを入力用に設定 attachInterrupt(0, pdc, CHANGE); // DSD/PCM切り替え用のpinを判定 /* LEDの変化で割り込んでいるとDSD同士のモード切替に反応しない可能性がある その場合はDSDONにつなぎかえる しかしDSDONでもDSD同士の切り替えのときに一度PCMに戻るのでだめかも */ Wire.begin(); Serial.begin(9600); Serial.print("RUN\n"); } void loop() { if (chn) { detachInterrupt(0); chn = false; delay(100); if (digitalRead(LED_DSD)) { /* DSDモード */ if (digitalRead(LED_DSDM2)) { if (digitalRead(LED_DSDM)) { /* DSD512 */ Serial.print("DSD512\n"); setmode(DSD512); } else { /* DSD256 */ Serial.print("DSD256\n"); setmode(DSD256); } } else { if (digitalRead(LED_DSDM)) { /* DSD128 */ Serial.print("DSD128\n"); setmode(DSD128); } else { /* DSD64 */ Serial.print("DSD64\n"); setmode(DSD64); } } } else { /* PCMモード */ Serial.print("PCM\n"); setmode(PCM); } attachInterrupt(0, pdc, CHANGE); } } /* PCM/DSDの切り替えをする関数 割り込み 変更不要です。 設定の本体は少し下のsetmode関数の中身です。 */ void pdc() { chn = true; } /* レジスタ設定用 */ void setmode(enum dacmode mode) { // リセット Wire.beginTransmission(DACADDR); Wire.write(0x00); // move pointer to control1 address Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary) Wire.endTransmission(); // 通信終了 // リセット待ち delay(20); Wire.beginTransmission(DACADDR); Wire.write(0x00); // 書き込み先頭アドレス switch (mode) { case PCM: // PCMモード用のレジスタ reg[0x0] = 0x8F; reg[0x1] = 0x0; reg[0x2] = 0x0; reg[0x3] = 0xEE; reg[0x4] = 0xEE; reg[0x5] = 0x0; reg[0x6] = 0x0; reg[0x7] = 0x0; reg[0x8] = 0x0; reg[0x9] = 0x0; break; case DSD64: // DSD64モード用のレジスタ reg[0x0] = 0x8F; reg[0x1] = 0x0; reg[0x2] = 0x93; reg[0x3] = 0xEE; reg[0x4] = 0xEE; reg[0x5] = 0x0; reg[0x6] = 0x0; reg[0x7] = 0x0; reg[0x8] = 0x0; reg[0x9] = 0x0; break; case DSD128: // DSD128モード用のレジスタ reg[0x0] = 0x8F; reg[0x1] = 0x0; reg[0x2] = 0x93; reg[0x3] = 0xEE; reg[0x4] = 0xEE; reg[0x5] = 0x0; reg[0x6] = 0x1; reg[0x7] = 0x0; reg[0x8] = 0x0; reg[0x9] = 0x0; break; case DSD256: // DSD256モード用のレジスタ reg[0x0] = 0x8F; reg[0x1] = 0x0; reg[0x2] = 0x93; reg[0x3] = 0xEE; reg[0x4] = 0xEE; reg[0x5] = 0x0; reg[0x6] = 0x0; reg[0x7] = 0x0; reg[0x8] = 0x0; reg[0x9] = 0x1; break; case DSD512: // // DSD512モード用のレジスタ // reg[0x0] = 0x8F; // reg[0x1] = 0x0; // reg[0x2] = 0x93; // reg[0x3] = 0xEE; // reg[0x4] = 0xEE; // reg[0x5] = 0x0; // reg[0x6] = 0x1; // reg[0x7] = 0x0; // reg[0x8] = 0x0; // reg[0x9] = 0x0; break; default: break; } Wire.write(reg, 10); // まとめて書き込む Wire.endTransmission(); // 通信終了 }