Forum: Mikrocontroller und Digitale Elektronik Problem mit STM32 und AD7912


von Tim K. (timkl94)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich habe damit angefangen einen STM32L031C6 zu programmieren.
Ich scheitere gerade daran einen externen A/D-Wandler (AD7912) mit zwei 
Kanälen über SPI (bis zu 18Mhz) auszulesen.

Ich möchte dazu HAL verwenden und habe folgendes eingestellt:

Data Size: 8Bit
First Bit: MSB
Baud Rate: 16MBits
CPOL: High
CPHA: 2 Edge
NSS Signal: per Software

Mit der Funktion TransmitReceive will ich parallel Daten senden und 
empfangen:

uint8_t transmit[2] = {0x30, 0x00} // Channel 1 auslesen
uint8_t receive[2];

HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, transmit, receive, 2, HAL_MAX_DELAY);
HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET);

: Bearbeitet durch User
von K. H. (hegy)


Lesenswert?

Hast du einen Logic Analyzer? Damit kannst du checken, was tatsächlich 
auf dem SPI los ist, von Power-Up bis zu HAL_SPI_TransmitReceive(). 
Sowas ist sehr aufschlussreich.

K. A. ob das Teil was taugt: https://www.ebay.de/itm/162891933380

von Klaus S. (skibby)


Lesenswert?

Hallo Tim,
ist der SPI richtig konfiguriert (Clock enabled, Pins richtig 
konfiguriert) ?
Kannst Du mal Deine Initialisierungssequenz des SPI zeigen ?

von Schaltplan Checker (Gast)


Lesenswert?

Tim K. schrieb:
> STM32.PNG

SPI2 angeschlossen aber SPI1 programmiert?

von foobar (Gast)


Lesenswert?

16MHz über Optokoppler?!?  Probier's mal mit 16KHz ...

von Schaltplan Checker (Gast)


Lesenswert?

foobar schrieb:
> 16MHz über Optokoppler?!?  Probier's mal mit 16KHz ...

Die 1nF-Kondensatoren an den SPI-Leitungen werden auch nicht
der möglichen Datenrate förderlich sein.

von Stefan F. (Gast)


Lesenswert?

Selbst wenn die Optokoppler das können, spätestens die 1 nF 
Kondensatoren verhindern jede vernünftige Signalübertragung bei dieser 
Frequenz. Wofür sind die überhaupt da?

von Tim K. (timkl94)


Lesenswert?

Die Schaltung habe ich von einem Kollegen.
Die Frequenz habe ich jetzt auf 10kHz reduziert und die Kondensatoren 
habe ich entfernt. Außerdem habe ich per SW einen Pullup bei der 
MISO-Leitung hinzugefügt.
Die Daten (0x0300), die ich rausschicke, um den Kanal 1 auszulesen, 
passen auch schon. Nur passt das Ergebnis, das ich auslese leider noch 
nicht.

von K. H. (hegy)


Lesenswert?

Tim K. schrieb:
> Außerdem habe ich per SW einen Pullup bei der
> MISO-Leitung hinzugefügt.

Bei der Pin-Konfiguration des STM32L031 hast du die internen Pull-ups 
aktiviert? Ich meine = bin mir nicht 100% sicher, wenn der Pin als 
Ausgang oder als Special Function (I2C, SPI, ...) konfiguriert ist, dann 
funktioniert das nicht so, wie du dir das erhoffst, weil die 
Pull-Ups/-Downs nur dann eine Rolle spielen, wenn der Pin als Eingang 
konfiguriert ist. Ist der Pin aber ein Ausgang, wird von der 
STM-internen HW der Pullup erst abgeklemmt und dann die 
Daten/Clock/whatever verschickt, d. h. du hast einen kurzen Moment, wo 
der Pull-Up/-Down nicht mehr mit dem Pin verbunden ist und damit kann es 
schief gehen. Deswegen, mit einem Oszi bzw. Logig-Analyzer kann man das 
sehen. Oder noch besser, lass den STM-internen Pull-Up/-Down weg und 
klemm extern einen an, dann bist du auf der sicheren Seite. Aber das mit 
den wie und was der internen Pull-Up/-Downs steht irgendwo im User 
Manual, Reference Manual oder Datasheet.

von Tim K. (timkl94)


Angehängte Dateien:

Lesenswert?

Ich habe den Pullup in den GPIO Settings in der SPI-Konfiguration 
aktiviert.

Die Signale nach den Optokopplern sehen noch nicht so richtig sauber 
aus. Die Flanken sind nicht steil genug.

Bei dem SPI_Modus (CPHA/CPOL) bin ich mir auch nicht sicher, ob dieser 
passt.

: Bearbeitet durch User
von K. H. (hegy)


Lesenswert?

Hast du einen Logic Analyzer oder ein Scope?
Das hilft enorm!

Und was sagt die Fachliteratur zu den internen Pull-updowns?

von Tim K. (timkl94)


Lesenswert?

Ich nutze ein Oszi.

Der MISO Eingangs-Pin ist HIGH, wenn ich den Pullup aktivere und LOW 
wenn nicht.

von Test (Gast)


Lesenswert?

Tim K. schrieb:
> Ich nutze ein Oszi.
>
> Der MISO Eingangs-Pin ist HIGH, wenn ich den Pullup aktivere und LOW
> wenn nicht.

Dann zeig doch mal einen Screenshot von einer Übertragung mit MISO MOSI 
SCK  und CS.

Die internen Pull-ups/Pulldowns sind nur aktiv wenn der Pin ein GPIO 
ist! Und wären für 16MHz viel viel zu hochohmig. Es hat schon seinen 
Grund, dass SPI-Ausgänge von jedem Hersteller als Push-Pull ausgeführt 
sind. Gerade wenn man solche Datenraten fahren will wie du ist eine 
solche Optokoppler-Schaltung nicht wirklich optimal.

10k Pullups und dann noch 1nF macht schon eine 3dB-grenzfrequenz von 
16kHz! Also von deinen 3,3V ist bei 16 kHz noch ca. 2V (3dB von 3,3V) 
da. Und das gilt für sinusförmige Signale. Die Frequenz mit der du 
rechnen musst ist die gewünschte Anstiegszeit für dein Signal (SCK 
steigende / fallende Flanke). Deine Flanken dürften ein völliger Brei 
sein. 1nF raus und 470 R für die Pullups. Und bitte ein Oszillogramm ...

von Stefan F. (Gast)


Lesenswert?

Tim K. schrieb:
> Der MISO Eingangs-Pin ist HIGH, wenn ich den Pullup aktivere und LOW
> wenn nicht.

Und welchen Pegel hat er während der Kommunikation? Tut sich da was, 
sind die Signalpegel gut und die Flanken steil genug? Sind die Pegel bei 
der Taktflanke* stabil?

*) Brauchst du die steigende oder die fallende Flanke?

von Tim K. (timkl94)


Angehängte Dateien:

Lesenswert?

Ich habe jetzt die 10k durch 470R ersetzt, den MISO mit einem externen 
Pullup (470R) versehen und die 1nF Kondensatoren rausgenommen.

von Stefan F. (Gast)


Lesenswert?

Sieht nicht sehr gut aus, warum kommt der nur auf knapp über 2V hoch, 
nicht auf 3,3V?

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Diese Optokoppler sind für diese Anwendung völlig ungeignet. Suche 
pinkompatible,schnellere. Am besten nimm so Isolations-IC wie z.B. 
ADUMxxxx, die gibt's in verschiedenen Geschwindigkeitsstufen.

Grüsse

von K. H. (hegy)


Lesenswert?

Tim K. schrieb:
> Die Frequenz habe ich jetzt auf 10kHz reduziert

Lt. Screenshot = erstes Scope-Bild sind da keine 10 kHz, sondern 
irgendwas um die 7,8 kHz. Das nur mal nebenbei. Oder das Scope misst 
ziemlich schief.

von Tim K. (timkl94)


Angehängte Dateien:

Lesenswert?

Stimmt ich hatte die Frequenz noch weiter reduziert. So sieht das Clock 
Signal mit einer Frequenz von 1,8 kHz, 10k Pullups und ohne die 
Kondensatoren aus.

von K. H. (hegy)


Lesenswert?

Sieht schon besser aus, immerhin 3,2 V Spitze. Aber schön ist was 
anderes, denn die steigende Flanke braucht ca. 40 µs um auf ca. 2,5 V zu 
kommen, damit würde theoretisch bei 12,5 kHz Clock der Spitzenwert auf 
2,5 V sacken, weil die OK nicht hinterher kommen. Ich gehe mal davon 
aus, dass dass der Output vom OK ist, oder?
Was machen wir da? Genau die OK rauswerfen und andere einpflanzen, so 
wie Gebhard R. schon geschrieben hat.
Gebhard R. schrieb:
> Diese Optokoppler sind für diese Anwendung völlig ungeignet.

Jetzt machen!

von Tim K. (timkl94)


Lesenswert?

Verstanden.

Kennt denn jemand einen OK in einem DIP4 Gehäuse, der 15kHz packt?

von K. H. (hegy)


Lesenswert?

So aus dem ff nicht. Vllt. nal bei den Distributoren wie Mouser, Farnell 
usw. kucken, also bis zu den OK durchklikken und dann über Parameter 
filtern, alternativ vllt. auch besser, bei den Herstellern nach 
Anwendungsfall filtern und dann den Rest. Oder mal guhgeln, wie, was 
andere so gebraucht haben.

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.