Forum: Mikrocontroller und Digitale Elektronik STM32 Fehlererkennung beim SPI


von Martin P. (Gast)


Lesenswert?

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

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

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

von Martin P. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

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 :)

von Martin P. (Gast)


Lesenswert?

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

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

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

von Arne (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.