Anfängerprobleme mit Simple-I2C und Eeprom
Moderator: Guido Körber
-
- Posts: 12
- Joined: Tue Jul 05, 2022 1:21 pm
Anfängerprobleme mit Simple-I2C und Eeprom
Liebes CodeMercs-Forum,
dies ist mein erster Beitrag, daher: Hallo!
Als völliger Anfänger in Sachen I2C versuche ich gerade etwas sehr einfaches: Mit dem IO-Warrior56 per I2C einen Eeprom (M24256-BW) ansteuern und Bits schreiben/lesen.
Die Kommunikation zwischen Interface und Chip funktioniert, ich kann den Eeprom mit Simple-I2C detektieren und Schreib-/Lesebefehle senden. Jetzt beginnt meine Unkenntnis:
Der Chip hat 256kb Speicher mit 512 Blöcken je 64 Byte. Laut Datenblatt erwartet der Chip zum Schreiben Folgendes:
ID-Byte | Address-MSB | Address-LSB | Daten-Byte | Stopp
Die Software sendet das ID-Byte (in meinem Fall die 50) automatisch und auch richtig, da der Chip antwortet.
Welche Syntax wird jetzt von mir in der "Input"-Zeile erwartet?
Ich würde erwarten, mit "50 00 00 44" in das Byte mit der Adresse "00 00" den Wert 44 schreiben zu können. Ist das richtig? Muss ich das Kommando "Stopp" selbst senden, oder setzt die Software das hinten dran?
Wenn ich den Chip nun auslesen möchte, kann ich mit maximal 256 Bytes anzeigen lassen. Welche der 256 der 32k sehe ich denn? Kann ich steuern, welche Bytes ausgelesen werden sollen?
Wenn ich mehrmals auslese, ändert sich auch das ausgelesene Ergebnis ==> Zählt da intern irgendetwas hoch, das mir "den nächsten Block" oder so anzeigt....oder ist der Speicherzugriff zufällig und damit auch die Startadresse der angezeigten Daten?
Jedenfalls gelingt es mir nicht, den erwarteten Wert "44" irgendwo zu finden und ich bin verwirrt.
Es wäre super, wenn mit jemand weiterhelfen, oder mich auf hilfreiche Quellen zum weiteren Einlesen verweisen könnte.
Schon jetzt vielen Dank und viele Grüße,
Zakk
dies ist mein erster Beitrag, daher: Hallo!
Als völliger Anfänger in Sachen I2C versuche ich gerade etwas sehr einfaches: Mit dem IO-Warrior56 per I2C einen Eeprom (M24256-BW) ansteuern und Bits schreiben/lesen.
Die Kommunikation zwischen Interface und Chip funktioniert, ich kann den Eeprom mit Simple-I2C detektieren und Schreib-/Lesebefehle senden. Jetzt beginnt meine Unkenntnis:
Der Chip hat 256kb Speicher mit 512 Blöcken je 64 Byte. Laut Datenblatt erwartet der Chip zum Schreiben Folgendes:
ID-Byte | Address-MSB | Address-LSB | Daten-Byte | Stopp
Die Software sendet das ID-Byte (in meinem Fall die 50) automatisch und auch richtig, da der Chip antwortet.
Welche Syntax wird jetzt von mir in der "Input"-Zeile erwartet?
Ich würde erwarten, mit "50 00 00 44" in das Byte mit der Adresse "00 00" den Wert 44 schreiben zu können. Ist das richtig? Muss ich das Kommando "Stopp" selbst senden, oder setzt die Software das hinten dran?
Wenn ich den Chip nun auslesen möchte, kann ich mit maximal 256 Bytes anzeigen lassen. Welche der 256 der 32k sehe ich denn? Kann ich steuern, welche Bytes ausgelesen werden sollen?
Wenn ich mehrmals auslese, ändert sich auch das ausgelesene Ergebnis ==> Zählt da intern irgendetwas hoch, das mir "den nächsten Block" oder so anzeigt....oder ist der Speicherzugriff zufällig und damit auch die Startadresse der angezeigten Daten?
Jedenfalls gelingt es mir nicht, den erwarteten Wert "44" irgendwo zu finden und ich bin verwirrt.
Es wäre super, wenn mit jemand weiterhelfen, oder mich auf hilfreiche Quellen zum weiteren Einlesen verweisen könnte.
Schon jetzt vielen Dank und viele Grüße,
Zakk
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: Anfängerprobleme mit Simple-I2C und Eeprom
Simple-I2C sendet die Adresse selber, in die Eingabezeile für die Daten gehören also wirklich nur die Daten, nicht das Adressbyte.
Die EEPROMs halten typischerweise die Adresse intern und zählen selber hoch. Details dazu finden sich im Datenblatt des jeweiligen Chips.
Die EEPROMs halten typischerweise die Adresse intern und zählen selber hoch. Details dazu finden sich im Datenblatt des jeweiligen Chips.
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Anfängerprobleme mit Simple-I2C und Eeprom
Wie Guido schon geschrieben hat baut Simple-I2C den Report selber zusammen mit Startbit, Stopbit und I2C-Geräteadresse.
Auch die Leseadresse (also die I2C-Geräteadresse mit Read-Bit) baut sich das Tool selber.
Wenn also auf/ab die Speicherzelle 0x0000 (16 bit bei dem Eeporm) geschrieben werden soll, muss in dem spziellen Fall in das Eingabefeld nur "00 00 44" geschrieben werden.
Bei "00 00 44" wird der Adresscounter auf 0x0001 hoch gesetzt und wenn man dann einfach z.B. 32 Byte lesen will, dann bekommt man alles ab 0x0001.
Um von einer spezifischen Adresse zu lesen muss man in der Regel einfach einen Schreibbefehl ohne Daten schichen. Also "00 00". Das sollte
dann den interenen Adresscounter auf 0x0000 setzten und wenn man dan liest sollte es klappen und man bekommt die gewünschten Daten zurück.
Auch die Leseadresse (also die I2C-Geräteadresse mit Read-Bit) baut sich das Tool selber.
Wenn also auf/ab die Speicherzelle 0x0000 (16 bit bei dem Eeporm) geschrieben werden soll, muss in dem spziellen Fall in das Eingabefeld nur "00 00 44" geschrieben werden.
Bei "00 00 44" wird der Adresscounter auf 0x0001 hoch gesetzt und wenn man dann einfach z.B. 32 Byte lesen will, dann bekommt man alles ab 0x0001.
Um von einer spezifischen Adresse zu lesen muss man in der Regel einfach einen Schreibbefehl ohne Daten schichen. Also "00 00". Das sollte
dann den interenen Adresscounter auf 0x0000 setzten und wenn man dan liest sollte es klappen und man bekommt die gewünschten Daten zurück.
-
- Posts: 12
- Joined: Tue Jul 05, 2022 1:21 pm
Re: Anfängerprobleme mit Simple-I2C und Eeprom
Hallo zusammen,
super, vielen Dank! Das hat mir sehr weitergeholfen und zumindest die ersten 256 bytes meines Eeprom kann ich jetzt gezielt ansprechen und beschreiben/auslesen.
Vielen Dank!
Jetzt schließt sich mir das nächste Problem an.....denn meine Zielanwendung für das Ganze ist LabView.
Soll ich dafür einen eigenen Thread aufmachen?
Falls nicht: Ich hab in Labview jetzt eine Weile herumgesucht, und mir die Beispielprogramme und die IOWarrior V150.llb angeschaut. Ich blicke aber noch nicht durch, wie ich z.B. dem VI "I2C read all" klar mache, dass ich unter der I2C-Adresse "50" die Speicheradresse 00 00 anspringen und dann 1 Byte auslesen möchte. Ich nehme an, dass der Eingang "NoOfBytes" eine numerische Zahl erwartet, wie viele Bytes gelesen werden sollen. Soweit verständlich. Unter "Other Senbytes" würde ich jetzt vermuten, dass ich die Adresse setzen kann, aber ich verstehe leider nicht, wie.
Ist irgendwo dokumentiert, welche Datenformate die VIs erwarten?
Schon jetzt wieder vielen Dank und viele Grüße,
Zakk
P.S. hier mein riesiger Labview-Code. ich würde gerne die ersten 10 Bytes auslesen. Die Adresse ist wie bei Simple-I2C die 50.
super, vielen Dank! Das hat mir sehr weitergeholfen und zumindest die ersten 256 bytes meines Eeprom kann ich jetzt gezielt ansprechen und beschreiben/auslesen.
Vielen Dank!
Jetzt schließt sich mir das nächste Problem an.....denn meine Zielanwendung für das Ganze ist LabView.
Soll ich dafür einen eigenen Thread aufmachen?
Falls nicht: Ich hab in Labview jetzt eine Weile herumgesucht, und mir die Beispielprogramme und die IOWarrior V150.llb angeschaut. Ich blicke aber noch nicht durch, wie ich z.B. dem VI "I2C read all" klar mache, dass ich unter der I2C-Adresse "50" die Speicheradresse 00 00 anspringen und dann 1 Byte auslesen möchte. Ich nehme an, dass der Eingang "NoOfBytes" eine numerische Zahl erwartet, wie viele Bytes gelesen werden sollen. Soweit verständlich. Unter "Other Senbytes" würde ich jetzt vermuten, dass ich die Adresse setzen kann, aber ich verstehe leider nicht, wie.
Ist irgendwo dokumentiert, welche Datenformate die VIs erwarten?
Schon jetzt wieder vielen Dank und viele Grüße,
Zakk
P.S. hier mein riesiger Labview-Code. ich würde gerne die ersten 10 Bytes auslesen. Die Adresse ist wie bei Simple-I2C die 50.
- Attachments
-
- IOWarrior_Auslesen_Labview_220708.jpg (34.71 KiB) Viewed 2002 times
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Anfängerprobleme mit Simple-I2C und Eeprom
An sich sollte das eigentlich funktionieren, auch wenn die Lib von LabView nicht auf dem neusten Stand ist (aber das ist für den IOW56 egal)
Wir haben die LabView Lib geändert und die ganzen Blöcke für I2C entfernt, weil die nicht kompatibel sind mit den neuen IO-Warriorn. V
Naja es ist wie beim Simple-I2C. Man muss ihm erstmal sagen ab wo er lesen soll. Also vor dem ReadAll müsste einmal ein Schreibbefehl sein, der ihm die 00 00 sendet.
Ich komme leider erst am Montag dazu mich drum zu kümmern.
Wir haben die LabView Lib geändert und die ganzen Blöcke für I2C entfernt, weil die nicht kompatibel sind mit den neuen IO-Warriorn. V
Naja es ist wie beim Simple-I2C. Man muss ihm erstmal sagen ab wo er lesen soll. Also vor dem ReadAll müsste einmal ein Schreibbefehl sein, der ihm die 00 00 sendet.
Ich komme leider erst am Montag dazu mich drum zu kümmern.
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Anfängerprobleme mit Simple-I2C und Eeprom
So ich hab mal eine VI erstellt. Diese nutzt nur die RAW Write/Read Funktionen und müsste 16 Byte ab Start Register/Adresse 00 00 auslesen.
Die VI ist ungetestet, da ich den EEPROM nicht habe und nichts vergleichbares.
Die VI ist ungetestet, da ich den EEPROM nicht habe und nichts vergleichbares.
-
- Posts: 12
- Joined: Tue Jul 05, 2022 1:21 pm
Re: Anfängerprobleme mit Simple-I2C und Eeprom
Hallo,
das hilft schon mal sehr weiter, vielen Dank!
Außerdem habe ich mittlerweile auch das volle Datenblatt für den Warrior mit der Addressierungsvorgabe gefunden. Damit gehts auch deutlich leichter.
Ich habe das oben genannte Codebeispielt nachprogrammiert und auf verschiedene Weisen angepasst...und stoße auf ein Problem: Der Warrior gibt ein 8 Byte breites Array aus, von dem die ersten beiden Bytes die ID und das Flag sind, und dann noch 6 Bytes vom Eeprom. Der Pointer des Eeproms springt dabei 16 byte weiter. D.h. es werden die hinteren 10 Bytes abgetrennt.
Gibt es dafür eine Lösung? Muss der Warrior noch mit etwas anderem beschickt werden, um mehr Bytes auszugeben?
Ich habe das im Moment so gelöst, dass ich in einer for-Schleife den Lesebefehl immer wieder ausführe und quasi in Vierer-Schritten durch den Speicher hüpfe und die jeweils vier Werte in einem Array hintereinander packe. Damit komme ich erstmal klar, eleganter wäre aber, die 64 Byte einer Speicher-Page des Eeprom am Block auslesen zu können. Hätte da jemand einen Tipp für mich?
Soweit erst nochmal Danke, denn das hilft mir schon sehr weiter.
Viele Grüße!
das hilft schon mal sehr weiter, vielen Dank!
Außerdem habe ich mittlerweile auch das volle Datenblatt für den Warrior mit der Addressierungsvorgabe gefunden. Damit gehts auch deutlich leichter.
Ich habe das oben genannte Codebeispielt nachprogrammiert und auf verschiedene Weisen angepasst...und stoße auf ein Problem: Der Warrior gibt ein 8 Byte breites Array aus, von dem die ersten beiden Bytes die ID und das Flag sind, und dann noch 6 Bytes vom Eeprom. Der Pointer des Eeproms springt dabei 16 byte weiter. D.h. es werden die hinteren 10 Bytes abgetrennt.
Gibt es dafür eine Lösung? Muss der Warrior noch mit etwas anderem beschickt werden, um mehr Bytes auszugeben?
Ich habe das im Moment so gelöst, dass ich in einer for-Schleife den Lesebefehl immer wieder ausführe und quasi in Vierer-Schritten durch den Speicher hüpfe und die jeweils vier Werte in einem Array hintereinander packe. Damit komme ich erstmal klar, eleganter wäre aber, die 64 Byte einer Speicher-Page des Eeprom am Block auslesen zu können. Hätte da jemand einen Tipp für mich?
Soweit erst nochmal Danke, denn das hilft mir schon sehr weiter.
Viele Grüße!
- Attachments
-
- For-Schleife-4er-Steps.jpg (93.49 KiB) Viewed 1971 times
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Anfängerprobleme mit Simple-I2C und Eeprom
Klingt danach, dass er die Reportgröße des IOW24/40 nutzt und nicht die des IOW56.
Ist die "IOWarriorV150.llb" denn auf dem aktuellen Stand? Ich glaube mich zu erinnern, dass das nach einem Bug in einer alten
Version klingt.
Ist die "IOWarriorV150.llb" denn auf dem aktuellen Stand? Ich glaube mich zu erinnern, dass das nach einem Bug in einer alten
Version klingt.
-
- Posts: 12
- Joined: Tue Jul 05, 2022 1:21 pm
Re: Anfängerprobleme mit Simple-I2C und Eeprom
Hi!
Also die llb ist von Ende Mai 2015, runtergeladen von der Homepage
https://www.codemercs.com/de/dongles/iow56dg
vor ca. 2 Wochen als Teil der Labview-Beispiele.
Gibt es eine aktuellere Version?
Danke und viele Grüße!
Also die llb ist von Ende Mai 2015, runtergeladen von der Homepage
https://www.codemercs.com/de/dongles/iow56dg
vor ca. 2 Wochen als Teil der Labview-Beispiele.
Gibt es eine aktuellere Version?
Danke und viele Grüße!
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Anfängerprobleme mit Simple-I2C und Eeprom
Nein das ist eigentlich die aktuelle Lib und Beispiele. Wir haben nicht so viele LabView Anfragen, von daher kommt da selten was neues.
Ich schau am Montag mal ob ich ein ähnliches Verhalten bei der VI, die ich oben angehangen habe bekomme.
Ich schau am Montag mal ob ich ein ähnliches Verhalten bei der VI, die ich oben angehangen habe bekomme.
-
- Posts: 12
- Joined: Tue Jul 05, 2022 1:21 pm
Re: Anfängerprobleme mit Simple-I2C und Eeprom
Das wäre super!
So richtig fehlerfrei klappt das Auslesen des Eeproms nämlich nicht. Beschreiben mit Blöcken von 4x 256 doubles mit je 8 byte klappt super, beim Auslesen geht immer wieder etwas schief: Nach einer nicht reproduzierbaren Menge von "4-Byte"-Blöcken geht das Auslesen schief und es wird nur noch eine feste Zahl ausgegeben ( -9,17 glaube ich).
Da würde ein einmaliger Auslesebefehl mit 64 Byte sehr helfen!
Danke schonmal!
So richtig fehlerfrei klappt das Auslesen des Eeproms nämlich nicht. Beschreiben mit Blöcken von 4x 256 doubles mit je 8 byte klappt super, beim Auslesen geht immer wieder etwas schief: Nach einer nicht reproduzierbaren Menge von "4-Byte"-Blöcken geht das Auslesen schief und es wird nur noch eine feste Zahl ausgegeben ( -9,17 glaube ich).
Da würde ein einmaliger Auslesebefehl mit 64 Byte sehr helfen!
Danke schonmal!
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Anfängerprobleme mit Simple-I2C und Eeprom
Zur Erklärung: Die LabView Lib wurde/wird uns von einem Kunden bereitgestellt, der diese in seiner Freizeit erstellt hatte. Darauf bauen
die Beispiele und die Lib auf. Wir selber können nur bedingt Support für LabView leisten, der über einfache VIs hinaus geht.
Das, was im auf der Webseite bei den Downloads liegt, ist für LabView >2014 und wir selber haben nur LabView 2011. Das ist mir auch jetzt erst beim gegentesten aufgefallen, dass ich die Datein nicht laden/öffnen kann. Anscheinend ist da beim kopieren und Hochladen mal was durcheinander gekommen und wir haben eine falsche/fehlehafte Lib hochgeladen.
Ich habe hier mal das angehangen, was ich mit meiner 2011 Datei ausführen kann: Bitte einmal das im Anhang nehmen und testen, ob damit größere Rückantworten kommen (ist allerdings nur eine 32Bit Variante, da wir keine 64 Bit haben).
die Beispiele und die Lib auf. Wir selber können nur bedingt Support für LabView leisten, der über einfache VIs hinaus geht.
Das, was im auf der Webseite bei den Downloads liegt, ist für LabView >2014 und wir selber haben nur LabView 2011. Das ist mir auch jetzt erst beim gegentesten aufgefallen, dass ich die Datein nicht laden/öffnen kann. Anscheinend ist da beim kopieren und Hochladen mal was durcheinander gekommen und wir haben eine falsche/fehlehafte Lib hochgeladen.
Ich habe hier mal das angehangen, was ich mit meiner 2011 Datei ausführen kann: Bitte einmal das im Anhang nehmen und testen, ob damit größere Rückantworten kommen (ist allerdings nur eine 32Bit Variante, da wir keine 64 Bit haben).
-
- Posts: 12
- Joined: Tue Jul 05, 2022 1:21 pm
Re: Anfängerprobleme mit Simple-I2C und Eeprom
Hi!
leider nein, die Antwort ist ebenfalls 8 byte lang.
leider nein, die Antwort ist ebenfalls 8 byte lang.
- Attachments
-
- Screen_demosoftware_Codemerc.jpg (74.55 KiB) Viewed 1902 times
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Anfängerprobleme mit Simple-I2C und Eeprom
Hmm komisch, bei dem was ich angehangen habe sind beider Arrays 64Byte groß.
Was man schauen kann ist, ob der Block "Enlarge Report" beim IOW56 den Report richtig aufbläht.
Dazu in der VI (nicht die Lib) doppelkick auf den "SprecialRawRead" Block, dort dann wenn das Fenster auf geht ins Blockdiagramm und den "EnlargeReport" ebenfalls öffnen und dann dann mal schauen, was beim IOW56 steht. Bei meiner VI (und was ich hochgeladen hatte) sieht das so aus:
Was man schauen kann ist, ob der Block "Enlarge Report" beim IOW56 den Report richtig aufbläht.
Dazu in der VI (nicht die Lib) doppelkick auf den "SprecialRawRead" Block, dort dann wenn das Fenster auf geht ins Blockdiagramm und den "EnlargeReport" ebenfalls öffnen und dann dann mal schauen, was beim IOW56 steht. Bei meiner VI (und was ich hochgeladen hatte) sieht das so aus:
-
- Posts: 12
- Joined: Tue Jul 05, 2022 1:21 pm
Re: Anfängerprobleme mit Simple-I2C und Eeprom
Aha! Ich setze es mal auf 64 und teste......melde mich gleich
- Attachments
-
- IOW56_8.jpg (26.5 KiB) Viewed 1899 times