ARM-MP3-Player

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

von Benutzer:Andreas

Jeder Mikrocontroller-Bastler der was auf sich hält baut irgend wann mal einen MP3-Player. Das hier ist meiner.

Status (25.05.06)

Probleme

Double Buffer für die dekodierten Frames reicht für höhere Bitraten und AAC nicht aus, da ab und zu das Lesen von der Karte bis zu 30ms dauert -> Aussetzer.

Lösung:

  • mehrere Buffer in Ringstruktur verwenden
  • anderer DAC, damit niedrigere (=richtige) Samplerate und höherer CPU-Takt möglich

Überlegungen zum DA-Wandler

Taktversorgung

Soll-Werte:

  • Samplerate (word clock, LRCLK): [math]\displaystyle{ f_s = 44\,100 \mathrm{Hz} }[/math]
  • Bittakt: [math]\displaystyle{ f_b = f_s \cdot 2 \cdot 16 = 1\,411\,200 \mathrm{Hz} }[/math]

Samplerate und Bittakt werden normalerweise synchron vom I2S-Interface erzeugt.

  • Master-Clock (MCLK): Fast alle DACs benötigen zusätzlich einen Takt mit dem 256-fachen der Samplerate, der exakt synchron zu den anderen Takten sein muss. In diesem Fall kann der DAC den Bittakt aus MCLK und LRCLK intern selbst erzeugen, so dass man den Bittakt nicht anzuschließen braucht.

Um halbwegs zur üblichen Samplerate passende Takte zu erzeugen muss der Controller mit einer "krummen" Frequenz laufen (z.B. MCLK * 4 = 45.16 MHz). Das sollte sich mit der PLL hinbekommen lassen.

Eine bessere Alternative sind DACs die intern einen sinnvollen Takt erzeugen und ausgeben können, so dass man das SSC peripheral des Controllers damit betreiben kann. Der Vorteil ist dass der Controller mit einer beliebigen Frequenz laufen kann.

Erster Prototyp: CS4331

Für den ersten Prototypen verwende ich einen CS4331. Hier wird der PWM-Controller für die MCLK-Erzeugung verwendet, SCLK wird vom Wandler intern aus MLCK und LRCLK abgeleitet (siehe "Taktversorgung").

ARM-MP3-Blockschaltbild.png

Der Prozessortakt ist hier auf 48.05 MHz eingestellt. Geteilt durch 4 gibt das einen etwas unpassenden Wert für den DAC (Soll: 256 * 44.1 kHz = 11.29 MHz, Ist: 12 MHz), somit hört sich alles etwas zu hoch an.

Code zur Initialisierung:

	/************  PWM  ***********/
	/*   PWM0 = MAINCK/4          */
	*AT91C_PMC_PCER = (1 << AT91C_ID_PWMC); // Enable Clock for PWM controller
	*AT91C_PWMC_CH0_CPRDR = 2; // channel period = 2
	*AT91C_PWMC_CH0_CMR = 1; // prescaler = 2
	pPIO->PIO_PDR = AT91C_PA0_PWM0; // enable pin
	*AT91C_PWMC_CH0_CUPDR = 1;
	*AT91C_PWMC_ENA = AT91C_PWMC_CHID0; // enable channel 0 output

	/************  SSC  ***********/
	*AT91C_PMC_PCER = (1 << AT91C_ID_SSC); // Enable Clock for SSC controller
	*AT91C_SSC_CR = AT91C_SSC_SWRST; // reset
	*AT91C_SSC_CMR = 16;
	*AT91C_SSC_TCMR = AT91C_SSC_CKS_DIV | AT91C_SSC_CKO_CONTINOUS |
	                  AT91C_SSC_START_FALL_RF |
	                  (1 << 16) |   // STTDLY = 1
	                  (15 << 24);   // PERIOD = 15
	pPIO->PIO_PDR = AT91C_PA16_TK | AT91C_PA15_TF | AT91C_PA17_TD; // enable pins
	*AT91C_SSC_TFMR = (15) |        // 16 bit word length
	                  (1 << 8) |	// DATNB = 1 => 2 words per frame
	                  (15 << 16) |	// FSLEN = 15
	                  AT91C_SSC_MSBF | AT91C_SSC_FSOS_NEGATIVE;
	*AT91C_SSC_CR = AT91C_SSC_TXEN; // enable TX

Fazit: CS4331 ist brauchbar zum Testen, mehr nicht.

Zweite Version: TLV320AIC23BPW

Geplant ist den TLV320AIC23BPW erst mal mit einer Adapterplatine ans SAM7-Board anzuschließen.

Auflistung interessanter DACs

TLV320AIC23B

MAX9850

  • 28 PIN
  • mit Kopfhörer-Amp. u.a.
  • relativ aufwendige Beschaltung und Konfiguration
  • auch krumme MCLK erlaubt:
  • Anforderung im Integer mode: Takt ganzzahliges Vielfaches der 16fachen Samplerate => nur bei PLL-Multiplikator von 4 möglich
  • Anforderung im Noninteger mode: Takt fast beliebig, somit 44.1 kHz kein Problem, auch mit 18.432 MHz-Quarz
  • nur als Sample beschaffbar? -> scheidet aus

Wolfson WM8727

http://www.wolfson.co.uk/products/digital_audio/dacs/WM8727/

  • 8-pin SOIC
  • keine Konfiguration
  • nicht sehr weit verbreitet

CS4331

http://joule.bu.edu/~hazen/DataSheets/Cirrus_Crystal/4330.pdf

  • 8 pin SOIC
  • keine Konfiguration
  • nicht mehr hergestellt

CS4334

  • 8-pin SOIC
  • keine Konfiguration
  • nur 5V-Betrieb

WM8731

  • The WM8731 is a very low power, high quality audio codec with integrated headphone driver, designed for portable digital audio applications.
  • Integrierte PLL-Takterzeugung aus z.B. 12 MHz
  • Aufnahmefunktion möglich
  • Mikro-Vorverstärker und Kopfhörer-Verstärker eingebaut
  • Nur in 100er-Stückzahlen erhältlich -> scheidet aus

TDA1543