初回は気づくのが遅くて間に合いませんでしたが、再頒布の申し込みに間に合いました。
長い間暖めていたものの製作となります。
今回は、アドオン基盤も同時に申し込みました。
水晶発振子は標準で行くことにしました。
アイソレータは写真の時点では、装着していませんが、ISO7640FMで行くことにしました。
コンデンサは、手持ちのOSコン16V100uFがありましたのでこれを使っています。
ケースはこちらを選択してみました。
組み込みに関して、今回もHDMI-I2S送信基板を使用します。
組み合せには、ISO7640FMにてアイソレート仕様とします。
また、今回は、DDCを組み込んで一体機とすることにしました。
電源部に関しては、秋月のTPS7A4700基盤を使用し3.3Vを2系統作ります。
トランスに関しては、今回は共立のトロイダルトランスにて対応します。
表示、操作部は、ケースに合わせて液晶で16桁×2桁タイプを選択しました。
ロータリーエンコーダ、IRレシーバを組み込みます。共に秋月にて入手。
AK4490DACと合わせて現在視聴中です。
AK4490DACは、自作プログラム仕様なのでバージョンを上げる形での調整になります。
下手なプログラムなので合わせて調整中です。
-
購入金額
8,960円
-
購入日
2015年12月15日
-
購入場所
やなさん
退会したユーザーさん
2016/03/16
質問したいことがあります。良かったら教えてください。
写真をみると
特にPIC基板、マイコン関連等が見あたらないのですが
自作プログラムとは?XMOSの中身をいじっているのでしょうか?
最初はその方向で自分は検討したのですが...
英語力不足で挫折しました(笑)
今はArduinoをやってみようかと検討中です。
lukaworldさん
2016/03/17
このP2D基板自体にマイコンは搭載されていますよ。
XMOS自体は、単体モデルで中身は変更していません。
AK4490用のファームウェアが存在しているとは思うのですが、DIYINHKさんが公開してくれていないのでなんともなりませんねぇ。
XMOSUSB基板との信号はPCM・DSD識別信号ですが、このP2D基板の識別入力にてそのまま識別可能です。
ここで気づいたのですが、もしやAK4490についてでしょうか?
であれば、AK4490はくろ豆工房さんのところで頒布されているLCD一体型のArduino搭載キットがあり、それをLCDの状態表示とAK4490をソフトウェアモードにて制御しています。
ただ、私も自作プログラムは初めてで、状態表示とPCM・DSD自動切り替えの機能をもたせた程度の単純でなんとか動作できている程度のプログラムしか出来ていません。データシートを睨みつけながら1ヶ月試行錯誤でなんとかなりました。(^^;)
lukaworldさん
2016/03/17
/*
* Controler for AK4490EQ
* 2015/08/31
* V1.6
*/
// LIBRARIES
#include <LiquidCrystal.h> // For LCD
#include <Wire.h> // For I2C
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(2, 3, 15, 14, 17, 16);
// CONSTANT DEFINITION
// (The digital volume for Velvet is 0 to -127 db in .5 db steps)
#define DEFAULTATTNU 0xFF //-50 dB this is 50x2=100 or 0x64
#define MAXATTNU 0x01 //-99dB this is 99X2=198 or 0xC6
#define MINATTNU 0xFF //- 0 dB
// analog input Pin number
//#define PNDPin 10 //Velvet PND Pin Output
#define DSDModePin 11 //PCM・DSD mode signal
int swVal = 0;
#define VOLUPPIN 5 // Button to increase volume or RotEnc A terminal
#define VOLDOWNPIN 7 // Button to decrease volume or RotEnc B terminal
#define SELECTPIN 8 // Switch to select function
#define INTERVAL_BOUNCE 2 // Time in milliseconds to debounce the rotary encoder
#define INTERVAL_SWITCHBOUNCE 250 // Time in milliseconds to debounce switch
#define INTERVAL_SELECT 5 // Time to exit select mode when no activity
#define VOL 0 // The order of selection when clicking the select switch
#define FIL 1
#define SC 2
// VARIABLE DECLARATION
byte regVal; // Variable to pass register value
byte regAddr; // Variable to pass register value
byte currAttnu=DEFAULTATTNU; // Variable to hold the current attenuation value
unsigned long displayMillis = 0; // Stores last recorded time for display interval
unsigned long debounceMillis = 0; // Stores last recorded time for switch debounce interval
unsigned long selectMillis = 0; // Stores last recorded time for being in select mode
byte select; // To record current select option
boolean SHARP; // FIR filter mode
boolean ON; // SOUND CONTROLL
boolean selectMode;
// Rotary encoder interrupt service routine
static boolean rotating=false;
void rotEncoder()
{
rotating=true; // If motion is detected in the rotary encoder, set the flag to true
}
void writeVelvetReg(byte regAddr, byte regVal)
{
Wire.beginTransmission(0x11); //Hard coded to the the Velvet device address
Wire.write(regAddr); // Specifying the address of volume register
Wire.write(regVal); // Writing the volume value into the register
Wire.endTransmission();
}
void setVelvetVolume(byte regVal)
{
writeVelvetReg(0x03, regVal); // set up volume in DAC-L ATT
writeVelvetReg(0x04, regVal); // set up volume in DAC-R ATT
}
void printVol(byte regVal)
{
lcd.setCursor(11,0);
if (regVal<10) // transition between two digit and one digit display
{
lcd.print("0"); // Add a leading zero
lcd.print(regVal, DEC);
}
else
{
lcd.print(regVal, DEC);
}
}
void printSelectBar(){ // PRINTING SELECTION INDICATOR
lcd.setCursor(5,1);
lcd.print("");
lcd.setCursor(15,1);
lcd.print("");
}
void clearSelectBar(){ // CLEARING SELECTION INDICATOR
lcd.setCursor(5,1);
lcd.print("");
lcd.setCursor(15,1);
lcd.print("");
}
/*************************MAIN PROGRAM*************************************************************/
void setup() {
// Set up the LCD's number of columns and rows:
lcd.begin(16,2);
// Join the I2C bus as a master
Wire.begin();
//Velvet PND Pin setup (Reset)
// pinMode(PNDPin,OUTPUT);
// digitalWrite(PNDPin,LOW);
// Attach Interrupts
attachInterrupt(0, rotEncoder, CHANGE); // ISR for rotary encoder
// Set up the pin modes
pinMode(VOLUPPIN, INPUT); // Button for Encoder pin for volume up
digitalWrite(VOLUPPIN, HIGH); // If H/W debouncing is implemented, set to LOW
pinMode(VOLDOWNPIN, INPUT); // Button for Encoder pin for volume down
digitalWrite(VOLDOWNPIN, HIGH); // If H/W debouncing is implemented, set to LOW
pinMode(SELECTPIN, INPUT); // Button for encoder switch
digitalWrite(SELECTPIN, HIGH); // Enable pull-up resistor
pinMode(DSDModePin,INPUT); //DSD mode Pin setup
//AK4490EQ reset
Wire.beginTransmission(0x11);
Wire.write(0x00); // move pointer to control1 address
Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
Wire.endTransmission();
//32bitI2S mode
// Wire.beginTransmission(0x11);
// Wire.write(0x00); // move pointer to control1 address
// Wire.write(0x8F); // sends 0x8F (hex) 10001111 (binary)
// Wire.endTransmission();
// Print the welcome message and other labels to the LCD
lcd.clear();
lcd.setCursor(2,0);
lcd.print("AK4490EQ DAC");
lcd.setCursor(5,1);
lcd.print("Ver 1.5");
delay(1000);
lcd.clear();
delay(500);
lcd.home();
lcd.setCursor(10,0);
lcd.print("-");
lcd.setCursor(12,0);
lcd.print("- dB");
lcd.setCursor(1,1);
lcd.print("FIL:SHARP");
lcd.setCursor(11,1);
lcd.print("SC:1");
SHARP=true; // This is the default value of roll-off filter (sharp)
ON=true; // This is the default value for SOUND CONTROLL (ON)
setVelvetVolume(DEFAULTATTNU); // Set volume at startup otherwise
// default is full volume
printVol(DEFAULTATTNU/2-127);
}
void loop() {
//AUTO INPUT MODE SELLECT
swVal = digitalRead(DSDModePin);
if (swVal == HIGH) {
Wire.beginTransmission(0x11); // Set to DSD Mode / L out to R in/R out to L in
Wire.write(0x02); // move pointer to control3 address
Wire.write(0x82); // sends 0x80 (hex) 10000010 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to RESET
Wire.write(0x00); // move pointer to control1 address
Wire.write(0x01); // sends 0x01 (hex) 00000001 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to DSD Data Mute/DSD Mute Control/DSD Mute Release
Wire.write(0x06); // move pointer to control5 address
Wire.write(0x99); // sends 0x99 (hex) 10011001 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to DSD Sampling Speed Control
Wire.write(0x09); // move pointer to control8 address
Wire.write(0x01); // sends 0x01 (hex) 00000001 (binary)
Wire.endTransmission();
lcd.setCursor(0,0);
lcd.print("DSD");
lcd.setCursor(4,0);
lcd.print("");
}
if (swVal == LOW) {
Wire.beginTransmission(0x11); // Set to PCM Mode
Wire.write(0x02); // move pointer to control3 address
Wire.write(0x00); // sends 0x80 (hex) 00000000 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to Master Clock Frequency Auto / 24bit I2S Mode
Wire.write(0x00); // move pointer to control1 address
Wire.write(0x8F); // sends 0x8F (hex) 10001111 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to De-emphasis Response 44.1 / Sharp roll-off filter
Wire.write(0x01); // move pointer to control2 address
Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to De-emphasis Response 44.1 / Sharp roll-off filter
Wire.write(0x02); // move pointer to control3 address
Wire.write(0x00); // sends 0x01 (hex) 00000000 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to L out to L in/R out to R in
Wire.write(0x02); // move pointer to control3 address
Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
Wire.endTransmission();
lcd.setCursor(0,0);
lcd.print("PCM");
lcd.setCursor(4,0);
lcd.print("I2S32");
}
if((digitalRead(SELECTPIN)==LOW)&&((millis()-debounceMillis)>INTERVAL_SWITCHBOUNCE)) {
selectMode=true; // Now we are in select mode
printSelectBar(); // Indicate we are in select mode
debounceMillis=millis(); // Start debounce timer
selectMillis=millis(); // Start being in select mode timer
select++; // Move to next select option
switch(select%3){
case VOL:
printSelectBar();
break;
case FIL:
printSelectBar();
lcd.setCursor(5,1);
lcd.print("");
break;
case SC:
printSelectBar();
lcd.setCursor(15,1);
lcd.print("");
break;
} // End of switch
}
if(rotating)
{
delay(INTERVAL_BOUNCE); // debounce by waiting INTERVAL_BOUNCE time
switch(select%3){
case VOL:
if (digitalRead(5) == digitalRead(7)) // CCW
{
if (currAttnu<MAXATTNU) // Check if not already at maximum attenuation (minimum Volume)
{
currAttnu+=2; // Increase 1 dB attenuation (decrease volume 1 db)
setVelvetVolume(currAttnu); // Write value into registers
printVol(currAttnu/2); // Divide by 2 to print in whole dBs
}
}
else // If not CCW, then it is CW
{
if (currAttnu>MINATTNU) // Check if not already at minimum attenuation (max volume)
{
currAttnu-=2; // Decrease attenuation 1 dB (increase volume 1 db)
setVelvetVolume(currAttnu); // Write value into registers
printVol(currAttnu/2); // Divide by 2 to print in whole dBs
}
}
break;
case FIL: // Toggle between Sharp and Slow filter
if (SHARP){ // If currently in sharp, toggle to slow roll off filter
Wire.beginTransmission(0x11); // Set to Slow roll-off filter
Wire.write(0x01); // move pointer to control2 address
Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to Slow roll-off filter
Wire.write(0x02); // move pointer to control3 address
Wire.write(0x01); // sends 0x01 (hex) 00000001 (binary)
Wire.endTransmission();
lcd.setCursor(5,1);
lcd.print("SLOW ");
SHARP=false; // Now in slow roll off filter
}
else { // Toggle to sharp roll off filter
Wire.beginTransmission(0x11); // Set to Sharp roll-off filter
Wire.write(0x01); // move pointer to control2 address
Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to Sharp roll-off filter
Wire.write(0x02); // move pointer to control3 address
Wire.write(0x00); // sends 0x01 (hex) 00000000 (binary)
Wire.endTransmission();
lcd.setCursor(5,1);
lcd.print("SHARP");
SHARP=true; // Now in sharp roll off filter
}
selectMillis=millis(); // Update being-in-select-mode timer
break;
case SC:
if (ON){ // If SOUND CONTROLL is on, turn off
Wire.beginTransmission(0x11);
Wire.write(0x08); // move pointer to control8 address
Wire.write(0x01); // sends 0x03 (hex) 00000001 (binary)
Wire.endTransmission();
lcd.setCursor(14,1);
lcd.print("2");
ON=false; // Now SOUND CONTROLL is off
}
else {
Wire.beginTransmission(0x11);
Wire.write(0x08); // move pointer to control8 address
Wire.write(0x00); // sends 0x01 (hex) 00000000 (binary)
Wire.endTransmission();
lcd.setCursor(14,1);
lcd.print("1");
ON=true; // Now SOUND CONTROLL is on
}
selectMillis=millis(); // Update being-in-select-mode timer
break;
} // End of switch
rotating=false; // Reset the flag
} // End of while(rotating)
// When the being-in-select mode timer expres, we revert to volume mode
if(selectMode&&millis()-selectMillis > INTERVAL_SELECT*1000){
selectMode=false;
clearSelectBar();
select=VOL; // Back to volume mode
}
} // End of loop()
lukaworldさん
2016/03/17
また、モード選択もプログラムが上手くできていなくて上手く動作しません。
参考程度にしていただければと思います。(^^;)
退会したユーザーさん
2016/03/17
今日arduinoを発注したところです。
現状、ラズベリーパイのgoio機能を有効にして
I2C通信でAK4490にシェルレベルからコマンドを送って設定制御しています。
たとえばボリューム変更は
#音量調整
i2cset -y 1 0x11 0x01 0x01 #mute-ON
i2cset -y 1 0x11 0x3 0xdd
i2cset -y 1 0x11 0x4 0xdd
i2cset -y 1 0x11 0x01 0x00 #mute-OFF:
こんなスクリプトを色々書いてボタンのGUIを作って繋げて使っていて
さすがに簡単だけど不便なんで
これからlukaworldさんの書いた様な部分を勉強しようと思っています(^_^;)
退会したユーザーさん
2016/03/20
5Pin,7Pin,8Pinはロータリーエンコーダーに接続するんですか?
arduinoが入手できたので教えていただいたプログラムで
実験してみたいのでハードとの接続を少し教えていただけないでしょうか?
当たり前?ですがこのプログラムのPCM,DSDの設定条件だけ切り出して
単体で実行した時は何の問題もなく再生出来ますね。
退会したユーザーさん
2016/03/20
lukaworldさん
2016/03/20
モード切替ですが、XMOSの場合、データシートをご覧いただくとわかると思うのですが、LとRの入力配列が反対のため、モード切替にて反転させるレジストを送信しています。
5Pinと7Pinをプルアップをした形で抵抗を通してAとBを接続、CはGNDと接続しています。
ただ、私はここの物理接続はできているはずなのですが、うまく動作には至っていません。8Pinはボタンを接続しています。
秋月でLED内蔵プッシュボタン付きのロータリーエンコーダがあります。
私はこちらを使用しています。
また、肝心なことなのですが、arduinoは5V動作です。
そしてI2C通信も5V動作なので、3.3V動作にするためのコンバーターを使う必要があります。秋月でキットを入手できるのでこれがお手軽に使えるでしょう。
私もプログラムは、初心者レベルなので難しいところです。
故にこのプログラムも無駄が多く、未完成なのです(泣)
lukaworldさん
2016/03/20
LiquidCrystal lcd(2, 3, 15, 14, 17, 16);
を書き換えればいいです。
LCD一体型のArduino搭載キットを使っているため、そちらにピン番号を合わせてあります。
退会したユーザーさん
2016/03/20
今のところ壊れていませんが...(^_^;)
退会したユーザーさん
2016/03/23
Wire.write(0x82); // sends 0x80 (hex) 10000010 (binary)
この部分とミュートの処理が??です。
全体の流れを掴んでいないのでミュート解除の部分は00にして
#include <Wire.h> //I2C通信ライブラリー取り込み
void setup()
{
Wire.begin();
//AK4490EQ reset
Wire.beginTransmission(0x11);
Wire.write(0x00); // Control1 address
Wire.write(0x00); // sends 0x00 (hex)
Wire.endTransmission();
}
void loop()
{
Wire.beginTransmission(0x11); // Set to DSD Mode
Wire.write(0x00); // Control0 address
Wire.write(0x8F); // sends 0x8F (hex) 10001111 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Enable Auto Setting Mode
Wire.write(0x01); // Control1 address
Wire.write(0x00); // sends 0x00 (hex)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to
Wire.write(0x02); // Control2 address
Wire.write(0x93); // sends 0x93 (hex) 10010011 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to
Wire.write(0x03); // Control3 address
Wire.write(0xDD); //
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to
Wire.write(0x04); // Control3 address
Wire.write(0xDD); //
Wire.endTransmission();
//
Wire.beginTransmission(0x11); // Set to DSD Data Mute/DSD Mute Control/DSD Mute Release
Wire.write(0x06); // move pointer to control5 address
Wire.write(0x00); // sends 0x99 (hex) 10011001 (binary)
Wire.endTransmission();
//Wire.beginTransmission(0x11); // Set to DSD Sampling Speed Control
//Wire.write(0x09); // move pointer to control8 address
//Wire.write(0x01); // sends 0x01 (hex) 00000001 (binary)
//Wire.endTransmission();
}
こうしたら上手くいきました。まだ先は長いです(^_^;)
lukaworldさん
2016/03/23
レベルコンバータはなくても動作可能なのですね。DACの動作自体は3.3Vなので、推奨ではなさそうですが・・・。
PCMモードとDSDモードの切替はデーターシートにあるように一度リセットしてあげないとうまくいかないようです。また私の場合は、DSDからPCMへは再度PCMモードのデータを再送しています。
退会したユーザーさん
2016/03/24
すんなり出来ました?!今のところ問題なく動いています。
次はミュートとボリュームコントロールです。
やなさんの基板だとマイコンのあるピンにかかる電圧をセンスして音量を変えて
いると思いますがlukaworldさんのプログラムはI2Cコントロールの電子ボリュームの
やり方と同じ感じに見えます。この部分はまったく未知な領域です。
参考になるサイトとか資料がありましたら教えていただければありがたいです。
#include <Wire.h> //I2C通信ライブラリー取り込み
// PCM-DSD set pin numbers:
const int SWPin = 2; // the number of the SW pin
const int ledPin = 13; // the number of the LED pin
// variables will change:
int SWState = 0; // variable for reading the SW status
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushSW pin as an input:
pinMode(SWPin, INPUT);
//
Wire.begin();
//AK4490EQ reset
Wire.beginTransmission(0x11);
Wire.write(0x00); // move pointer to control1 address
Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
Wire.endTransmission();
}
void loop() {
// read the state of the pushSW value:
SWState = digitalRead(SWPin);
// check if the pushSW is pressed.
// if it is, the SWState is HIGH:
if (SWState == HIGH) {
// turn LED on:
digitalWrite(ledPin, HIGH);
//
Wire.beginTransmission(0x11); // Set to DSD Mode
Wire.write(0x00); // Control0 address
Wire.write(0x8F); // sends 0x8F (hex) 10001111 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Enable Auto Setting Mode
Wire.write(0x01); // Control1 address
Wire.write(0x00); // sends 0x00 (hex)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to
Wire.write(0x02); // Control2 address
Wire.write(0x93); // sends 0x93 (hex) 10010011 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to
Wire.write(0x03); // Control3 address
Wire.write(0xDD); //
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to
Wire.write(0x04); // Control3 address
Wire.write(0xDD); //
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to DSD Data Mute/DSD Mute Control/DSD Mute Release
Wire.write(0x06); // move pointer to control5 address
Wire.write(0x00); // sends 0x99 (hex) 10011001 (binary)
Wire.endTransmission();
}
if (SWState == LOW) {
// turn LED on:
digitalWrite(ledPin, LOW);
//
Wire.beginTransmission(0x11); // Set to PCM Mode
Wire.write(0x02); // move pointer to control3 address
Wire.write(0x00); // sends 0x80 (hex) 00000000 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to Master Clock Frequency Auto / 24bit I2S Mode
Wire.write(0x00); // move pointer to control1 address
Wire.write(0x8F); // sends 0x8F (hex) 10001111 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to De-emphasis Response 44.1 / Sharp roll-off filter
Wire.write(0x01); // move pointer to control2 address
Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to De-emphasis Response 44.1 / Sharp roll-off filter
Wire.write(0x02); // move pointer to control3 address
Wire.write(0x00); // sends 0x01 (hex) 00000000 (binary)
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to
Wire.write(0x03); // Control3 address
Wire.write(0xEE); //
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to
Wire.write(0x04); // Control3 address
Wire.write(0xEE); //
Wire.endTransmission();
Wire.beginTransmission(0x11); // Set to L out to L in/R out to R in
Wire.write(0x02); // move pointer to control3 address
Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
Wire.endTransmission();
}
}
退会したユーザーさん
2016/03/24
>うまくいかないようです。また私の場合は、DSDからPCMへは再度PCMモードのデータを再送しています。
実はこの部分が良く分かっていないのですが(^_^;)00H(control1)に8F(RSTNに1を立てた時点で)
内部タイミングがリセットされるので
Wire.beginTransmission(0x11);
Wire.write(0x00); // move pointer to control1 address
Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
Wire.endTransmission();
このリセット作業は最初のvoid setup() で一回やればOKと解釈しているんですが
それって間違っていますか?(^_^;)
lukaworldさん
2016/03/24
さんのスケッチのパクリです。
環境的にフルボリュームで問題ないので、未動作の未完成部分のままです。
リセットに関しては、内部リセットもあると私も思いますが、I2S項目のPCM/DSDモードの箇所(データシートPDF56ページ下部)に記載がありましたので、そのとおりにプログラムしました。なくても動作されるならいらないのかもしれませんね。
退会したユーザーさん
2016/03/25
昨日、ArduinoからAK4490の内部レジスタを読み取って表示するプログラムを作りましたがなんと面倒な事か...書き込みと確認はLinuxの端末から行って最終段階でArduino(マイコン)でするようにした方が良いと強く思いました。汎用のI2Cの書き込み読み込み機器がれば良いんですが(笑)
lukaworldさん
2016/03/27
機種は違いますが、このスケッチから流用しています。
https://hifiduino.wordpress.com/2014/12/07/akm-verita-4490-dac/
またこの記事も参考になると思います。
I2Cの内部レジスタの読み取りは私も考えましたが、
参考になるサイトもなくわからないことだらけですね。
退会したユーザーさん
2016/03/27
lukaworldさん
2016/03/28
スイッチでSMUTE発動ですか。それなら DSD・PCM切替の部分をSMUTEに置き換えてみるというのはいかがでしょうか?
試してはいませんが、動作の過程では上手く行けるような気がします。
スイッチはトグルスイッチのような保持型でいけるでしょう。
退会したユーザーさん
2016/03/29
PS
ミュートは理屈が分からない(笑)のですがSMUTEを書き込む前にリセットを入れたら動くようになりました。
lukaworldさん
2016/03/30
ここのコメント欄に過程を記入していますが、コツコツと時間を掛けて加工しています。
オススメできる作業ではないですが、加工依頼すると高価なので、節約してその分を部品代などに回すということで自分でやっています。
このDAC、なにをするにでもリセットしろとデータシートに記述が多々見られるので、そのあたりが関係しているのかもしれませんね。
退会したユーザーさん
2016/03/30
根性と集中力が無いと出来ない。すごいですね(^_^;)
マイコン基板と液晶のユニットが良いですね。使って見たいです。
768kHz/32Bit AK4490EQ DAC, I2S/DSD input基板の電源パターンを
追いかけて分かったのですが手前のソフトウエアモードとハードウエアモードを
切り替えるジャンパー側にあるコンデンサーと電源コネクタ取り付け用パターンを
使用する場合はぐるっと回り込んで向かい側にあるデジタル3.3Vに接続されている
パターンをカットして使用する様に考えてあると思います。
そうすることでDACの左右チャンネルを独立して電源を最短で供給出来るように
なっていますね。
lukaworldさん
2016/04/01
そうです。この基板左右独立電源出来るようになっています。
オペアンプも交換可能なので、色々差し替えて楽しめますし、やなさんの基板とはまた違う楽しみが出来ます。
退会したユーザーさん
2016/04/07
曲飛ばしを行った時に爆音ノイズがでませんか?
音が良いだけに残念で色々対策を検討していますが
lukaworldさんの環境ではどうですか?
lukaworldさん
2016/04/08
XMOSをDDCにお使いであれば、ミュート機能を使えるはずなので有効にしてみるといいかもしれません。
IN側ミュート端子は接続して、設定から有効にすれば機能するはずです。