Hi Leute Hab mir nun ein STM32 Board angeschafft und wollte eigentlich die I2S Schnittstellen nutzen um ein USB Soundkarte zu basteln. Verbaut ist ein STM32F103VE (also HD Typ). Nun wollte ich anfangen damit zu spielen und seh grad im Datanblatt auf Seite 703, dass die HD Serie nich gerade passend für I2S ist. Die Datenraten passen quasi überhaupt nicht zusammen. Ein zwei Seiten danach sind die Werte für die CL Serie und dort wird ein 14,7456MHz Quarz empfohlen um ein gute Abdeckung zu bekommen. Nun stellt sich für mich die Frage ist es mit der HD Serie überhaupt möglich I2S vernünftig zu nutzen (also zB ein 14,74MHz Quarz nehmen) und wenn das geht, krieg ich dann USB auch noch zum laufen? Ich bin neu im STM32 Bereich und es ist am Anfang echt sehr undurchsichtig... Würde mich über eine Info sehr freuen! Gruß MB
Hallo Günter, welchen DA oder AD Chipsatz wilst du überhaupt verwenden ? Es gibt doch schon dafür fertige chips von Ti mit USB. Aber zurück zu deinem Problem, was eigentlich gar keines ist. Denn die meisten ADCs oder DACs gehen ja auch im Master Mode. D.h. der Cortex M3 leuft im Slave Mode und braucht selber gar keinen Takt. Und alles was mit Clocks,Oversampling und Framing zu tun hat macht der Audio Chip selber (und eigentlich eh besser). Also must du nur das I2S Interface richtig einstellen und die DMA verwenden. Gruß Sascha
Hi Sascha Danke für die Antwort! Also machen will ich nur DA und das am liebsten doppelt. Also zwei Stereo Kanäle an einem STM. Sollte eigentlich gehen, oder? OK, dachte immer alle I2S DACs brauchen den Master Clock von extern. So wie du das beschreibst laufen also manche von alleine und müssen nur per I2S gesynct und versorgt werden. Muss ich mal schauen was mir da passt. Ich wollte als DAC eigentlich den PCM1754 oder ähnlich verwenden. Allerdings habe ich den noch gar nicht zur Hand (was in dem Fall vielleicht gar nicht schlecht ist gg) Hättest du evtl. eine Empfehlung für einen "guten" DAC. Ich will eigentlich keinen "Schrott" verbauen... Gruß MB
Hallo Günter, ja die Wahl des ADCs oder DACs ist sehr schwierig. Es gibt einfach schon zu viel (auch natürlich zu viel Schrott). Es kommt aber auf deine Anwendung an. Ich habe bis jetzt nur zwei Entwicklungen mit Audio Wandlern gemacht und habe dazu einen CPLD benutzt um alle Signale von und zum DSP-ADC/DAC zu leiten und aufbereiten. Ich habe auch absolute Potentialtrennung mit Optokoppler bzw. ADuM typen von Analog Device gemacht. Wenn man mal überlegt was eigentlich 100dB Rauschabstand heißt, kann man das mit einem schlechten Masse Potential oder gar noch USB-PC und Schaltnetzteil die Qualität mehrfach vernichten. Zu den Wandlern, schau mal bei Ti,Wolfson und Analog Device. (tip: WM8741) In einer anderen Entwicklung habe ich mir das Leben etwas leichter gemacht und habe einen TLV320AIC23BPW eingesetzt. Der kann auch über 16 Bit SPI als quasi DSP-Interface arbeiten. Unterstützt aber auch noch I2S. Die CODEC chips also DAC mit ADC sind meistens auch Master tauglich. Gruß Sascha
Hi Sascha Ich habe vor einen Midi Controller zu bauen. Es ist also sicher nicht für den absoluten Hi End Bereich gedacht. Ich will aber das Audio Interface gleich mit integrieren, darum meine Wahl zum STM32. Ich hab mir den PCM5102 angeschaut und werde diesen nun bestellen. Laut DB soll er ja den MCK selber generieren sobald die I2S Schnittstelle aktiviert wird. Somit sollte ich mit der HD Serie und 8MHz auskommen. Bei 44,1kHz hab ich zwar einen Fehler von 0.04%, aber ich denke das ist im Bereich des "Erlaubten". Ich werd das ganze mal zusammen stöpseln und an einem Prototyp testen. Hoffe ich komm zu einem halbwegs brauchbaren Ergebnis... Somit danke nochmal für die Infos! Gruß Günter
So habe nun das Beispiel von CooCox (USB_ADC) auf dem STM verfrachtet und ein wenig angepasst. Windows erkennt das Board als USB Audio Gerät und es passt eigentlich alles soweit. Leider hängt sich der STM auf, sobald ich Sound ausgebe. Im USB Callback werden die Daten in einen Buffer gelesen und dort ist der Hund begraben. Wenn ich das Auslesen auskommentiere läuft der STM weiter. Das Callback sieht so aus:
1 | void ADC_ISOOut(USBADC_Dev *dev,uint32_t Event) |
2 | {
|
3 | uint32_t len; |
4 | uint8_t wbuf[ADC_EP_MAXPAKET]; |
5 | len = dev->usb_enu.usb->USB_ReadEP(ADC_EP_OUT, wbuf); |
6 | if(dev->Audio_write != NULL) |
7 | {
|
8 | dev->Audio_write(dev->Audio_device, wbuf, len); |
9 | }
|
10 | }
|
Die Audio_write Methode macht nichts, ist also leer. Könnte es sein, dass irgendwo etwas voll läuft? Bin neu beim STM und weiß hier nicht wie er sich verhält. Mit dem Debugger kann ich das Callback einmalig anschauen und es scheint als würden die richtigen Daten daher kommen. Leider steht das ganze Werk wenn ich mit dem Debugger "störe", weil dann USB auf gibt. Hat irgend jemand Erfahrung mit diesem Beispiel, würde mich sehr freuen!!! Gruß Günter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.