Forum: Mikrocontroller und Digitale Elektronik I2C hängt sich auf, wie reset?


von Sebastian T. (sebastian_tsch)


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.

von Arduinoquäler (Gast)


Lesenswert?

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.

So einfach ist das!

von Stefan F. (Gast)


Lesenswert?

Ich kenne das Problem. Letztendlich lief es auf Strom aus/an schalten 
hinaus.

von A. S. (Gast)


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.

von Sebastian T. (sebastian_tsch)


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.

von g457 (Gast)


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

von Arduinoquäler (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


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?

von Klaus (Gast)


Lesenswert?

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

Wie soll er, der DMA redet mit dem Slave und hat bestimmt keinen Plan, 
was er tun soll, wenn mitten in der Message ein NAK kommt.

MfG Klaus

von Sebastian T. (sebastian_tsch)


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
  }

von Arduinoquäler (Gast)


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.

von Sebastian T. (sebastian_tsch)


Lesenswert?

Ok, ich habe es hinbekommen, das Problem war, dass ich den TX Stream 
nicht wieder aktiviert hatte mit DMA_Cmd(DMA1_Stream7, ENABLE); beim 
erneuten initialisieren.

Danke und Grüsse,

Sebastian

: Bearbeitet durch User
von Rolf M. (rmagnus)


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.

von Dennis (Gast)


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)

von Arduinoquäler (Gast)


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.

von Ralf D. (doeblitz)


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.

von Rolf M. (rmagnus)


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.

von Klaus (Gast)


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

von Rolf M. (rmagnus)


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".

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.