Forum: Mikrocontroller und Digitale Elektronik ADC mit SPI an STM32f4


von Christof K. (ckris)


Lesenswert?

Hallo,

ich habe hier einen 10bit ADC (TLC1549C) und möchte diesen via SPI mit 
meinem STM32f4 auslesen. Mit Cube ist der SPI3 auf "Recieve Only 
Master", 16bit Data Size konfiguriert worden. Einen GPIO habe ich an !CS 
vom ADC angeschlossen. Baudrate auf 1,4MBits/s. Der Takt wird 
ausgegeben.
Ehrich gesagt, weiss ich nicht, wie ich jetzt weiter vorgehen soll...?
Der ADC sendet ja 10bit, SPI empfängt 16bit. Wie empfange ich überhaupt?
Wann soll ich !CS auf low ziehen. Muß ich !CS überhaupt benutzen? Kann 
ich !CS auch über MOSI nutzen. Wenn ja, dann wie?

Könnte mir jemand weiter helfen.
Danke :)

Beste Grüße
Christof

von Won K. (Firma: Outside the Asylum) (the_sane)


Lesenswert?

Christof K. schrieb:
> Ehrich gesagt, weiss ich nicht, wie ich jetzt weiter vorgehen soll...?
> Der ADC sendet ja 10bit, SPI empfängt 16bit. Wie empfange ich überhaupt?

Datenblatt Fig.8

Christof K. schrieb:
> Muß ich !CS überhaupt benutzen?

Datenblatt Fig.11

von Christof K. (ckris)


Lesenswert?

Danke, aber das hilft mir nicht weiter.
Dass es prinzipiell bei diesem Adc möglich ist, keinen !CS zu benutzen 
(außer vor dem Clock), habe ich verstanden.
Ob das mit dem Hardware-Spi beim Stm32 möglich ist und wenn ja, dann 
wie, ist eher die Frage. Habe noch nie Spi benutzt. Das ist ein Buch mit 
sieben Siegeln für mich.

von Karl H. (kbuchegg)


Lesenswert?

Christof K. schrieb:

> Ehrich gesagt, weiss ich nicht, wie ich jetzt weiter vorgehen soll...?
> Der ADC sendet ja 10bit


Der ADC sendet überhaupt nicht. Zumindest nicht von sich aus.

Die Begriffe 'senden' und 'emfpangen' sind beim SPI etwas 
missverständlich. Ich vermeide sie deshalb.

SPI ist eher ein Byteaustausch. Damit ein Byte vom Slave zum Master 
kommen kann, muss der Master im Gegenzug 1 Byte zum Slave übertragen.

SPI funktionier also so, wie wenn du und dein Kumpel sich am Tisch 
gegenüber sitzen. Jeder hat ein Papier vor sich, auf dem er etwas 
aufschreiben kann. Auf das Kommando des Masters (du) hin nimmt jeder 
sein Papier mit der rechten Hand und schiebt es zum Gegenüber, der es 
mit der linken Hand entgegen nimmt. Keiner (oder alle beide) hat dabei 
dezidiert gesendet und keiner (oder aber alle beide) hat dabei dezidiert 
empfangen. Ihr habt die Zettel ausgetauscht. Ihr seid beide gleichzeitig 
Sender und Empfänger.

Der Master hat zu jedem Zeitpunkt die Befehlsgewalt. Wenn er keinen 
Datenaustausch initiiert, dann kann sich der Slave brausen gehen.

> SPI empfängt 16bit. Wie empfange ich überhaupt?

Indem du einen Transfer in die Wege leitest. Im Gegenzug zu deiner 
Übertragung zum Slave kommt vom Slave sein Ergebnis zu dir. Nachdem der 
Master also seinen 16 Bit Wert rausgeklopft hat, kann er sich das 
gleichzeitig vom Slave übertragene 16 Bit Ergebnis abholen.

> Wann soll ich !CS auf low ziehen.

Bevor du deine 16 Bit überträgst.
Und wenn der Datenaustausch fertig ist, lässt du CS wieder los.

> Muß ich !CS überhaupt benutzen?

Kommt auf den Slave drauf an.
Oft ist es so, dass das CS Signal so etwas wie einen 
Synchronisiermechanismus darstellt. D.h. das ist das Signal für den 
Slave: jetzt gehts los. Und zwar gehts jetzt definiert mit dem ersten 
Bit los.

Wenn deine SPI-Takte mal durcheinander geraten, bist du froh, wenn du 
mit dem CS die Sache wieder synchronisieren kannst.

> ich !CS auch über MOSI nutzen. Wenn ja, dann wie?

Nein.
Du hast 4 Leitungen
CS
MOSI
MISO
SCK

Da du einen STM benutzt. Es gibt einen schönen HAL Layer dafür. Es ist 
nicht verboten da mal reinzuschauen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Christof K. schrieb:

> Der ADC sendet ja 10bit, SPI empfängt 16bit.

Und nein.
Der Slave kann sich nicht wehren. Er hat nicht die Befehlsgewalt. Wenn 
der Master 16 Taktpulse anlegt, dann kommen vom Slave auch 16 Bit rein.
Von denen können nur 10 gültig (bzw, sinnvoll) sein, aber soviele 
Taktpulse wie der Master erzeugt, soviele Bits werden auch übertragen. 
In beiden Richtungen.

Was soll denn der Slave tun, wenn vom Master mehr Taktpulse kommen als 
er erwartet hat? Das Kabel durchschneiden?

Bei SPI ist der Slave tatsächlich ein Sklave im wahrsten Sinne des 
Wortes. Er hat keinerlei eigene Entscheidungsgewalt was die Übertragung 
anbelangt. Wenn der Master seinen Taktpuls generiert, dann ist die MISO 
Leitung entweder auf 0 oder auf 1. Etwas anders gibt es nicht. Eine der 
beiden Flanken (steigend oder fallend) des Taktpulses zählt. Zu diesem 
Zeitpunkt sieht sich der Master die MISO Leitung an, und wenn die zu 
diesem Zeitpunkt auf High ist, dann wird eben ein 1 Bit eingelesen; ist 
sie auf Low, dann wird ein 0 Bit eingelesen. Ganz einfach.

: Bearbeitet durch User
von Christof K. (ckris)


Angehängte Dateien:

Lesenswert?

Danke für Deine umfangreiche Erläuterung Karl Heinz.
Zu meinem Fall scheint Geschriebenes aber nicht zu passen.

Der TLC1549 "empfängt" ja nichts außer !CS und dem SCK. Ohne !CS zu 
benutzen, habe ich keine zuverlässige Kommunikation zustande bekommen.

Indem ich die SCK-Polarität auf High gestellt habe, konnte ich zwar 
werte empfangen. Diese waren aber um ein bit nach "rechts" verschoben 
und die kommunikation war sehr störanfällig. Auf dem Oszi sehe ich oft 
ein Flackern.(?) Überraschend war hier auch, dass sich in den 
Empfangspausen das SCK-Signal vom High-Zustand wie eine Kapazität 
entlädt (sie Bild - oberer Verlauf ist SCK, Unterer ist Output des ADC 
).

Mit SCK-Polarität auf Low kann ich auch nur zuverlässig empfangen, wenn 
ich !CS benutze.
Also !CS auf Low, dann "HAL_SPI_Receive_IT(&hspi4, empfang, 1)" und !CS 
in der SPI4-Interrupt routine wieder auf High.
Benutze ich !CS nicht, wird manchmal nicht Empfangen.
Wobei ich glaube, dass mir hier die Timer-Interrupts, die ich nebenbei 
benutze, in die Quere kommen. (Auch mit !CS-Nutzung - nur hier nicht so 
oft.)

So ganz glücklich bin ich mit der Messung bisher nicht...

Grüße
Christof

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Christof K. schrieb:
> Danke für Deine umfangreiche Erläuterung Karl Heinz.
> Zu meinem Fall scheint Geschriebenes aber nicht zu passen.

Es passt immer. Denn genau so funktioniert SPI

> Der TLC1549 "empfängt" ja nichts außer !CS und dem SCK.

er 'empfängt' selbstverständlich auch etwas. Aber er macht nichts damit.
Das ändert aber nichts daran, dass bei den meisten Master-SPI (ich kenne 
zumindest kein Gegenbeispiel) das takten des SCK dadurch veranlasst 
wird, dass an den Master senden lässt.

> Ohne !CS zu
> benutzen,

Du willst nicht 'ohne CS' fahren.
Nein, das willst du nicht.
Wo ist denn das Problem? Sag jetzt bitte nicht, dass dir das bisschen 
Pin auf High setzen bzw. Pin auf Low setzen Probleme macht.

> Indem ich die SCK-Polarität auf High gestellt habe

welche Polarität du brauchst steht, genauso wie die ANgabe welche Flanke 
gilt im Datenblatt. In deinem Fall im Datenblatt des ADC. Die beiden 
Angaben werden zum sog. SPI-Mode zusammengefasst.

> werte empfangen. Diese waren aber um ein bit nach "rechts" verschoben

wahrscheinlich warst du auf der falschen Flanke.

> und die kommunikation war sehr störanfällig.

Dann musst du was dagegen tun.
Mit dem STM32F4 hab ich keine Erfahrung. Nur mit dem STM32F7.

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.