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
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
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.
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.
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.
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
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.