Parallel DSD1794 NOS capable of DSD and PCM source

Status
This old topic is closed. If you want to reopen this topic, contact a moderator using the "Report Post" button.
Hi,

currently I'm using Deode's DDDAC using parallel PPCM1794 NOS. I'm very pleased from the DAC, but now I'm looking forward - a DSD format :)

I saw this thread - TI's DSD1794A
and this one - Parallel DSD1794 NOS/DSD passive I/V

On first look it's exactly what I'm looking for! Unfortunately there is not the whole needed information for me to do this project.
Firts, a schematic would be very helpfull, but even without it we can get a lot information from the pictures. The Arduino scketch isn't look 100% complete, but also gives a basic idea what to do.
So, I'm going to do such a configuration with DSD1794A in 4 parallel DACs, NOS, mono (at least I will try).

For this I need some guidness...

First for me the most interesting is the driver board -

424057d1402930980-parallel-dsd1794-nos-dsd-passive-i-v-1794-clock.jpg


As I saw DSD1794A can be configured in software mode, using I2C. On first look I thouth in this project I2C is used to configure the DSD1794A, but why there is a I2C to Serial converter? Probably the DACs are programmed on SPI interface?

Second - as the DSD1794A is using 2 pins to set the device's address (ADR0, ADR1) only 4 addresses conbinations can be done. To keep the similarity of the DAC's PCBs, I'm going to use only 2 addresses for each channel DSD1794A and a I2C I/O expander. Such as PCF8574, I'm gonna use 4 I2C channels for each DAC PCB. A I2C isolator can be used too (as seen on the picture)

I will not need a clock buffer and a clock divider, because I'm gonna use different USB decoder (XMOS). So this part will be gone in my design.

Here it is some raw schematic of my design, concider the 2 pin headers as s switches controlled by the MCU.

If you see any mistakes in the schematics, the design itself, please feel free to share it here. As I'm not so experinced in DSD mode I need your guidness :)
 

Attachments

  • DSD1794.pdf
    29.3 KB · Views: 202
Hopefully all going well,

1. I2C to serial is just to read the status from Amanero, as I wasn't able to set Arduino in slave mode to receive from Amanero, meanwhile in master mode to control the DSD1794,

2. You need I2C switch in order to control more than 4 DSD1794.

3. Data switch between PCM/DSD is needed otherwise there would be noise when switching the format with data on I2S, I used the enable PIN on reclocker D flip-flop to switch between PCM/DSD instead of using a demux switch (used to do so with Potato semi).

4. In order to I2C the DSD1794, sysclock needs to be lower than 22/24M, while if you want to play 384K PCM, then clock needs to be 45/48M, some logic needs to be applied (I used 1/2 clock during setup mode, meanwhile to disable the I2S).

5. Clock is preferred on DAC side, meanwhile to reclock the isolated I2S.
 
correction, the Lampi board is using CS4398 according to the PINs,

I dont have CAD, this was just experiment using diptrace, here is the arduino code, didnt get chance to finalize it as there was chance PCM/DSD registry wasn't correctly during initial start so need to reset the Arduino to make sure DSD1794 is good to go,


#include <Wire.h>
#include <Arduino.h>
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27,16,2);
#define DSDIN 2
#define SCKOUT 3
#define XOIN 4
#define FS0 5
#define FS1 6
#define FS2 7
#define FS3 8

//#define DSD1794_DEBUG 1

boolean DSD; //1 for DSD, 0 for PCM
boolean XOSEL; //1 for 45M, 0 for 49M

boolean p0;
boolean p1;
boolean p2;
boolean p3;

int state = 0;
int oldstate = 0;

char* FS[]={ " RESET " ,
" 44.1K " ,
" 48K " ,
" 88.2K " ,
" 96K " ,
" 176.4K" ,
" 192K " ,
" 352.8K" ,
" 384K " ,
"64 " ,
"128 " ,
"256 " ,
"512 " ,
" MUTE " ,
" UNMUTE" ,
" VOLUME" ,
" INIT " ,
};




void setup()
{
delay (500);
//Serial.begin(9600); // start serial for output
//Wire.begin(); // join i2c bus (address optional for master)
pinMode(DSDIN, INPUT); //
pinMode(SCKOUT, OUTPUT);
pinMode(XOIN, INPUT);
pinMode(FS0, INPUT);
pinMode(FS1, INPUT);
pinMode(FS2, INPUT);
pinMode(FS3, INPUT);


DSD = digitalRead(DSDIN);
XOSEL = digitalRead(XOIN);


lcd.init();
lcd.backlight();

digitalWrite(SCKOUT, LOW); //to put the sysclock on dsd1794 and disable I2S

if (XOSEL == 1) {
lcd.setCursor(11,0);
lcd.print("45MHz");
} else {
lcd.setCursor(11, 0);
lcd.print("49MHz");
}

if( DSD == HIGH) {
digitalWrite(SCKOUT, LOW);
delay(100);
SetI2CL();
SetDSDReg();
SetI2CR();
SetDSDReg();
digitalWrite(SCKOUT, HIGH);
lcd.setCursor(0,0);
lcd.print("DSD");
//Serial.println ("SET DSD");
//Print1794Reg();
} else {
//Serial.println ("setting PCM");
digitalWrite(SCKOUT, LOW);
delay(100);
SetI2CL();
SetPCMReg(); //to change when clock is still there
SetI2CR();
SetDSDReg();
digitalWrite(SCKOUT, HIGH);
//SetPCMReg();
lcd.setCursor(0,0);
lcd.print("PCM");
//Serial.println ("SET PCM");
//Print1794Reg();
}
delay(1000);
PrintState();
}

void loop()
{
PrintState();

if (digitalRead(XOIN)!=XOSEL) {
XOSEL = !XOSEL;
if (XOSEL == 1) {
lcd.setCursor(11,0);
lcd.print("45MHz");
} else {
lcd.setCursor(11, 0);
lcd.print("49MHz");
}
}
if(digitalRead(DSDIN)!=DSD && DSD == LOW) {

DSD = HIGH;
//Serial.println ("read reg first");
//Print1794Reg();
digitalWrite(SCKOUT, LOW);
delay(100);
SetI2CL();
SetDSDReg();
SetI2CR();
SetDSDReg();
digitalWrite(SCKOUT, HIGH);
//delay(500);
lcd.setCursor(0,0);
lcd.print("DSD");
delay(2000);
PrintState();

//delay(2000);
//Serial.println ("SET DSD");
}
if(digitalRead(DSDIN)!=DSD && DSD == HIGH) {
//delay(8000);

DSD = LOW;
//Serial.println ("read reg first");
//Print1794Reg();
//delay(200);
digitalWrite(SCKOUT, LOW);
delay(100);
SetI2CL();
SetPCMReg(); //apply before clock disappear
SetI2CR();
SetPCMReg();
digitalWrite(SCKOUT, HIGH);
//SetPCMReg();
//delay(500);
lcd.setCursor(0,0);
lcd.print("PCM");
delay(2000);
PrintState();
//delay(2000);
//Serial.println ("SET PCM");
//Print1794Reg();

}
delay(50);
}


void SetDSDReg()
{
Wire.beginTransmission(0x4c); //right
WriteDSDReg();
Wire.endTransmission();
//delay(100);
Wire.beginTransmission(0x4d); //right
WriteDSDReg();
//Wire.write(B00000010);
Wire.endTransmission();
//delay(100);
Wire.beginTransmission(0x4e); //left
WriteDSDReg();
//Wire.write(B00000010);
Wire.endTransmission();
//delay(100);
Wire.beginTransmission(0x4f); //left
WriteDSDReg();
//Wire.write(B00000010);
Wire.endTransmission();
}

void WriteDSDReg()
{
Wire.write(B00010010);
Wire.write(B00101000); //FIR-4 , also keep PCM Reg
Wire.write(B00000000);
Wire.write(B00101100);
}

void SetI2CL()
{
Wire.beginTransmission(0x70);
Wire.write(B01000000);
Wire.endTransmission();
}

void SetI2CR()
{
Wire.beginTransmission(0x70);
Wire.write(B10000000);
Wire.endTransmission();
}

void SetPCMReg()
{
Wire.beginTransmission(0x4c); //right
WritePCMReg();
//Wire.write(B00000001);
Wire.endTransmission();
//delay(100);
Wire.beginTransmission(0x4d); //right
WritePCMReg();
//Wire.write(B00000001);
Wire.endTransmission();
//delay(100);
Wire.beginTransmission(0x4e); //left
WritePCMReg();
//Wire.write(B00000001);
Wire.endTransmission();
//delay(100);
Wire.beginTransmission(0x4f); //left
WritePCMReg();
//Wire.write(B00000001);
Wire.endTransmission();
}

void WritePCMReg()
{
Wire.write(B00010010);
Wire.write(B00100000);
Wire.write(B00000001);
Wire.write(B00011100); //CHSL 1

}

void Print1794Reg(){
#ifdef DSD1794_DEBUG
Wire.beginTransmission(0x4c);
Wire.write(B10010000);
Wire.endTransmission();
Wire.requestFrom(0x4c,7);
Serial.println ("4C");
while(Wire.available()) {
Serial.println( Wire.read(),BIN);
}
delay(100);
Wire.beginTransmission(0x4d);
Wire.write(B10010000);
Wire.endTransmission();
Wire.requestFrom(0x4d,7);
Serial.println ("4D");
while(Wire.available()) {
Serial.println( Wire.read(),BIN);
}
delay(100);
Wire.beginTransmission(0x4e);
Wire.write(B10010000);
Wire.endTransmission();
Wire.requestFrom(0x4e,7);
Serial.println ("4E");
while(Wire.available()) {
Serial.println( Wire.read(),BIN);
}
delay(100);
Wire.beginTransmission(0x4f);
Wire.write(B10010000);
Wire.endTransmission();
Wire.requestFrom(0x4f,7);
Serial.println ("4F");
while(Wire.available()) {
Serial.println( Wire.read(),BIN);
}
#endif
}


void PrintState()
{
delay(50);
p0=digitalRead(FS0);
p1=digitalRead(FS1);
p2=digitalRead(FS2);
p3=digitalRead(FS3);
state=p0+p1*2+p2*4+p3*8;
if (state != oldstate)
{
lcd.setCursor(3,0);
lcd.print(FS[state]);
oldstate=state;
}
}
 
Personally I prefer to stay with DSD only, as the DSD (converted live using Jriver) sounds better than NOS PCM mode.

Here is the Lampizator DSD only DAC, seems using TI 179X as well.

Which DAC model is this, I thought Lampizator was using no DAC chip in
DSD DAC's?

That DAC chip is almost certainly a CS4398 (voltage out DAC) and not a
PCM1794.

Clearly the analog + and - OP's are pins 19/20 and 23/24. You can see the
tracks heading off to RC LPF networks. Also pin 21 is gnd and 22 VA+.

Pretty good investigative skills :).

cheers

Terry
 
Status
This old topic is closed. If you want to reopen this topic, contact a moderator using the "Report Post" button.