AK449x Arduino用コードDSD256,512対応版

以前公開したプログラムのDSD256以上対応版です。

未テストなので問題があればコメントなりで突っ込んでください。

y1b_n4ul

コネクタ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(); // 通信終了
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください