ARM-MP3-Player: Unterschied zwischen den Versionen
KKeine Bearbeitungszusammenfassung |
K (→WM8731) |
||
Zeile 114: | Zeile 114: | ||
* Aufnahmefunktion möglich | * Aufnahmefunktion möglich | ||
* Mikro-Vorverstärker und Kopfhörer-Verstärker eingebaut | * Mikro-Vorverstärker und Kopfhörer-Verstärker eingebaut | ||
* | * Nur in 100er-Stückzahlen erhältlich -> scheidet aus | ||
==== TDA1543 ==== | ==== TDA1543 ==== |
Version vom 16. Mai 2006, 16:54 Uhr
von Benutzer:Andreas
Jeder Mikrocontroller-Bastler der was auf sich hält baut irgend wann mal einen MP3-Player. Das hier ist meiner.
Status (13.06.06)
- AT91SAM7S64-Dev-Board, SAM7S64 gegen SAM7S256 ausgetauscht
- MP3-Decoder: https://datatype.helixcommunity.org/mp3dec.html
- Datenspeicher: SD-Karte
- DAC: CS4331 (auf MP3-Player-Platine "Pump" aus der c't), Fütterung über SSC mit DMA
- Bild des Hardwareaufbaus
- Abspielen von MP3-Dateien von MMC/SD-Karte funktioniert (ist aber seeehr knapp, muss optimiert werden!)
Ü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").
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.
Interessante DACs
TLV320AIC23B
- Kopfhörer-Verstärker
- Line- und Mikrofoneingang
- 28 TSSOP (Adapterplatine: http://www.futurlec.com/SMD_Adapters.shtml)
- läuft auch mit 12 MHz
- gibt's bei Digikey
- -> perfekt!
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
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
- kein MCLK nötig
- DIP-8
- gibt's bei Segor für 2 Euro
- qualitätsmäßig eher Low-End
- -> perfekt zum Testen!
- Datenblatt: http://www.docethifi.com/TDA1543_.PDF