Moin moin,
lese hier schon eine Zeitlang mit und konnte schon vieles an Wissen hier
aus dem Forum absaugen. Tolles Forum und tolle Leute hier.
Ich habe nach wie vor das Problem den PCM1774 am STM32 zum laufen zu
bringen und habe hier ein paar Fragen wo es gerade bei mir hängt.
Masterclock:
Der PCM1774 scheint in der Lage zu sein ein mck zu generieren (für sich
selbst?!). Hierfür hatte ich den STM32 als I2S Slave Transmit
konfiguriert.
Sehe ich das richtig, das der BCK und der WS vom DAC erzeugt wird und
über die SD Leitung werden die einzelnen WORDS rausgeschoben?
Wenn ich den STM32 als Master konfiguriere, dann sende ich per HAL I2S
Transmit mein Array raus. Wie schaut es aus, wenn der STM32 ein Slave
ist?
Sampling:
Ich möchte im Loop ein 8kHz Sound abspielen, wie muss ich dafür den
PCM1774 eigentlich konfigurieren? Im DB habe ich hierfür verschiedene
MCK/Div Möglichkeiten, welche nimm man da (Da der STM32 nur mit dem
Faktor 256 arbeiten, diesen...Dann gibt es hierfür keine Möglichkeit die
auf diese Konstellation passt).
Ich wäre sehr dankbar, wenn mir hier geholfen werden könnte.
Viele Grüße,
Franz
So wie ich es sehe, hat der Chip keinen Puffer-Speicher, wie z.B. die
VS1053 oder allgemein VSXXXX von vlsi.
Du kannst also Deine Daten nicht "einfach so hinsenden" sondern musst
sie mundgerecht zur richtigen Zeit Bit für Bit zur Verfügung stellen.
Der Unterschied Master/Slave ist dann eigentlich nur, wer den Takt
vorgeben darf. Den musst Du durch Vorteiler und Programmierung so
hinbekommen, dass das benötigte Vielfache Deiner 8kHz (üblicherweise 64x
oder 256x) als Takt rauskommt.
Wenn Du zum ersten Mal ein Audiogerät baust / programmierst, würe ich
Dir einen o.g. VLSI-Chip empfehlen (zumal der auch komprimierte Formate
wie MP3 oder OGG spielen kann).
Damit das Timing passt habe ich ja die verschiedenen Takte wie zb mck,
bck und ws. Einen buffer brauche ich doch nur zb per uart die Daten an
einen audio Decoder schicke.
Franz schrieb:> Einen buffer brauche ich doch nur zb per uart die Daten an> einen audio Decoder schicke.
Dafür nimmt man vorzugsweise den SPI/I2S Empty IRQ. In der kleinen ISR
wird dann abwechselnd der Buffer für links und rechts gefüttert. Links
und rechts unterscheide ich ganz simpel über die Polarität des WS
Signals, kann man aber auch anders machen.
Am einfachsten erschien mir auf dem STM32F407 Disco mit dem Cirrus Chip
die Master Send Funktion, bei der auch MCLK vom STM32 kommt.
Der PCM1774 generiert den MCK nur für sich selbst, er gibt ihn im
Mastermode nicht an den Slave weiter. Wir hatten auch diverse Probleme
den DAC als Master laufen zu lassen und es blieb dabei, dass er jetzt
als Slave läuft und 3wire I2S als input kriegt. Läuft auf diese weise
sehr gut.
Viel Glück
Matthias S. schrieb:> Franz schrieb:>> Einen buffer brauche ich doch nur zb per uart die Daten an>> einen audio Decoder schicke.>> Dafür nimmt man vorzugsweise den SPI/I2S Empty IRQ. In der kleinen ISR> wird dann abwechselnd der Buffer für links und rechts gefüttert. Links> und rechts unterscheide ich ganz simpel über die Polarität des WS> Signals, kann man aber auch anders machen.> Am einfachsten erschien mir auf dem STM32F407 Disco mit dem Cirrus Chip> die Master Send Funktion, bei der auch MCLK vom STM32 kommt.
Hi,
so langsam bekomme ich das in Griff mittlerweile, nur eine Unstimmigkeit
habe ich da noch bzgl. der Audio Daten:
Ich verwende folgendes Array zum testen
...in der while schleife
Mit dem LA sehe ich nur jeden zweiten Wert der mir als "Rechter Kanal"
angezeigt wird wo WS im High Pegel ist.
Wie steuert man hier die Kanäle eigentlich an?
Matthias S. schrieb:> PlayPointer0++;> if (PlayPointer0 > BUFFERSIZE) PlayPointer0 = 0;
Wenn das betreffende Array wie üblich mit BUFFERSIZE als Größe
deklariert ist, müßte das ">=" und nicht ">" sein, weil array[BUFFESIZE]
schon out of bounds ist.
Nop schrieb:> Wenn das betreffende Array wie üblich mit BUFFERSIZE als Größe> deklariert ist, müßte das ">=" und nicht ">" sein, weil array[BUFFESIZE]> schon out of bounds ist.
Nö.
Das Array wird aus Narrensicherheitsgründen eh mit audio0[BUFFERSIZE+1]
deklariert. Platz schaffe ich durch die Verlegung von allem anderen Kram
in den CCRAM - weiss allerdings nicht, ob der F303 sowas hat.
Die höchste Adresse, die im Array beschrieben wird, ist BUFFERSIZE.
Darum gehts hier aber auch gar nicht. Es geht um das rechtzeitige Füllen
der I2S Buffer.
idealerweise nimmt man den DMA
der wird so konfiguriert das die daten immer im loop rausgeschrieben
werden
du brauchst dann später "nur" die daten im buffer ändern und der DMA
schiebt die einfach raus
die ISR hat dazu 2 events ...
buffer halb und voll abgespielt
der ungenutzte/abgespielte bereich darf dann wieder mit neuen daten
gefüllt werden.
bei mir zB :