Forum: Mikrocontroller und Digitale Elektronik STM32 -> I2S Fragen


von Günter R. (muntablues)


Lesenswert?

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

von Sascha P. (spy007)


Lesenswert?

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

von Günter R. (muntablues)


Lesenswert?

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

von Sascha P. (spy007)


Lesenswert?

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

von Günter R. (muntablues)


Lesenswert?

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

von Günter R. (muntablues)


Lesenswert?

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
Noch kein Account? Hier anmelden.