Hallo, ich habe drei STM32LV-Discovery-Boards. Diese möchte ich über SPI miteinander kommunizieren lassen. Dazu würde ich jetzt einmal ganz naiv jeweils SPI1 nutzen und die vier Anschlüsse (SCK, MISO, MOSI und NSS) direkt miteinander verbinden. Wenn ich nun ein Board als Master und die anderen beiden als Slave konfiguriere und die Auswahl des Slaves durch eine in die Frames gepackte ID realisiere, müsste das meiner Meinung nach funktionieren. Das Problem ist nur, dass ich eine funktionierende und robuste Software für Master und Slave nicht auf Anhieb programmieren kann, sondern mich durch Versuche langsam herantasten muss. Ich befürchte, dass Fehler auftreten können, die die Hardware beschädigen. Zwei Fehler fallen mir sofort ein: 1. Zwei Boards sind als Master konfiguriert. Damit habe ich auf drei Leitungen (SCK, MOSI und NSS) die Gefahr eines Kurzschlusses, da bei beiden Master-Boards die Anschlüsse als Ausgang geschaltet sind. 2. Die Auswahl des Slaves ist fehlerhaft und zwei Slaves wollen gleichzeitig über MISO senden. In diesem Fall liegen an der MISO-Leitung zwei Ausgänge an, die zu einem Kurzschluss führen könnten. Meine Frage lautet: Gibt es im STM32 eine hardwaremäßig Fehlererkennung, die die genannten Fehler erkennt und die Ausgänge vor einer Beschädigung schützt? Ist dies irgendwo nachvollziehbar dokumentiert? Im Reference Manual wird ein MODF-Bit beschrieben, welches bei einem bestimmten Fehler gesetzt wird. Ich werde aus der Beschreibung aber nicht wirklich schlau. Vielen Dank Martin
HI Martin, Zuerst einmal, solltest du die NSS von den beiden Slaves mit Pullups an GPIOs des Masters hängen. Dann brauchst du auch keine IDs oder nimm Can da geht das, wobei die VL haben kein CAN. Wenn du unbedingt die NSS der Slaves parallel schalten willst, empfehle ich Widerstände in jede Leitung einzubauen, dann geht nix kaput, aber dann wird der Bus nicht so schnell gehen weil du dir die Flanken verschleifst, aber das sollte dich zum testen wenig interessieren. Was die Hardwarefehlererkennung angeht, hat der STM32 meines Wissens keine Vorkehrungen intern um Verdrahtungsfehler oder Kurzschlüsse zu erkennen. Jedes Board mit 100Ohm in jeder Leitung die weg geht entkoppeln und das Problem ist gelößt. MfG Tec
Danke Tec, das mit den Widerständen in Serie hatte ich auch schon probiert. Würde aber lieber größere Widerstandswerte wählen. Bei 2 x 100 Ohm in einer Leitung würden bei einem Kurzschluss theoretisch ja immer noch 3,3 V / (2 x 100 Ohm) = 16,5 mA fließen. Im Datenblatt steht für normale I/O-Pins etwas von max. 25 mA, für die Pins von SPI1 max. 5 mA. Wobei sich das fast so liest als wenn die Hardware bei SPI1 den Strom alleine auf 5 mA begrenzt. Das wäre dann ja im Prinzip zumindest für SPI1 ein eingebauter Schutz. Naja vielleicht übersetz ich das auch falsch: "... IINJ(PIN) must never be exceeded. This is implicitly insured if VIN maximum is respected. If VIN maximum cannot be respected, the injection current must be limited externally to the IINJ(PIN) value. A positive injection is induced by VIN>VDD while a negative injection is induced by VIN<VSS. ..." Nichts desto trotz würde ich gern größere Widerstandswerte wählen. Mit dem Oszi konnte ich beobachten, wie die Flanken mit größer werdendem Widerstandswert immer flacher werden. Würde mal vermuten, dass man für eine sichere Übertragung spätestens ab 1 kOhm die Geschwindigkeit reduzieren muss. Schaltet man allerdings einen Kondensator (1 nF) parallel zum Widerstand (siehe Screenshot im Anhang), bekommt man selbst bei 4,7 kOhm noch steile Flanken und eine fehlerfreie Übertragung. Diese Beschaltung schütz sogar vor Überspannungen jeglicher Art. Habe als Versuch mal auf einer Seite ein Board entfernt und an einem der freien Anschlüsse 24 Volt angelegt. Auf der anderen Seite wurde die Spannung durch die internen Dioden auf 3,6 V begrenzt. Der max. Strom der hier fließen kann ist in diesem Fall nur (24 V – 3,6 V) / (2 x 4,7 kOhm) = 2,2 mA. Jetzt meine Frage: Habe ich bei der Beschaltung (siehe Anhang) ein größeres Problem übersehen, oder ist es tatsächlich so einfach? bis dann Martin
Hi Martin, du musst dabei beachten das du Strom spitzen hast weil der Pin den Kondensatoren um laden muss, warum nimmst du nicht 74HCT Treiber als Puffer wenn ein fehler auftritt geht einer der 74HCT kaput, das wird oft bei Programmieradaptern gemacht. Als Sollbruchstelle. Den Abschnitt den du da kopiert hast sagt das du beim Einspeisen von Strom in den Pin die Stromwerte nicht überschreiten darfst da sonst die internen Schutzdioden kaputt gehen. Diese Dioden hat aber jeder Port pin. Deshalb ist der Widerstand wichtig mit dem Widerstand kannst du auch +24 Volt dran an legen ohne das was kaputt geht weil die Dioden das ableiten aber due ziehst die damit das VDD-Potenzial hoch -> nicht machen :) Also die Kondensatoren so klein wie möglich, oder Takt runter oder Buffer IC da zwischen. Oder was mir noch einfällt sind ShotkyDioden in den Daten-Leitungen. Also MISO z.b. mit Pullup hoch ziehen und Dioden mit Flussrichtung zum Pin hin, damit der Controller den runter ziehen kann und bei MOSI ist ja egal der ist ja Input. Ob das funzt kann ich nicht sagen ein Kumpel hat das mal sobei RS232 gemacht, da hatte er mehrere "Slaves" an einem Master ohne irgend einen CS, du hast so aber keinerlei Collisionserkennung. Wenn du Spass haben willst kannste den Pegel der Leitung hinter der Diode auf n Input legen und gucken ob dir der Bus folgt, das ist das Carrier Sense, und du kannst auf aktivität auf dem Bus gucken. So ähnlich läuft das bei CAN oder ETHERNET. Wenn du das in SW machst geht das auch mit den Internen Pulldowns also Line mit 10k Pullup an pin und Signal mit Pulldown einprägen. Das sind so Standard Bus Verfahren. MfG Tec PS: ich hoffe du bist jetzt nicht verwirter als vorher :)
Danke nochmal für die ausführliche Antwort! > du musst dabei beachten das du Strom spitzen hast weil der Pin den > Kondensatoren um laden muss… Diese Befürchtung hatte ich zunächst auch. Bin jetzt aber der Meinung, bei einer solchen Beschaltung können keine höheren Stromspitzen auftreten, als bei der „ungeschützten“ direkten Verbindung ohne Widerstände und Kondensatoren. Hab das ganze mal mit Target 3001 simuliert. Bin also davon ausgegangen, dass der Eingang sich wie ein Kondensator mit geringer Kapazität (einige pF) verhält, der durch den Ausgang am anderen Board ständig aufgeladen und entladen werden muss. Verbinde ich Ausgang und Eingang direkt kann der benötigte Strom ungehindert fließen. Es gibt relativ hohe Stromspitzen und steile Flanken. Setze ich einen zusätzlichen Widerstand in die Leitung dauert das Auf/Entladen länger, die Flanken werden flacher und die Stromspitzen geringer. Schalte ich jetzt einen Kondensator parallel zum Widerstand verringert sich der Widerstand für hohe Frequenzen und das Auf/Entladen geht wieder schneller, die flanken werden steile und die Stromspitzen größer. Solange keine Schwingungen entstehen werden die Stromspitzen aber nie größer als bei der direkten Verbindung. Hab außerdem den Strom des gesamten Boards bei einer kontinuierlichen SPI-Übertragung gemessen. Konnte dabei keinen erhöhten Stromverbrauch messen. Falls es also tatsächlich irgendwo hohe Stromspitzen gibt, erhöhen diese die gesamte Verlustleistung nur sehr gering und führen deshalb wahrscheinlich auch zu keiner thermischen Belastung. Da ich Stromspitzen auf dem Oszilloskop nicht sehe und mich meine beschränkte Vorstellungskraft bei solchen Dingen nicht wirklich weiter bringt, würde ich mich freuen, wenn mir jemand zustimmen oder widersprechen könnte. > Deshalb ist der Widerstand wichtig mit dem Widerstand kannst du > auch +24 Volt dran an legen ohne das was kaputt geht weil die Dioden das > ableiten aber du ziehst dir damit das VDD-Potenzial hoch -> nicht > machen :) Das ist wirklich Mist. War mir nicht bewusst. Habe das mal ausprobiert. Wenn die Summe der Ströme die über die internen Dioden nach VDD fließen größer ist, als der aktuelle Laststrom des Spannungsreglers steigt VDD sehr schnell an. Hätte eigentlich vermutet, dass ein Spannungsregler einen „negativen Lastrom“ also einen Strom der in den Spannungsregler hinein fließen würde, intern verheißen kann. Bei den Spannungsreglern, die ich hier habe ist das aber nicht so. Wenn man sich den internen Aufbau im Datenblatt anschaut ist das auch klar. Gibt es Spannungsregler, die auch bei einem dauerhaft negativen Laststrom die Spannung halten können? Vielen Dank nochmal! Martin
Martin P. schrieb: > Gibt es Spannungsregler, die auch bei einem dauerhaft negativen > Laststrom die Spannung halten können? Hi Martin, deshalb hast du über einem 7805 z.b. immer eine Diode von Ausgang zum Eingang um diese Ströme abzuleiten den Aufbau des Reglers in dem STM32 kenne ich aber nicht. Deshalb kann ich dir nicht sagen wie der reagiert. Was den Widerstand und den Kondi angeht. Hätte ich das nicht vermutet das die Stromspitzen bei der Schaltung geringer sind als ohne. Das mag vllt am Innenwiderstand der 1n Kondensatoren liegen, aber das ist nur Spekulation. Ich kenne die Simulation von Target jetzt nicht, ich nehm da immer LT Spice, aber das einfachste wäre jetzt noch einen Widerstand parallel zum Portpin gegen Masse dann hast du einen Spannungsteiler für NF, also ka 24V DC am Pin aber für HF einen niederohmigen Eingang. Wenn du sagen wir mal 1k am Pin und 5k zu den anderen Busteilnehmern hast dann solltest du auch nicht Gefahr laufen. Das die Dioden an den Eingängen dauerhaft zu viel Saft abbekommen. MfG Tec
Und wenn Du ein /CS eines Slaves invertierst? Machen wir so mit EEPROM und Flash an einem SPI Kanal, weil uns die Portpins ausgegangen sind.
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.