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
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
Hallo Tim, ist der SPI richtig konfiguriert (Clock enabled, Pins richtig konfiguriert) ? Kannst Du mal Deine Initialisierungssequenz des SPI zeigen ?
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.
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?
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.
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.
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
Hast du einen Logic Analyzer oder ein Scope? Das hilft enorm! Und was sagt die Fachliteratur zu den internen Pull-updowns?
Ich nutze ein Oszi. Der MISO Eingangs-Pin ist HIGH, wenn ich den Pullup aktivere und LOW wenn nicht.
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 ...
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?
Ich habe jetzt die 10k durch 470R ersetzt, den MISO mit einem externen Pullup (470R) versehen und die 1nF Kondensatoren rausgenommen.
Sieht nicht sehr gut aus, warum kommt der nur auf knapp über 2V hoch, nicht auf 3,3V?
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
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.
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.
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!
Verstanden. Kennt denn jemand einen OK in einem DIP4 Gehäuse, der 15kHz packt?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.