I2C hängt sich auf, wie reset?

OP #4765666
Lesenswert?

Hi,

Ich lese auf einem STM32F4 über die I2C Schnittstelle einen Sensor aus. 
Da in der nähe ein BLDC Motor läuft, kann das Störimpulse auf SDA/SCL 
geben und der I2C hängt sich auf, aber nur wenn ich den DMA benütze. 
Erst nach aktivieren des reset buttons auf dem STM32 funktioniert das 
ganze wieder. Ohne DMA kann ich den SCL bzw. SDA Pin ziehen und beim 
wieder einstecken läuft alles ohne Probleme weiter (wird durch wieder 
neu Initialisierung gestartet).

Wie genau kann ich den DMA reseten? Wenn ich den DMA einfach neu 
initialisiere, scheint dies nicht die Lösung zu sein.
Gast #4765725
Lesenswert?

Sebastian T. schrieb:
> Ohne DMA kann ich den SCL bzw. SDA Pin ziehen und beim
> wieder einstecken läuft alles ohne Probleme weiter (wird durch wieder
> neu Initialisierung gestartet).

Was meinst Du damit?

Innerhalb des Masters wird es ja wohl keinen Absturz geben(*). Er liest 
höchstens ein falsches Datum ein oder läuft in eine Fehlerbehandlung. 
Wenn der I2C abstürzt, dann ist es im Slave und Du must den Resetten, 
z.B.
 - durch Ausschalten (Versorgungsspannung)
 - durch einen Reset-Pin (falls er einen hat)
 - Durch soviele Clockimpulse, bis er fertig ist.

Danach kannst Du I2C und DMA wieder aufsetzen.


*) Ich hoffe, Du reagierst angemessen auf die üblichen Fehler, wie z.B. 
kein Acknowledge vom Slave.
OP #4765794
Lesenswert?

Achim S. schrieb:
> Ich hoffe, Du reagierst angemessen auf die üblichen Fehler, wie z.B.
> kein Acknowledge vom Slave.

Ja, ich habe einen "Timer" der mir ein return 1 gibt bei einem 
Fehlschlag.

Achim S. schrieb:
> - Durch soviele Clockimpulse, bis er fertig ist.

Nun ja, wenn sich der Slave wirklich aufhängen würde, dann wäre doch der 
SDA Pin auf LOW und würde dort bleiben, oder? Das ist bei mir nie der 
Fall.

Arduinoquäler schrieb:
> Die Lösung ist, die Ursache des Problems zu beheben und
> nicht den Fehler mit herumpatchen zu übertünchen.

Das ist einfacher gesagt als getan, es gibt viele Störquellen 
(Quadcopter Umgebung) und es ist sicher zuverlässiger, wenn man auch bei 
einem Fehler die weitere Funktion garantieren kann.
Gast #4765801
Lesenswert?

> Innerhalb des Masters wird es ja wohl keinen Absturz geben(*).
[..]
> *) Ich hoffe, Du reagierst angemessen auf die üblichen Fehler, wie z.B.
> kein Acknowledge vom Slave.

Es kann auch der Master hängen bleiben, siehe z.B. die Anmerkung zum 
SWRST [0]. Wie man den zugehörigen DMA abwürgt kann ich allerdings nicht 
sagen.

HTH

[0] Kapitel 27.6.1 'I2C control register 1' im RM0090 reference manual 
[1]
[1] http://www.st.com/resource/en/reference_manual/DM00031020.pdf
#4765811
Lesenswert?

Arduinoquäler schrieb:
> Sebastian T. schrieb:
>> scheint dies nicht die Lösung zu sein.
>
> Die Lösung ist, die Ursache des Problems zu beheben und
> nicht den Fehler mit herumpatchen zu übertünchen.

Auch wenn ich dir da im Prinzip recht gebe, kann es immer mal zu einer 
Störung kommen. Die Software muss robust gegen sowas sein und darf das 
nicht mit dauerhaft lahmgelegter Kommunikation quittieren.

Arduinoquäler schrieb:
> Sebastian T. schrieb:
>> Das ist einfacher gesagt als getan,
>
> Dann ist der I2C Bus der falsche Bus für diese Anwendung, oder
> die praktische Umsetzung ist so mangelhaft (ich könnte auch
> sagen scheisse) dass der Bus zu leicht gestört werden kann.

Ok, mal angenommen, es wird so umgebaut, dass er nur noch schwer zu 
stören ist, und es kommt trotzdem mal eine Störung vor. Was dann?
OP #4765822
Lesenswert?

g457 schrieb:
> Es kann auch der Master hängen bleiben

Wenn ich mit dem Debugger das ganze verfolge, dann bleibt der Master 
(STM32) nicht hängen. Ich initialisiere alles neu und versuche etwas zu 
senden, doch der I2C scheint die ganze Zeit busy zu sein. Dann 
wiederholt sich das ganze.
1
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)) {
2
    if (--timeout == 0) {
3
      return 1; //es kommt dann immer zu return 1
4
    }
5
  }
Gast #4765827
Lesenswert?

Rolf M. schrieb:
> Ok, mal angenommen, es wird so umgebaut, dass er nur noch schwer zu
> stören ist, und es kommt trotzdem mal eine Störung vor. Was dann?

Ok, mal angenommen, es fliegt aus dem All ein Teilchen ins
RAM deines Computers und trifft genau eine Speicherzelle
deines laufenden Kernels ....

... oder in klaren Worten: man kann eine Hardware so bauen
das sie zuverlässig funktioniert.
#4766643
Lesenswert?

Arduinoquäler schrieb:
> Rolf M. schrieb:
>> Ok, mal angenommen, es wird so umgebaut, dass er nur noch schwer zu
>> stören ist, und es kommt trotzdem mal eine Störung vor. Was dann?
>
> Ok, mal angenommen, es fliegt aus dem All ein Teilchen ins
> RAM deines Computers und trifft genau eine Speicherzelle
> deines laufenden Kernels ....

Es gibt nicht nur schwarz oder weiß. Nur weil es bestimmte Störungen 
gibt, gegen die man nichts tun kann, heißt das nicht, dass man seine 
Software nicht robust gegen die machen sollte, gegen die man sehr wohl 
was tun kann.
Übrigens sind tatsächlich Systeme, die besonders zuverlässig sein 
müssen, mit Fehlerkorrektur für den RAM ausgestattet.
Gast #4766671
Lesenswert?

http://www.analog.com/media/en/technical-documentation/application-notes/54305147357414AN686_0.pdf

siehe solution 1

Uusere I2C-Implementation schaut sich vor jeder Kommunikation die 
Busleitungen an und wenn nicht beide auf "high" sind so startet er die 
entsprechende Takterei. Beim STM32 musst du dazu die Pins zum GPIO 
umkonfigurieren und nach Abschluss der Sequenz wieder zurück zur 
alternate function wechseln.

Übrigens wieder mal ein schönes Beispiel, weshalb man die ganzen HAL 
bzw. Periph. Library-Gedöns von ST NICHT benutzen sollte wenn man vorhat 
industriell zu programmieren. Besser ist es nach altehrwürdiger 
E-Technikertradition: Datenblatt lesen, Hirn einschalten und 
entsprechend implementieren.

Spätestens ab hier kommen die Informatiker eh nicht mehr mit :-)

(Sorry, der Satz musste sein: wir hatten gerade eben Teambesprechung)
Gast #4766694
Lesenswert?

Rolf M. schrieb:
> Übrigens sind tatsächlich Systeme, die besonders zuverlässig sein
> müssen, mit Fehlerkorrektur für den RAM ausgestattet.

Wenn der Windows Kernel läuft, dann tut er das sicherlich an
einer beliebigen Stelle im stinknormalen SDRAM des PC. Und
soweit ich es überblcken kann haben 99% aller Windows-Systeme
SDRAMs in ihrer Hardware die kein Parity Check oder ECC
vorgesehen haben.

Ich habe mich darüber seit Urzeiten des PC gewundert aber
die Masse an funktionierenden Systemen zeigt dass es irgendwie
geht ....

Wenn das geht, dann sollte man den I2C Bus auch so hinkriegen
können ....

.... aber Patchen, Herumpfriemeln, Übertünchen ist ja viel cooler.
#4767571
Lesenswert?

Arduinoquäler schrieb:
> Rolf M. schrieb:
>> Übrigens sind tatsächlich Systeme, die besonders zuverlässig sein
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> müssen, mit Fehlerkorrektur für den RAM ausgestattet.
   ^^^^^^
>
> Wenn der Windows Kernel läuft, dann tut er das sicherlich an

Ich habe dir da oben mal was markiert, was in totalem Widerspruch zu 
deinem Beitrag steht. Wenn man schon Geld in fehlerkorrigierende 
Hardware reinsteckt, dann konkterkariert man diese Maßnahmen (die ja die 
Verfügbarkeit des Gesamtsystems erhöhen sollen) tunlichst nicht durch 
den Einsatz von Windows.
#4767789
Lesenswert?

Ich glaub, wir schweifen etwas vom Thema ab. Was ich sagen wollte (und 
auch gesagt hab) ist, dass ich es für sinnvoll halte, Software 
fehlertolerant auszulegen, also so, dass sie mit Fehlern adäquat umgeht, 
wo das möglich ist. Manch einer mag das "Patchen, Herumpfriemeln, 
Übertünchen" nennen, ich nenne es robustes Software-Design. In der 
Automobilbranche wird sehr viel Aufwand genau in dieses Thema gesteckt, 
denn im Auto darf nicht einfach alles ausfallen bis das nächste Mal die 
Batterie abgeklemmt wird, nur weil auf dem Bus mal ein Bit gekippt ist. 
Vielmehr haben alle Steuergeräte in solchen Fällen auf genau definierte 
Art und Weise zu reagieren.
Gast #4767808
Lesenswert?

Rolf M. schrieb:
> Software
> fehlertolerant auszulegen, also so, dass sie mit Fehlern adäquat umgeht,
> wo das möglich ist. Manch einer mag das "Patchen, Herumpfriemeln,
> Übertünchen" nennen, ich nenne es robustes Software-Design.

Das sind zwei ganz verschiedene Dinge. Bei einer "schlechten" HW 
dutzende ADC Werte mitteln und dann an das Ergebnis glauben, Nachrichten 
mehrfach schicken und Mehrheitsentscheidungen treffen ist das eine, eine 
anständige Fehlerbehandlung das andere.

MfG Klaus
#4767900
Lesenswert?

Klaus schrieb:
> Bei einer "schlechten" HW
> dutzende ADC Werte mitteln und dann an das Ergebnis glauben, Nachrichten
> mehrfach schicken und Mehrheitsentscheidungen treffen ist das eine, eine
> anständige Fehlerbehandlung das andere.

Nun, "Arduinoquäler" fand es ja anscheinend nicht nötig, dass die 
Software damit klar kommt, wenn auf dem I²C mal ein Übertragungsfehler 
passiert und findet es völlig in Ordnung, wenn die Kommunikation dann 
komplett zusammenbricht und nicht mehr funktioniert, bis man das ganze 
von der Versorgung trennt und wieder anschließt. Ich sehe das anders, 
und darauf bezog sich auch meine Antwort.
Natürlich muss man auch die Hardware so bauen, dass Störungen möglichst 
nicht auftreten. Zusätzlich sollte man aber auch die Software dagegen 
absichern, statt einfach zu sagen: "Ich hab ja in der Hardware schon 
alles getan, also können Fehler ja eh nicht mehr auftreten".

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren