mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik E2PROM vs I2C Hardware - Aufhängen vermeiden / handeln


Autor: Christian J. (Firma: privat) (christianj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

etwa alle 6-10 Wochen hängt sich mein "Wetterfrosch" auf dem u.a. ein 
STM32F1xxx ein 1Mbit EEPROM von Atmel mit Daten beschreibt, weil das E2P 
(E2PROM) nicht mehr reagiert. Nur Strom aus/ein hilft da noch. Die 
Statemachine des E2P arbeitet zusammen mit der I2C Prime Cell eines 
STM32F1xx. Diese ist nicht ganz fehlerfrei, wie man dem Errata Sheet und 
einigen Foren entnehmen kann aber sie funktioniert, wenn man zb auf DMA 
verzichtet.

https://github.com/jeelabs/embello/issues/76

Die Ursache für das Hängen liegt aber nicht in der Prime Cell, denn 
diese kann durch ein Bit komplett resettet werden. Bei mir hängt 
tatsächlich das E2P. Wie geprüft? An einem AVR mit Bit-Banging I2C 
passiert es genauso, eine Frage der Zeit, Tage, Wochen, irgendwann kommt 
die Meldung, dass das E2P gar nicht mehr reagiert. EMV, Blitz, Gewitter, 
irgendwas eben.

Ist es daher ratsam, so ein kleines E2P zb mit einem Port Pin zu 
versorgen? Braucht nur wenige mA, packt der uC locker. Als 
"Power-On-Reset" ? Bisher nur mit Atmel I2C EEPROM geprüft, bei 
Microchip kommt das aber auch wohl vor.

Die Empfehlung "Software I2C" ist zwar nett, die man oft liest aber die 
I2C Hardware ist ja nicht dazu da, dass man sie nicht benutzt und sie 
arbeitet zudem autonom, braucht keine CPU Zeit.

gruss,
Christian

I2C : Weniger Leitungen - Mehr Probleme!

: Bearbeitet durch User
Autor: Stefanus F. (stefanus)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Christian J. schrieb:
> Ist es daher ratsam, so ein kleines E2P zb mit einem Port Pin zu
> versorgen?

Ja, das ist generell bei jeder I²C Peripherie ratsam, wo ein manueller 
Reset inakzeptabel ist.

Autor: Christian J. (Firma: privat) (christianj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Christian J. schrieb:
>> Ist es daher ratsam, so ein kleines E2P zb mit einem Port Pin zu
>> versorgen?
>
> Ja, das ist generell bei jeder I²C Peripherie ratsam, wo ein manueller
> Reset inakzeptabel ist.

Bei der DS3231 RTC vermutlich weniger, bei der ist bisher nix passiert 
und die arbeitet seit 2 Jahren an der Wohnzimmerwand mit. Am gleichen 
I2C Buss, gleicher uC. Auch bei Gyro Sensoren noch nie Probleme gehabt 
und die werden 400khz ohne Pause abgefragt, 24/7 die Woche. Max 2-3cm 
Leitungslänge, alles dicht an dicht.

: Bearbeitet durch User
Autor: Stefanus F. (stefanus)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Was stabil läuft braucht natürlich keinen Workaround. An der 
Wohnzimmerwand kann man notfalls auch mal Hand anlegen. An einem Roboter 
auf dem Mars wird das schwieriger.

Autor: Christian J. (Firma: privat) (christianj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist Dir beim STM32 da schon mal was aufgefallen? F1xxx oder F407 ? 
Sollen wir die Software mal abgleichen? War ne Menge Arbeit die zu 
schreiben, vor allem wegen der Fehlerabfragen.... streng nach 
Datenblatt.

: Bearbeitet durch User
Autor: Christopher B. (chrimbo) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte auch schonmal Probleme mit einem I²C EEPROM, aber da lag es an 
der I²C Peripherie im Controller (Renesas H8). Die hat ab und zu einen 
Takt zuviel ausgeben und dann hat das EEPROM darauf gewartet dass noch 
weitere 7 Takte für das nächste Byte kommen. Die Peripherie im 
Controller hat sich dann auch aufgehangen weil das EEPROM die 
Datenleitung blockiert hat.

Die radikale Lösung war dann die I²C Peripherie abzuschalten und 7 Takte 
über die GPIO Pins zu erzeugen. Dann konnte das Modul im µC wieder 
gestartet werden.

Autor: Christian M. (Firma: magnetmotor.ch) (chregu) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei einer Anwendung mache ich einfach "Clocking Through the Problem" aus 
AN-686: 
https://www.analog.com/media/en/technical-documentation/application-notes/54305147357414AN686_0.pdf

Gruss Chregu

Autor: Christian J. (Firma: privat) (christianj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian M. schrieb:
> Bei einer Anwendung mache ich einfach "Clocking Through the Problem" aus
> AN-686:

Kenn ich, hilft aber auch nix, schon ausprobiert. Gibts auch von 
Microchip so eine AN, 9 Clocks Reset oder wie sie heisst.

Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Christian J. schrieb:
> , weil das E2P
> (E2PROM) nicht mehr reagiert.


Ich glaube das auch nicht.
Die Ursache ist woanders!

Habe ein paar AT24CM02 im Einsatz.
Seit Monaten stabil.

: Bearbeitet durch User
Autor: Christian J. (Firma: privat) (christianj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Solution 2: Adding a Reset Pin to an I2
Another method will reset the I2 C slave. One function never seen on an 
I2 C slave is a reset pin. To remedy this type of problem, a reset 
function is added via additional hardware: an analog switch. The analog 
switch needs several attributes to perform the reset function properly. 
The ADG749 fills the requirements.

Ein Transistor würde es auch tun denke ich, PNP oder NPN, ginge beides. 
Verliert das EE die Masse zieht es sich nach VCC über die Pull Ups. 
Müsste auch resetten.

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Regel ist ein Bushänger ein Programmfehler. Ich habe diverse I2C 
jahrelang laufen, ohne Hänger.
Ein beliebter Fehler ist, vor dem letzten Byte lesen nicht das NACK zu 
setzen. Das NACK sagt dem EEPROM, daß er den Bus freigeben soll. 
Ansonsten kollidiert das STOP mit dem nächsten Datenbit und der Bus 
hängt, wenn es 0 ist.

Christian J. schrieb:
> Die Empfehlung "Software I2C" ist zwar nett

Zumindest um den EEPROM zu resetten, ist sie erforderlich. Man taktet 
damit bis zu 9-mal den SCK und prüft jedesmal, ob SDA = 1 ist. Erst dann 
kann der Master wieder ein START senden.

Autor: Peter D. (peda)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Christian J. schrieb:
> Kenn ich, hilft aber auch nix, schon ausprobiert. Gibts auch von
> Microchip so eine AN, 9 Clocks Reset oder wie sie heisst.

Dann hast Du was falsch gemacht. Das funktioniert immer. Der EEPROM hat 
nur ne Statemaschine, die kann sich nicht aufhängen.
VCC zu schalten, ist ne blöde Idee, denn dann wird der EEPROM rückwärts 
über die beiden Pullups versorgt. Die müßte man also mit abschalten.

: Bearbeitet durch User
Autor: Meine Phantasie (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Arduino Fanboy D. schrieb:
> Die Ursache ist woanders!

- "Meine Hardware ist über jeden Zweifel erhaben"

- "Ich weiss dass der Controller eine Macke in der Hardware
hat, aber ich werde sie um keinen Preis umgehen."

Autor: Meine Phantasie (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Peter D. schrieb:
> Der EEPROM hat
> nur ne Statemaschine, die kann sich nicht aufhängen.

Peter D. schrieb:
> Zumindest um den EEPROM zu resetten, ist sie erforderlich.

Das ist für mich widersprüchlich. Entweder sie (die Statemaschine)
kann sich nicht aufhängen, dann kann man sie durch "normales"
Behandeln/Kommandieren weiterbringen, oder sie kann sich aufhängen,
und der Reset ist der einzige Ausweg.

In meinem Verständnis vom I2C Bus muss eine Stop-Condition
die auf den Bus gegeben wird, jeglichen Slave von einer
Aktivität am Bus abbringen.

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Phantasie schrieb:
> Das ist für mich widersprüchlich. Entweder sie (die Statemaschine)
> kann sich nicht aufhängen, dann kann man sie durch "normales"
> Behandeln/Kommandieren weiterbringen, oder sie kann sich aufhängen

Sie hängt sich ja nicht auf, der Master wurde nur falsch programmiert.
Jedes ACK vom Master setzt den Slave für das folgende Byte in den 
Datensendemodus. Die Statemaschine funktioniert also einwandfrei.

Meine Phantasie schrieb:
> In meinem Verständnis vom I2C Bus muss eine Stop-Condition
> die auf den Bus gegeben wird, jeglichen Slave von einer
> Aktivität am Bus abbringen.

Dann hast Du die I2C-Spezifikation nicht verstanden.
Für ein STOP muß der Master auf SDA eine 0->1 Flanke legen. Er muß also 
vorher mit NACK dem Slave mitteilen, daß er ein STOP senden will. Denn 
riechen kann der Slave das ja nicht.

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Stop Signal kann nicht erzeugt werden, solange der Slave ein Low-Bit 
auf den Bus legt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.