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
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
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
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
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.
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
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
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.
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