Hallo Zusammen.
Wir müssen vom Studium aus ein Projekt machen, bei dem wir eine Audio
Datei von einer SD Karte abspielen können. Nun funktioniert alles, bis
auf den Audio Codec. Als Codec haben wir den PCM3060 von Texas
Instruments.
Die Schaltung mit dem Audioteil ist als Bild angehängt. Die Widerstände
R13 und R14 an Vout+ und Vout- sind noch nicht bestückt, da ich zuerst
abwarten möchte, bis der Codec läuft. VDD im Schema ist 3.3V. Als MCU
verwende ich einen PIC 24FJ64GB004 mit XC16 Compiler
Der Codec wird über I2C konfiguriert und die Audio Samples werden über
SPI an den Codec gesendet. Der Codec wird als SPI und LRCK Master
konfiguriert, der PIC als Slave.
Die Konfiguration über I2C funktionert. Das Acknowlegde bit wird vom
Codec auf 0 gesetzt, was schon kein schlechtes Zeichen ist. Auch wenn
ich den Codec von SPI master auf SPI Slave umkonfigurier kommt kein CLK
Signal mehr vom Codec. Daher werden auch die I2C Daten richtig gesendet
um vom Codec richtig verstanden.
Was nicht funktioniert:
Ich messe am Audio Ausgang des DACs nur 2.5V, wenn ich einen voll
ausgesteuerten Sinus über SPI draufgebe. Auch wenn die Daten falsch
wären, müsste der Ausgang irgendetwas machen. Die 2.5V sind ok, das ist
die virtuelle Masse, um welche ausgesteuert wird. Und nein MUTE ist
NICHT aktiviert und die Lautstärke ist auf 0dB.
Der ADC ist im Schema nicht benutzt. Auch wenn ich dort den Analog
Eingang ablöte und in die Luft hänge und dann mit einem Draht ein
Externes Signal einspeise kommt am Dout vom Codec nichts raus. Den
Eingangsfilter habe ich über die Konfiguration deaktiviert.
Gemessene Werte:
5V Speisung OK
3.3V Speisung OK
SCKL1, SCKL2 11.289 MHz -> OK
LRCK1, LRCK2 44.1003 kHz -> OK
BCK1, BCK2 2.822 MHz -> OK
RST 3.3V -> OK
DIN SPI Daten -> OK
DOUT 0V -> nicht OK
VCOM 2.5V -> OK
I2C Pins OK
VOUTL+, VOUTL- 2.5V -> nicht OK
PS: den Codec habe ich auch schon ausgelötet und einen neuen eingelötet.
-> gleiches Problem.
Sourcecode und Schema sind angehängt. Falls jemand mit diesem Codec
schon erfahrung hat wäre es echt super, wenn der/diejenige den Source
zur verfügung stellen könnte.
David schrieb:> Gemessene Werte:David schrieb:> Update: Zero Flag detect funktioniert auch nicht
Ja, was meinst du - geht der Chip auf Mute oder erkennt er nischt?
Miss doch mal bitte, was an den ZeroL und ZeroR Ausgängen passiert. Die
sollten nach High gehen, wenn der Chip keine Daten erkennt, also als
Muteausgang fungieren. Das wäre ein Zeichen, das der Codec schon
Probleme hat, deine Daten zu erkennen.
Du konfigurierst den Codec auf 24-bit Leftadjusted, statt auf Standard
I2S. Bist du sicher, das das richtig ist?
Ausserdem (obwohl du den ADC nicht benutzt) konfigurierst du diesen auf
I2S. TI sagt nicht, das es nicht geht, aber misstrauisch wäre ich da
trotzdem.
Spiel den Sinus doch mal aus einer festen Tabelle anstatt in On-The-Fly
zu erzeugen, dann sind Fehler da ausgeschlossen.
Sinustabelle kannst du dir hier erzeugen:
http://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml
An den Zero Flags messe ich immer 0V, auch wenn ich anstatt Daten
einfach 0V über den DIN sende. Dann sollte dieses Flag definitv auf high
gehen.
Den ADC habe ich zu Testzwecken in Betrieb genommen, um zu sehen, ob
etwas am DOUT raus kommt, wenn ich an den ADC eingängen einen 2.5V
Offset behafteten Sinus speise. Leider kommt da nichts.
SPI Leftadjusted ist schon richtig, da ich normales SPI anstatt I2S
verwende (Controller hat das nicht). Die Daten kommen schon so wie im
Datenblatt spezifiziert.
Sinus berechnung sollte funktionieren habe es überprüft, ich probiere
trotzdem mal die Tabelle.
Ich habe nochmal ein wenig in den TI Foren gestöbert, und als eine
mögliche Erklärung gefunden, das der PCM3060 im Master Mode alle Clocks
selber liefert - du musst also deine SPI Quelle auf jeden Fall als Slave
konfigurieren auf externe BCLK.
Zum Trost - du bist nicht der einzige mit diesem Problem.
Es könnte übrigens klappen, den Chip auf I2S zu konfigurieren, denn das
Datenformat ist ja bis auf den Wechsel bei LRCLK genau das gleiche wie
bei 24-bit leftadjusted. Wäre auf jeden Fall mal einen Versuch wert.
Problem gelöst, es funktioniert jetzt. Am Mittwoch habe ich nochmals
überprüft, ob er die konfiguration richtig ladet, in dem ich den AD und
DA Wandler mir Register 64 in den Power Save mode gesetzt habe. Dies hat
funktioniert. Ich bekam kein LRCK mehr vom Codec. Als ich am nächsten
Tag wieder den Codec in Betrieb genommen habe, habe ich irgendeine
andere Konfig mit Register 64 gemacht und dann hat es funktioniert. Die
Delayfunktion generiert eine Pause von ca. ~70mS. Ev. könnte man diese
auch zum teil weglassen. Da es aber funktioniert und diese Funktion nur
einmal gebraucht wird und nicht stört lasse ich es drin.
Hier noch der Code mit dem es funktioniert hat.
void AudioCodecInit(){
while(writeAudioCommand(64,0x03));
Audio_RST = 0;
Delay();
Audio_RST = 1;
Delay();
Delay();
Delay();
while(writeAudioCommand(64,0x80));
Delay();
//writeAudioCommand(0x40,0x60);
writeAudioCommand(65,0xff); //Lautstärke Links
writeAudioCommand(66,0xff); //Lautstärke Rechts
writeAudioCommand(67,0x41); //Master/Slave
writeAudioCommand(68,0); //DAC Oversample + Phase + Mute
writeAudioCommand(69,80); //DAC Filter
writeAudioCommand(70,215); //Lautstärke ADC = 0dB
writeAudioCommand(71,215); //Lautstärke ADC = 0dB
writeAudioCommand(72,0x40); //ADC Master/Slave - Data Format
writeAudioCommand(73,0x08); //ADC Filter
//while(writeAudioCommand(64,0x00)); //Warten bis ACK erkannt
Delay();
}