Guten Abend, ich habe momentan irgendwie mit SPI zu kämpfen und habe keinen Ansatz wo ich weitersuchen soll. Ich arbeite gerade an einem BMS mit einem LTC6813. Den IC hatte ich zunächst erfolgreich mit einem AT90CAN per SPI angesteuert. Das ging soweit ohne Probleme. Jetzt hatte ich mich aber doch dazu entschlossen auf einen STM32F429 umzusteigen und da will das irgendwie nicht klappen. Ich sende mit beiden Controllern die gleichen Nachrichten. Auf die Nachricht vom AT90CAN reagiert der IC entsprechend. Auf die Nachricht vom STM32F4 reagiert er nicht. SOFTWARE: ST: Software und Einstellung der SPI schnittstelle über "CubeMX" könnt ihr folgenden Bildern entnehmen: - Buffer.PNG - Code_STM.PNG - ST_SPI_Setting.PNG => Ich habe einmal die Datenrate vom Bild probiert und einmal was um di 165 kbits. (Beim At90CAN sind es 125kBits) Beim dem HAL befehlen für SPI bin ich mir aber nicht 100% sicher worfür der letzte Parameter ist. In dem Manual zur API wird es als "timeout duration" bezeichnet. Damit ist glaube nur gemeint nach welcher Zeit er das Senden abbrechen soll, auch wenn noch nicht alle Daten gesendet wurden oder? Ich hab da ein bisschen rumgespielt und es hat sich beim Oszillogramm nix getan. AT90CAN: Senden/Initialisieren könnt ihr folgenden Bildern entnehmen: - AT90CAN_SPI_INIT.PNG - AT90CAN_Senden.PNG Ich sende in beiden Fällen also das gleiche. Ich bin mir nur nicht sicher wofür bei dem HAL befehl beim ST die Zeitangabe sein soll (letzter Parameter). HARDWARE: Falsch angeschlossen ist ausgeschlossen. Da ich das Oszi nach dem IC angeschlossen habe. Wenn ich da irgendwas verpinnt hätte würde ich nicht auf jeder Leitung (außer MISO bei ST) ein passendes Signal haben. Damit sind auch alle Verbindungen gescheit verbunden. Auf den beiden Eval Boards vom STM32 um AT90CAN werden die SPI Leitungen einfach nur nach draußen geführt, ohne irgendwelche PullUps oder Kapazitäten oder sonstiges. Bis auf die uC auf den jeweiligen Boards gibt es also im Aufbau keinen Unterschied was die SPI Komponenten angeht. ACHTUNG! Es handelt sich um einen fliegenden Aufbau! Ich habe keine Leitung irgendwie abgeschlossen oder auf Treibeimpedanz, Leitungswellenwiderstand oder Abschlusswiderstand geachtet. (Komme ich später nochmal drauf). Nucleo STM Schaltplan: https://www.st.com/content/ccc/resource/technical/document/user_manual/group0/26/49/90/2e/33/0d/4a/da/DM00244518/files/DM00244518.pdf/jcr:content/translations/en.DM00244518.pdf ab Seite 73. At90CAn Olimex Schaltplan: https://www.olimex.com/Products/AVR/Development/AVR-CAN/resources/AVR-CAN-schematic.pdf Der Schaltplan vom LTC6813 Eval https://www.analog.com/media/en/technical-documentation/eval-board-schematic/DC2350A-4-SCH.PDF Wie in der Anleitung auf Seite 3 gefordert habe ich einen Pullup Resistor an Stelle R8 eingelötet. Allerdings hatte ich nur einen 2 k ohm hat beim At90 Can ja auch funktioniert. https://www.analog.com/media/en/dsp-documentation/evaluation-kit-manuals/DC2350AF.PDF OSZI-BILDER: Dann hab ich mal das Oszi angeworfen und gemessen was am IC ankommt. Ich kann immer nur die aktuelle Bildschirmansicht speichern. Wenn ihr irgendwas genauer braucht sagt Bescheid dann nehme ich euch das nochmal auf! Beim AT90CAN siehe: F0001TEK.TIF F0002TEK.TIF Beim STM32F4: F0004TEK.JPG F0005TEK.JPG Das sieht für mich erstmal so aus als würde die gleiche Nachricht gesendet. Der STM32F4 hat aber nur einen 3,3V Pegel. Das ist aber eigentlich egal weil der LTC6813 alles unter 0,8V als Low und alles über 2,3V als high ansieht. Siehe SPI_LTC6813.PNG Dann hat mich jemand darauf hingewiesen das ich mal gucken soll wie das mit den Reflexionen auf den Leitungen aussieht. Ich habe sowohl beim At90Can als auch beim STM32F4 Überschwinger auf der SCK Leitung, da ich diese nicht abgeschlossen habe. Beim At90CAN sogar bis 6,5V also 1,5V Überschwinger. Beim STM32 sind es 2V Überschwinger also bis 5,3 V. Er bleibt aber jeweils nach und vor der Anstiegsflanke immer in dem Bereich den der IC als High und low erkennt. Über 2,3 oder unter 0,8V. Die Frage ist auch ob die Überschwinger auf der SCK Leitung überhaupt so schlimm sind. Eigentlich sind doch nur die Flanken wichtig damit jeder weiß wann er das Signal setzen soll und was es eingesammelt werden soll. Trotzdem bin ich sehr an geeigneter Literatur interessiert! Ehrlich gesagt wüsste ich nicht wie ich die Leitungen gescheit abschließen soll oder wie man solche Signalleitungen generell zu beschalten sind bzw. wie diese Bauelemente auszulegen sind. Ich weiß wie und warum es Reflexionen gibt aber ich wüsste nicht wie ich z.B. auf die Eingangsimpedanz der SPI Anschlüsse kommen soll. Finde dazu auch nix im Datenblatt. Was ich auch sehr eigenartig fand war das im Datenblatt eigenlich eine trise/fall zeit von 3,5ns für das SCK Signal angegeben wird. Wenn ich aber messe bin ich bei 25ns oder so. Das wird ja auch noch ein wenig durch das Oszi beeinflusst. Ich hab es aber extra auf x10 gestellt. Da ist man dann bei 18pF. Ich hoffe wirklich das mir jemand helfen kann !!!!! Vielen Dank schick ich schon voraus ! Ich hoffe ich habe nichts vergessen. Wenn euch Infos fehlen gebt mir bescheid! Mirco
Hallo Mirco, der erste Verdächtige bei so etwas sind immer die CPOL/CPHA-Settings. Bei den 200kHz, mit denen du klapperst, sollte ein nicht völlig abartig gerouteter SPI-Bus nicht zu elektrischen Problemen führen.
Quelltext kann man am besten lesen, wenn man ihn als *.c postet und nicht als png.
Mirco G. schrieb: > Die Frage ist auch ob die Überschwinger auf der SCK Leitung überhaupt so > schlimm sind. Da besonders, der Slave kann sich verzählen. Wichtig ist eine gute GND-Verbindung, da kann man ruhig stärkeren Draht nehmen und so kurz wie möglich. Gegen Überschwinger helfen 100R Serienwiderstände direkt am Sender.
Moin, man kann nicht sehen, was du wirklich machst. In F0004TEK.jpg wird 0x0004 0x07C2 gesendet. Also ein RDCVA. Hast du vorher eine Wandlung gemacht? Oder sendest du dieses Kommando direkt nach dem Wecken? Wenn keine Wandlung erfolgt ist, oder das Register gelöscht (CLRCELL) wurde, enthällt es 0xFFFF 0xFFFF 0xFFFF. Nur die PEC müsste ungleich 0xFFFF sein, aber die liesst du nicht ein. Dein Transfer ist also zu kurz. Denn 6 Byte Register + 2byte PEC sind eben 8 und nicht 6. Und was soll diese umgeschalte zwischen Senden und Empfangen? Die SPI muss so oder so die 12 byte rausschieben. Mach doch einen 12byte Vollduplextransfer.
Was ich oben vergessen habe zu betonen: In Bild 0001 sendest du offenbar ein 0x0012 == RDSTATB. In Bild 0004 sendest du aber ein 0x0004 == RDCVA. Das ist nicht das gleiche Kommando. Wenn du nichts anderes tust, als nur ein RDCVA zu senden, und dabei nie die PEC liest, dann darf MISO niemals etwas anderes als high zeigen. So gesehen, scheint mir an Bild 0005 nichts auszusetzen zu sein. Ein absolut erwarteter Transfer. Lies doch mal die PEC mit ein, also einen korrekten und kompletten Register Lese Transfer. Oder lese Config Register B anstatt Cell Voltage Register A. Im Config Register B sollten die letzen 4 bytes immer 0 sein.
Max G. schrieb: > der erste Verdächtige bei so etwas sind immer die CPOL/CPHA-Settings. die passen aber. Die Einstellung bei CubeMx seht ihr ja oben auf dem Foto. Erste Flanke ist fallend. Also SCK bei nicht betätigung High. Und gesammelt wird auf der zweiten Flanke. So ist es beim At90Can ja auch da die beiden Bits 1 sind. Ich hab euch den ausschnitt aus dem Datenbaltt angehängt. Max G. schrieb: > Bei den 200kHz, mit denen du klapperst, sollte ein nicht völlig abartig > gerouteter SPI-Bus nicht zu elektrischen Problemen führen. Dazu hab ich mich jetzt nochmal schlau gemacht. Das hängt ja nicht mit der Taktrate sondern mit der steilheit der Schaltflanke zusammen. Also ob ich z.B. reflexionen bekomme. Hier hab ich zu dem Thema was gutes gefunden: https://www.google.com/url?q=https://homepages.thm.de/~hg7313/lehre/avt/skript/avt_hightechspeed_bg_kap2.pdf&sa=U&ved=2ahUKEwj14sD-87vjAhVHZVAKHU89DQ4QFjAAegQICBAB&usg=AOvVaw354T9S4hcUpXuoJObx5IaI Bei meinem Controller kann man diese Flankensteilheit einstellen. Ich hab die jetzt mal auf das langsamste gestellt und messe mit meinem Oszi einen tfall time von ca. 10ns. Da die Zeit aufgrund der Kapazität vom Messkopf ja länger wird teile ich den sicherheitshalber durch 2. Das dann mal 5 = 25cm kritische Leitungslänge. Ich werde die Leitungen jetzt einfach so kurz wie irgendwie möglich machen und direkt verlöten. Dann sollte ich Reflexionen als Fehlerquelle auch ausschließen können. Peter D. schrieb: > Quelltext kann man am besten lesen, wenn man ihn als *.c postet und > nicht als png. Sry. Mach ich beim nächsten mal anders. Peter D. schrieb: > Da besonders, der Slave kann sich verzählen. > Wichtig ist eine gute GND-Verbindung, da kann man ruhig stärkeren Draht > nehmen und so kurz wie möglich. Ok. Ich kürze gleich die Leitungen nochmal und dann versuche ich es nochmal. Warum genau die 100 Ohm? Hatte n bisschen was darüber gelesen aber die Serienterminierung hab ich irgendwie nicht verstanden :D. Darth Moan schrieb: > man kann nicht sehen, was du wirklich machst. In F0004TEK.jpg > wird 0x0004 0x07C2 gesendet. Also ein RDCVA. Hast du vorher eine > Wandlung gemacht? Genau. 0x0004 ist der Befehl 0x07C2 ist der entsprechende PEC. Darth Moan schrieb: > Wenn keine Wandlung erfolgt ist, oder das Register gelöscht > (CLRCELL) wurde, enthällt es 0xFFFF 0xFFFF 0xFFFF. Nur die PEC müsste > ungleich 0xFFFF sein, aber die liesst du nicht ein. Dein Transfer ist > also zu kurz. Denn 6 Byte Register + 2byte PEC sind eben 8 und nicht 6. Das Stimmt natürlich. Ich Dummkopf hatte im AT90can controller in der While Schleife einmal Zellspannungen lesen. Den Befehl hat er dann natürlich gesendet bis ich ihn Debugt habe. Da ich den IC dann zwischen dem Durchlauf vorm Debugen und dem Lesen Aufruf beim Debuggen nicht vom Strom getrennt habe wurde der Wert dann gespeichert. Vielen Dank! War ziemlich dumm von mir! Darth Moan schrieb: > Oder sendest du dieses Kommando direkt nach > dem Wecken? Das Commando ist das Wecken. SS muss ja dafür nur auf low gezogen werden oder es muss sich was auf der SCK tun. Mein Problem ist jetzt nur erstmal nur noch das ich diesen Timeout duration parameter nicht ganz verstehe. Das ist doch nur die Zeit nach der der uC die Kommunikation abbrechen soll wenn er die Flag nicht bekommt oder? Damit er sich nicht aufhängt. Wenn ich beim Empfangen 1ms nehme wird der PEC abgeschnitten bei 2ms nicht. Das Mosi Signal dauert aber nur 800µs. VIELEN DANK FÜR EURE BEITRÄGE !!!!!!
Ich habe meinen Aufbau jetzt nochmal neu mit kürzeren Leitungen aufgebaut. SPI funktioniert auch soweit. Ich habe mir die Signale nochmal angeschaut. Irgendwie habe ich noch Schwingungen auf den Leitungen. Ich habe aber keine Ahnung wo die so wirklich herkommen. Es wäre auch mal interessant zu wissen welche Schwingungen bzw. Störungen akzeptabel sind. Dafür habe ich noch kein wirkliches Gefühl. Hab ich auch noch nie was zu gelesen. Die Kanäle vom Oszi sind (Von oben nach unten): SS SCK MOSI MISO Soll ich das einfach so lassen? Ab welchem Wert ist es nicht akzeptabel? Was vermutet ihr wo die Störung herkommt? Vielen vielen Dank für eure Beiträge
Beitrag #5912992 wurde von einem Moderator gelöscht.
Beitrag #5913003 wurde von einem Moderator gelöscht.
Mirco G. schrieb: > Ich habe mir die Signale nochmal angeschaut. Irgendwie habe ich noch > Schwingungen auf den Leitungen. Für mich sehen die normal aus. > Ich habe aber keine Ahnung wo die so wirklich herkommen. Jede Leitung schwingt. So etwas kann man mit Abschlusswiderständen passend zum Wellenwiderstand der Leitung reduzieren. > Es wäre auch mal interessant zu wissen welche Schwingungen bzw. > Störungen akzeptabel sind. Die Signale müssen eindeutig High oder Low sein, was bei Dir der Fall ist. Wenn die Schwingung so stark ist, dass das Signal in die Grauzone zwischen High und Low kommt, wird es kritisch. Die Grenzen sind bei jedem IC anders, musst du im Datenblatt nachschauen. > Soll ich das einfach so lassen? Ja
Beitrag #5913032 wurde von einem Moderator gelöscht.
Beitrag #5913105 wurde von einem Moderator gelöscht.
Woraus ergibt sich welche Risetime ich z.B. auf der SCK Leitung brauche? Ergibt sich das aus den SPI Timing Anforderungen vom LTC6813? (Ich hab euch das aus dem Datenblatt ausgeschnitten s. Anhang). Muss ich da einfach nur schauen das ich insgesamt die 1µs für die SCK Leitung einhalte? Stefanus F. schrieb: > Die Signale müssen eindeutig High oder Low sein, was bei Dir der Fall > ist. Wenn die Schwingung so stark ist, dass das Signal in die Grauzone > zwischen High und Low kommt, wird es kritisch. Die Grenzen sind bei > jedem IC anders, musst du im Datenblatt nachschauen. Ok :). Stefanus F. schrieb: > Jede Leitung schwingt. So etwas kann man mit Abschlusswiderständen > passend zum Wellenwiderstand der Leitung reduzieren. Ok. Auch wenn es jetzt funktioniert bin ich neugierig geworden und hab einige Fragen zum Schaltplan. Mich verwundert es das es auf dem Eval Board für den LTC6813 keine Möglichkeit gibt entsprechende Abschlusswiderstände einzufügen. Vor allem bei einem Eval Board kann man ja nicht immer davon ausgehen das man unter der kritischen Leitungslänge liegt. Hier nochmal der Schaltplan https://www.analog.com/media/en/technical-documentation/eval-board-schematic/DC2350A-4-SCH.PDF Auf dem Bild hab ich euch die entsprechenden Leitungen eingefärbt und den IC U1 nochmal an SCK und CS gezeichnet. 1. Frage wofür sind die 100 ohm Widerstände? Mit der Terminierung können die ja eigentlich nix zu tun haben da an der Load (siehe Terminierung.png) nicht in Serie terminiert wird oder? 2. Wenn ich terminieren müsste würde ich jetzt einfach möglichst nah am LTC6813 nach GND einen Abschlusswiderstand einlöten. Damit ich eine unendlich lange Leitung vortäusche. 2a. Wie dimensioniere ich den dann aber? Ich kenne ja weder die genaue Impedanz vom STM32, vom Kabel oder vom LTC6813. Ich konnte im Datenblatt nix finden. Die müssen ja aber alle gleich groß sein damit die Leitung vernünftig abgeschlossen ist. 3. Warum gibt es an der SCK und SS Leitung keinen PullUp Widerstand? Auch auf dem Eval vom STM32 konnte ich keinen finden. (Den Nucleo Schaltplan finden ihr im ersten Beitrag). Auch bei Cube Mx habe ich keinen eingestellt. Ich bin wirklich sehr an Literatur zu dem Thema interessiert. Ehrlich gesagt weiß ich nicht genau wonach ich googlen soll. Ich finde zum Thema Dimensionierung der Bauelemente und Timing Anforderungen für Datenkommunikationen/Signalen nichts. Muss auch nicht speziell für SPI sein. VIELEN VIELEN DANK FÜR EURE BEITRÄGE! IHR SEID DIE BESTEN! Mirco
Mirco G. schrieb: > Ab welchem Wert ist es nicht akzeptabel? Wichtig wäre zu sehen, wie die Daten zur steigenden Flanke des Clocksignals (gezoomt) aussehen. Achtung: Vorwiderstand und Abschlusswiderstand müssen für MOSI und MISO richtigen Ende installiert werden. Es sollte durch die Maßnahmen zu keinen größeren Verschiebungen zwischen den Clock und den Daten kommen. Das richtige Timing läßt sich am besten mit einem Augenmusterdiagramm feststellen. https://de.m.wikipedia.org/wiki/Augendiagramm Die steigende Flanke des Clocksignals sollte möglichst weit vom linken und rechten Rand der Augen entfernt sein.
Mirco G. schrieb: > Woraus ergibt sich welche Risetime ich z.B. auf der SCK Leitung brauche? Wenn das Signal langsamer ansteigt, als die Rise Time des angesprochenen Empfängers, dann erkennt er das Signal nicht mehr sauber. Bei Taktleitungen kann das bewirken, dass dann mehrere Takte erkannt werden, wo es nur einer hätte sein sollen. Je stärker der Ausgang der Signalquelle ist, umso steiler sind die Flanken - aber umso stärker auch die Emission von Radiowellen. Bei viele Mikrocontrollern kannst du die Zeit, Frequenz oder Stärke der Ausgänge konfigurieren. Lange Leitungen belasten das Signal und verschlechtern die Anstiegszeit. Zur Not kann man die Flankensteilheit mit Schmitt-Triggern verbessern, aber sie verzögern das Signal. Geht also nicht bei sehr hohen Frequenzen. > Mich verwundert es das es auf dem Eval Board für den LTC6813 keine > Möglichkeit gibt entsprechende Abschlusswiderstände einzufügen. Sie müssen zur Leitung passen, daher kann der Board-Hersteller ohnehin keine passende Standard-Bestückung liefern. Bedenke auch, dass Eval Boards nicht als eierlegende Wollmilchsau für industrielle Aufbauten gedacht sind, sondern zum Experimentieren. Das braucht man keine Widerstände, wie du gesehen hast. > Frage wofür sind die 100 ohm Widerstände? Je nach Leitungslänge und Position können sie durchaus der Terminierung dienen. > Wie dimensioniere ich den dann aber? Wenn Dir die technischen Daten zum Berechnen fehlen, dann durch ausprobieren und Messen der Resultates an realen Aufbauten. Wahrscheinlich wirst du auf Werte zwischen 50 und 120 Ohm kommen. > Warum gibt es an der SCK und SS Leitung keinen PullUp Widerstand? Warum hat einen Henkel zum Wegwerfen ans Board gemacht? Wohl weil der Entwickler es nicht für nötig hielt. Gegenfrage: Glaubst du, es sei nötig? Wenn ja, warum?
GEKU schrieb: > Wichtig wäre zu sehen, wie die Daten zur steigenden Flanke des > Clocksignals (gezoomt) aussehen. Im 3. Beitrag von mir siehst du das im Bild: IMG_3877_1_.JPG . Aber das hat sich ja mehr oder weniger geklärt für den Fall jetzt. Ich meinte das ja eher allgemein. GEKU schrieb: > Vorwiderstand und Abschlusswiderstand müssen für MOSI und > MISO richtigen Ende installiert werden. Das ist mir klar :). GEKU schrieb: > Das richtige Timing läßt sich am besten mit einem Augenmusterdiagramm > feststellen. > > https://de.m.wikipedia.org/wiki/Augendiagramm > > Die steigende Flanke des Clocksignals sollte möglichst weit vom linken > und rechten Rand der Augen entfernt sein. Allein mit dem Beitrag von Wikipedia verstehe ich das gerade nicht ganz. Aber ich lese mich da dann nochmal weiter ein :). Danke! Stefanus F. schrieb: > Wenn das Signal langsamer ansteigt, als die Rise Time des angesprochenen > Empfängers, dann erkennt er das Signal nicht mehr sauber. Bei > Taktleitungen kann das bewirken, dass dann mehrere Takte erkannt werden, > wo es nur einer hätte sein sollen. Da kann ich Dir nicht folgen. Nehmen wir als Beispiel das SCK Signal. Du meinst wenn die Rise Time von dem Signal des µC langsamer ist als die "mindest Risetime" vom Empfänger IC? Eine solche "mindest Steilheit" der Flanke wird beim LTC6813 z.B. nicht gefordert. Oder ich habe dich falsch verstanden. Stefanus F. schrieb: > Je stärker der Ausgang der Signalquelle ist, umso steiler sind die > Flanken - aber umso stärker auch die Emission von Radiowellen. Bei viele > Mikrocontrollern kannst du die Zeit, Frequenz oder Stärke der Ausgänge > konfigurieren. Genau das hab ich beim STM32 ja jetzt gemacht. Damit ich eine möglichst Lange kritische Leitungslänge habe und damit keine Reflektionen bekommen. Stefanus F. schrieb: > Sie müssen zur Leitung passen, daher kann der Board-Hersteller ohnehin > keine passende Standard-Bestückung liefern. Bedenke auch, dass Eval > Boards nicht als eierlegende Wollmilchsau für industrielle Aufbauten > gedacht sind, sondern zum Experimentieren. Das braucht man keine > Widerstände, wie du gesehen hast. Ich meinte auch nur das es entsprechende Lötpads gibt um passende Widerstände einzulöten. Nicht das die schon vorher bestückt sind. Stefanus F. schrieb: > Wohl weil der Entwickler es nicht für nötig hielt. Gegenfrage: Glaubst > du, es sei nötig? Wenn ja, warum? Weil ich es bisher so kenne das man fast immer einen Pullup oder Pulldown Widerstand braucht damit man einen definierten Pegel am Ausgang hat. Aber ich bin ja auch ein blutiger Anfänger. Deswegen habe ich gefragt. Vielen Dank!
Mirco G. schrieb: > Da kann ich Dir nicht folgen. Nehmen wir als Beispiel das SCK Signal. Du > meinst wenn die Rise Time von dem Signal des µC langsamer ist als die > "mindest Risetime" vom Empfänger IC? Ja > Eine solche "mindest Steilheit" der > Flanke wird beim LTC6813 z.B. nicht gefordert. Oder ich habe dich falsch > verstanden. Das kann gut sein. Nicht jedes IC fordert eine bestimmte Steilheit.
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.