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