Forum: Mikrocontroller und Digitale Elektronik Audio Codec Problem


von David (Gast)


Angehängte Dateien:

Lesenswert?

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.

von David (Gast)


Lesenswert?

Update: Zero Flag detect funktioniert auch nicht

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von David (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von David (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.