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.

Diese Seite ist veraltet! Eine ausführlichere Beschreibung (auf Englisch) gibt es auf der Seite ARM MP3/AAC Player.

Status (28.05.06)

  • AT91SAM7S64-Dev-Board, SAM7S64 gegen SAM7S256 ausgetauscht
  • MP3- und AAC-Decoder: https://datatype.helixcommunity.org/
  • Datenspeicher: SD-Karte, Ansteuerung über die FAT-Bibliothek von http://elm-chan.org/fsw/ff/00index_e.html
  • DAC: CS4331 (auf MP3-Player-Platine "Pump" aus der c't), Fütterung über SSC mit DMA
  • Bild des Hardwareaufbaus
  • Abspielen von WAV-, MP3- und AAC-Dateien (im ADTS-Format) von SD-Karte funktioniert einwandfrei
  • VBR-MP3 mit durchschnittlich 195 kbit/s (128-320) problemlos abspielbar
  • AAC über ca. 140 kBit/s mit Aussetzern, sollte kein Problem mehr sein wenn das Verhältnis CPU-Takt/Samplerate etwas erhöht wird (sobald der TLV320-DAC dran ist)

Noch zu tun

  • ID3v2-Tags auslesen
  • Playlists (m3u)
  • neuen DAC einbauen
  • OLED-Display anschließen
  • AAC im MP4-Container abspielen

Ü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 (aber nur im bastlerunfreundlichen TQFN-Package erhältlich!)
  • mit Kopfhörer-Amp. u.a.
  • Keine großen Entkoppelkondensatoren notwendig
  • 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