Forum: Mikrocontroller und Digitale Elektronik STM32F4xx: I2S, 192khz mit ext. Oszillator (24.576Mhz)


von Ronald M. (ronaldmcdonald)


Lesenswert?

Hinter den Betreff müsste eigentlich ein großes Fragezeichen.
Auf normalen Wege ist das offenbar nicht möglich.

Der ext. 24.576Mhz Oszillator hängt am I2S_CK Pin.  Ich gehe von 32 bit 
pro Kanal aus.  Die Verwendung des I2S PLLs ist keine viable Option, es 
muss also ein externer Oszillator sein.

Im Datasheet steht, die Samplerate definiert sich durch

FS = I2SxCLK / [(32*2)*((2*I2SDIV)+ODD))]

Normalerweise sind 24.576Mhz Oszillatoren der Standard bei DACs mit den 
Sampleraten 48khz, 96khz, und 192khz.  Blöd nur, dass im RM0090 auf 
Seite 708 steht:

Bit 7:0 I2SDIV: I2S Linear prescaler
    I2SDIV [7:0] = 0 or I2SDIV [7:0] = 1 are forbidden values.

Sehr ärgerlich, denn "1" wäre genau der benötigte Prescaler.  Effektiv 
bedeutet das, dass zur Verwendung von 192khz Samplerate mindestens ein 
49.152Mhz Oszillator benötigt wird, und das bei Verwendung des kleinsten 
laut Datenblatt erlaubten prescalers.  Offenbar braucht das I2S 
(Fehl)Design des STM32F4 256*FS.

Ich will keinen 49.152Mhz Oszillator.

Was haltet ihr davon, die 24.576Mhz per externem PLL zu verdoppeln, um 
sie dem STM32F4 schmackhaft zu machen?  Da müsste natürlich äußert 
präzise (und schnell) passieren, um noch im Rahmen des erlaubten Timings 
(uC -> DAC) zu liegen.

Oszillator --> DAC
DAC        --> ext. PLL --> STM32F4 --> DAC

von Frank K. (fchk)


Lesenswert?

Ronald Macdonald schrieb:

> Ich will keinen 49.152Mhz Oszillator.

weswegen?

> Was haltet ihr davon, die 24.576Mhz per externem PLL zu verdoppeln, um
> sie dem STM32F4 schmackhaft zu machen?  Da müsste natürlich äußert
> präzise (und schnell) passieren, um noch im Rahmen des erlaubten Timings
> (uC -> DAC) zu liegen.
>
> Oszillator --> DAC
> DAC        --> ext. PLL --> STM32F4 --> DAC

Takthalbierung per 74AHC74 ist mit Sicherheit billiger, wenn Du keine 50 
MHz übers Board laufen haben willst.

fchk

von Ronald M. (ronaldmcdonald)


Lesenswert?

Frank K. schrieb:
> Ronald Macdonald schrieb:
>
>> Ich will keinen 49.152Mhz Oszillator.
>
> weswegen?

Ich bräuchte dann drei externe Oszillatoren anstatt zwei, um alle 
gängigen Sampleraten (44khz, 48khz, 88khz, 96khz, 176khz, 192khz) 
unterstützen zu können, 3 Relays (anstatt einem) um diese bei Bedarf zu 
schalten, und gerade 22.528Mhz und 24.576Mhz bekommt man bezahlbar mit 
<1ppm, insbesondere sind davon noch einige im Lager, eben weil es der 
Industriestandard bei Audioanwendungen ist.  Zum Beispiel der TI (ex. 
Burr-Brown) PCM1792A akzeptiert 128*FS, 192*FS, 256*FS, 384*FS, 512*FS, 
768*FS.  Man kommt also mit den oben genannten Oszillatoren für alle 
Sampleraten hin.

>
>> Was haltet ihr davon, die 24.576Mhz per externem PLL zu verdoppeln, um
>> sie dem STM32F4 schmackhaft zu machen?  Da müsste natürlich äußert
>> präzise (und schnell) passieren, um noch im Rahmen des erlaubten Timings
>> (uC -> DAC) zu liegen.
>>
>> Oszillator --> DAC
>> DAC        --> ext. PLL --> STM32F4 --> DAC
>
> Takthalbierung per 74AHC74 ist mit Sicherheit billiger, wenn Du keine 50
> MHz übers Board laufen haben willst.

Die würden in jedem Fall übers Board laufen, zum STM32F4.
Ich muss die Frequenz möglichst nah am STM32F4 verdoppeln. ;(
Nur welche Methode in diesem Fall bei ~50Mhz die Beste ist, weiß ich 
nicht.

>
> fchk

von Frank K. (fchk)


Lesenswert?

Ronald Macdonald schrieb:

> Ich bräuchte dann drei externe Oszillatoren anstatt zwei, um alle
> gängigen Sampleraten (44khz, 48khz, 88khz, 96khz, 176khz, 192khz)
> unterstützen zu können, 3 Relays (anstatt einem) um diese bei Bedarf zu
> schalten, und gerade 22.528Mhz und 24.576Mhz bekommt man bezahlbar mit

Ups. Du schaltest die Taktsignale über Relais? Das ist doch nicht 
glitch-free etc? Haben Deine Oszillatoren keinen Enable-Pin?

fchk

von Ronald M. (ronaldmcdonald)


Lesenswert?

Frank K. schrieb:
> Ronald Macdonald schrieb:
>
>> Ich bräuchte dann drei externe Oszillatoren anstatt zwei, um alle
>> gängigen Sampleraten (44khz, 48khz, 88khz, 96khz, 176khz, 192khz)
>> unterstützen zu können, 3 Relays (anstatt einem) um diese bei Bedarf zu
>> schalten, und gerade 22.528Mhz und 24.576Mhz bekommt man bezahlbar mit
>
> Ups. Du schaltest die Taktsignale über Relais? Das ist doch nicht
> glitch-free etc? Haben Deine Oszillatoren keinen Enable-Pin?
>
> fchk

Momentan schon, weil's zum Testen einfach ist.  Einen Enable-Pin gibt's 
da nicht, aber ich werde später wohl jeweils dem VCC einen MOSFET 
(BSS123) vorschalten.

Das hier sieht aus, als wäre es einen Versuch wert:

http://www.maxim-ic.com/app-notes/index.mvp/id/3327

Allerdings müsste es nicht-invertierend aufgebaut werden, da ich eine 
halbwegs synchrone steigende Flanke brauche.

R1 x C1 = 2/3 * (1 / 49.152) = 0.013563368.

Mal sehen, ob sich da geeignete Werte für R1 und C1 finden.
Aufgrund der möglichen Toleranzen der Bauteile empfinde ich es aber doch 
als Notlösung.

von Frank K. (fchk)


Lesenswert?

Ronald Macdonald schrieb:
> Hinter den Betreff müsste eigentlich ein großes Fragezeichen.
> Auf normalen Wege ist das offenbar nicht möglich.
>
> Der ext. 24.576Mhz Oszillator hängt am I2S_CK Pin.  Ich gehe von 32 bit
> pro Kanal aus.  Die Verwendung des I2S PLLs ist keine viable Option, es
> muss also ein externer Oszillator sein.

Ich habe mir das Manual mal vorgenommen.

Betreibst Du den I2S im Master Mode (CK und WS sind Outputs) oder im 
Slave Mode (CK und WS sind Inputs)?

CK ist der Bit Clock, nicht der Master Clock (MCLK ist im Master Mode 
ein extra Output). Bei f_S=f_WS=192 KHz und 64 Bits pro Frame wäre 
f_CK=12.288 MHz und f_MCLK=49.152MHz.

MCLK ist offenbar nur Output, und CK und WS kannst Du nur zusammen als 
Output (Master) oder Input (Slave) konfigurieren. Wenn Du also den Clock 
nicht intern erzeugen willst, bleibt Dir nur der Slave Mode. Dann muss 
der DAC I2S Master sein, aber Du bist nicht auf 256*f_S festgelegt, weil 
der STM32 nur den Bit Clock bekommt, nicht aber den Master Clock.

> laut Datenblatt erlaubten prescalers.  Offenbar braucht das I2S
> (Fehl)Design des STM32F4 256*FS.

Ja, das steht da auch klar drin (Seite 685 im RM0090 Doc ID 018909 Rev 
1).

fchk

von Ronald M. (ronaldmcdonald)


Lesenswert?

Frank K. schrieb:
> Ronald Macdonald schrieb:
>> Hinter den Betreff müsste eigentlich ein großes Fragezeichen.
>> Auf normalen Wege ist das offenbar nicht möglich.
>>
>> Der ext. 24.576Mhz Oszillator hängt am I2S_CK Pin.  Ich gehe von 32 bit
>> pro Kanal aus.  Die Verwendung des I2S PLLs ist keine viable Option, es
>> muss also ein externer Oszillator sein.
>
> Ich habe mir das Manual mal vorgenommen.
>
> Betreibst Du den I2S im Master Mode (CK und WS sind Outputs) oder im
> Slave Mode (CK und WS sind Inputs)?

I2S3 im Master Mode.

> CK ist der Bit Clock, nicht der Master Clock (MCLK ist im Master Mode
> ein extra Output). Bei f_S=f_WS=192 KHz und 64 Bits pro Frame wäre
> f_CK=12.288 MHz und f_MCLK=49.152MHz.

MCLK verwende ich nicht.  Die Master Clock geht direkt vom Oszillator 
zum DAC.

> MCLK ist offenbar nur Output, und CK und WS kannst Du nur zusammen als
> Output (Master) oder Input (Slave) konfigurieren. Wenn Du also den Clock
> nicht intern erzeugen willst, bleibt Dir nur der Slave Mode.

Ich schaue gleich mal im DAC Manual nach, ob der als Master fungieren 
kann.  An den STM32F4 als I2S slave habe ich noch gar nicht gedacht. 
Danke für den Denkanstoss.

> Dann muss
> der DAC I2S Master sein, aber Du bist nicht auf 256*f_S festgelegt, weil
> der STM32 nur den Bit Clock bekommt, nicht aber den Master Clock.
>
>> laut Datenblatt erlaubten prescalers.  Offenbar braucht das I2S
>> (Fehl)Design des STM32F4 256*FS.
>
> Ja, das steht da auch klar drin (Seite 685 im RM0090 Doc ID 018909 Rev
> 1).
>
> fchk

von Ronald M. (ronaldmcdonald)


Lesenswert?

Ronald Macdonald schrieb:
> Frank K. schrieb:
>> MCLK ist offenbar nur Output, und CK und WS kannst Du nur zusammen als
>> Output (Master) oder Input (Slave) konfigurieren. Wenn Du also den Clock
>> nicht intern erzeugen willst, bleibt Dir nur der Slave Mode.

Der DAC kann selbst nur als Slave betrieben werden.  Die CK würde ich 
einfach direkt vom Oszillator nehmen, aber niemand fühlt sich dann für 
WS zuständig.

von Frank K. (fchk)


Lesenswert?

Welchen DAC verwendest Du?

fchk

von Frank K. (fchk)


Lesenswert?

Ronald Macdonald schrieb:
> Ronald Macdonald schrieb:
>> Frank K. schrieb:
>>> MCLK ist offenbar nur Output, und CK und WS kannst Du nur zusammen als
>>> Output (Master) oder Input (Slave) konfigurieren. Wenn Du also den Clock
>>> nicht intern erzeugen willst, bleibt Dir nur der Slave Mode.
>
> Der DAC kann selbst nur als Slave betrieben werden.  Die CK würde ich
> einfach direkt vom Oszillator nehmen, aber niemand fühlt sich dann für
> WS zuständig.

Mit nem 74HC393 oder 74LV393 durch 64 teilen, und schon hast Du Deinen 
WS.

fchk

von Ronald M. (ronaldmcdonald)


Lesenswert?

Frank K. schrieb:
> Welchen DAC verwendest Du?
>
> fchk

Den PCM1795 von Texas Instruments

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.