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
:
Bearbeitet durch User
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(); }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.