Eigentlich klappt das Beschreiben des EEPROMS mit den daten, zumindest,
solange ich nach dem Beschreiben einen Warteschlife einfüge.
Laut Datenblatt soll das Ende des Schreibzyklus auch per Poling
festgestellt werden können, das ggf. Zeit spart. Aber das funzt bei mir
irgendwie nicht. Da ist wohl ein blöder Fehler, den ich noch nicht
finden konnte.
Das aktuelle Ende meiner Bescreibungsroutine sieht wie folgt aus:
Mit der Notloesung "Delay1ms(20)", funktioniert es (Wartezeit 20 ms)
Die eigentlich, hier auskommentierte, vorgesehene Polling funktioniert
nicht. Die darin befindliche Warteschleife wird mittels des ms-Zaehlers
zwangsweise verlassen, damit sich die SW nicht aufhängen kann.
Wo bin ich wieder mal zu bloed gewesen?
Zum Polling sendet man Start + Adresse und wertet aus, ob NACK
geantwortet wird. NACK bedeutet, daß der EEPROM noch beschäftigt ist.
Dann muß Stop gesendet werden und der nächste Pollingversuch kann
erfolgen.
Hier mal ein Beispiel:
Beitrag "Re: I2C Eeprom AT24C512 Lib für Pagewrite in C"
Ja, schon klar. Mit "manueller" I2C-Lösung oder auch mit einem AVR (dazu
habe ich eine Vorlage) ist das auch okay, aber für den SAM3X8 nicht. Die
dortige TWI-Maschine ist ziemlich komplex.
Da ich Datenblatt nun gelesen habe, daß zusammen mit NACK auch TXCOMP im
Statusregister gesetzt werden, habe ich "meine" dennoch noch nicht
funktionierende Polling-Routine wie folgt geändert:
Hallo,
ist Deine Anwendung so zeitkritisch, dass Du nicht 20ms nach einem
PAGE-Write warten kannst?
In der Zeit, die Du Dich jetzt schon mit dem Polling beschäftigt hast,
hättest Du locker Deine Delay-Routine anspringen können und gut ist.
Ist vielleicht nicht das, was Du hören möchtest - aber die schnellste
Art und Weise, Dein Problem zu beseitigen.
Gruß
TK
TK schrieb:> Hallo,>> ist Deine Anwendung so zeitkritisch, dass Du nicht 20ms nach einem> PAGE-Write warten kannst?> In der Zeit, die Du Dich jetzt schon mit dem Polling beschäftigt hast,> hättest Du locker Deine Delay-Routine anspringen können und gut ist.>> Ist vielleicht nicht das, was Du hören möchtest - aber die schnellste> Art und Weise, Dein Problem zu beseitigen.>> Gruß> TK
So gesehen hast Du natürlich recht. Ich sehe die Lösung der
Polling-Geschichte mehr sportlich, ich möchte halt, daß sie
funktioniert. Quick & dirty ist eher nicht mein Fall.
CU Yogy
Hanns-Jürgen M. schrieb:> TWI0->TWI_CR = TWI_CR_START | TWI_CR_STOP;
Das sieht schon komisch aus, Start und Stop gleichzeitig.
Das Stop darf erst erfolgen, nachdem man NACK festgestellt hat.
Schau Dir mal meinen Ablauf an. Die SW-I2C Funktionen müßten sich doch
1:1 auf das HW-I2C runterbrechen lassen.
TK schrieb:> ist Deine Anwendung so zeitkritisch, dass Du nicht 20ms nach einem> PAGE-Write warten kannst?
Die typischen Schreibzeiten liegen weit darunter. Bei größeren Blöcken
macht sich das deutlich bemerkbar.
Peter D. schrieb:> Hanns-Jürgen M. schrieb:>> TWI0->TWI_CR = TWI_CR_START | TWI_CR_STOP;>> Das sieht schon komisch aus, Start und Stop gleichzeitig.> Das Stop darf erst erfolgen, nachdem man NACK festgestellt hat.> Schau Dir mal meinen Ablauf an. Die SW-I2C Funktionen müßten sich doch> 1:1 auf das HW-I2C runterbrechen lassen.
Beim SAM3X8 (auf Arduino DUE) ist die TWI offenbar anders anzusteuern
als beim AVR. Die Leseroutine fuer ein einziges Byte sieht dort wie
folgt (meine Implementierung) aus
Aber ich glaube, ich habe den Fehler entdeckt, ich werde das morgen mal
checken.
Denn jetzt geniesse ich das Eifelwasser vom seligen Simon aus aus
Bitburg...
Viele Grüße, Yogy
Peter D. schrieb:> TK schrieb:>> ist Deine Anwendung so zeitkritisch, dass Du nicht 20ms nach einem>> PAGE-Write warten kannst?>> Die typischen Schreibzeiten liegen weit darunter. Bei größeren Blöcken> macht sich das deutlich bemerkbar.
Beim byteweisen Beschreiben von mehrenen k Bytes ist das natürlich
richtig. Beim 24C256 kann ich aber in Blöcken a' 64 byte beschreiben und
muß nur ein einziges Mal pro Block den Delay benutzen.
So, ich glaube, wir können das Thema schließen. Ich habe zwar das
"Polling Problem" nicht lösen können, aber meine Recherchen im web haben
ergeben, daß die Atmels at91xx Bugs in der TWI haben, die insb das NACK
Signal betreffen. Die (hier!) beschriebene Lösung (Workaround) erscheint
mir aktuell zu aufwendig, um sie zu implementieren und zu testen.
Vielleicht mache ich das "irgendwann".
der Link: https://www.mikrocontroller.net/articles/AT91-TWI
Schoenes WE, Yogy
STM Apprentice schrieb:> Beitrag "Re: I2C auf STM32F103"
Ein paar Vorteile einer Soft-I2C-Implementierung:
- keine Geschwindigkeits-Verluste da der I2C Bus meist langsamer
arbeitet als der Controller
- Unahbhängigkeit von der SPI_harware bedeuted praktisch völlig
freie Wahl der Pins SCL/SDA am Controller.
- leicht zu debuggen da die I2C-Bus Slaves/Bausteine meist quasi-
statisch arbeiten und man jedes Bit einzeln anschauen kann (was
ja beim NACK/ACK sehr wichtig sein kann).
- "interruptible", aus dem gleichen Grund wie vorher (quasi-
statisch)
Hanns-Jürgen M. schrieb:> TWI0->TWI_CR = TWI_CR_START | TWI_CR_STOP; // BEIDES muss hier> gesetzt werden
Das kommt mir immer noch unlogisch vor.
Ich weiß doch erst nach dem NACK auf die I2C-Adresse, ob ich ein Stop
senden muß oder ob der Söave adressiert wurde und ich weiter machen
kann.
Ist das wirklich in dem Microchip Beispielcode so angegeben?
Hanns-Jürgen M. schrieb:> Beim 24C256 kann ich aber in Blöcken a' 64 byte beschreiben und> muß nur ein einziges Mal pro Block den Delay benutzen.
Das sind dann beim Beschreiben der 32kB schon 10s Wartezeit gegenüber
nur 2,5s, wenn der Chip schon nach 5ms wieder bereit ist.
Peter D. schrieb:> Hanns-Jürgen M. schrieb:>> TWI0->TWI_CR = TWI_CR_START | TWI_CR_STOP; // BEIDES muss hier>> gesetzt werden>> Das kommt mir immer noch unlogisch vor.> Ich weiß doch erst nach dem NACK auf die I2C-Adresse, ob ich ein Stop> senden muß oder ob der Söave adressiert wurde und ich weiter machen> kann.> Ist das wirklich in dem Microchip Beispielcode so angegeben?
Nein, das ist kein Microchip Beispielcode gewesen. Ich weiß auch aktuell
nicht mehr, wo ich ihn her habe. Ich glaube, das war grob in einer
Applikationnote beschrieben, die ich wohl nicht abgespeichert hae. Das
Auslesen von einem einigen Byte geht auf jeden Fall so, wie ich
beschrieben habe. Das funktioniert ja auch. Ich habe da gerade etwas
bei GITHUB gefunden:
https://github.com/brandonbraun653/SAM3X8E-Libraries/blob/master/ASF_Support/TWI/twi.c
siehe ca Zeile 282.
BTW: Die dort auch angegeben Polling-Lösung funktioniert nicht, WTF auch
immer. Ich bleibe erst einmal beim Delay. (s.u.)
Peter D. schrieb:> Hanns-Jürgen M. schrieb:>> Beim 24C256 kann ich aber in Blöcken a' 64 byte beschreiben und>> muß nur ein einziges Mal pro Block den Delay benutzen.>> Das sind dann beim Beschreiben der 32kB schon 10s Wartezeit gegenüber> nur 2,5s, wenn der Chip schon nach 5ms wieder bereit ist.
Nun, das EEPROM wird ja nicht ständig neu beschreiben. Es beinhaltet die
Konfigurationsgrößen meines Systems. Und das sind aktuell 16 Tabellen a'
64 byte, jeweils mit CRC sowie 182 Bytes an Einzelgroessen, deren Anzahl
aber noch wachsen kann.
Alle diese Größen können natürlich geändert werden, aber das geschieht
manuell über das User-Interface und ist daher usergemäß langsam.
Wenn ich das gesamte Systeme soweit ferig und funktionsfähig habe, werde
ich mich ggf. an Optimierungen geben.