EEPROM und Chipkarten per TWI / I2C ansteuern

Hallo Tommy!

Es ist momentan nur ein Teilerfolg, weil es nur für das 512k EEPROM gilt.

Ich habe die selben Pausen mal in die Routinen für die Chipkarte eingebaut und damit geht es immer noch nicht zuverlässig.
Momentan spiele ich noch etwas mit den Pausenzeiten. Irgendwann wird es schon passen. :wink:


Tja, eigentlich sollte der Master auf den Slave warten.
Allerdings steht zu den ACK speziell etwas im Datenblatt.....
Schau dazu noch mal unter Punkt 4.5 nach.


Bis deine Chipkarten da sind wird sich das Problem mit den Zeiten hoffentlich geklärt haben. :cool:

Grüße,
Cassio
 
Hallo Tommy!

Scheint so, als würde sich das Problem beim Beschreiben der Chipkarten mit längeren Pausen nicht lösen lassen.

Vielleicht müssen die beiden freien Kontaktflächen ja auch mit GND verbunden werden?
Zur Zeit kann ich das leider nicht prüfen, da mir momentan die dafür benötige "Hardware" zum löten fehlt. :wink:


Jedenfalls bleibt das Problem aktuell noch bestehen......
Es werden immer 255 Byte verändert (meistens identisch) wenn man nur einen Speicherbereich beschreibt.


Grüße,
Cassio
 
Es werden immer 255 Byte verändert (meistens identisch) wenn man nur einen Speicherbereich beschreibt.

<Galgenhumor>
Hmmm, worst case könnte man die denn noch als Zufallszahlengenerator nutzen :D
</Galgenhumor>

Bei mir dauert es leider noch länger. Bekannter, der gefahren wäre, hat jetzt (hochdeutsch) die Kacke am Dampfen. Wasserrohrbruch und die Wohnung voll mit Handwerkern, da wäre ich auch nicht gefahren. Muss halt der Kurier von Reichelt los. Trotzdem ärgerlich. Irgendwie zieht sich bei mir grade alles wie ein Kaugummi :(
Aber ok, ein gutes hat's ja. Das Tablet wird gleich mit bestellt :)
 
Hi Tommy!

Nun ja, der Zufallsgenerator funktioniert aber nicht besonders zuverlässig.
In 99,9% alle Fälle sind die 255 Byte identisch.

Ein Positives hat das Ganze aber.....
Mir ist beim Experimentieren aufgefallen, dass mit meinem "fehlerhaften Programm" der WP-Pin bei den EEPROMs nicht funktioniert.
Selbst wenn dieser mit Vcc verbunden ist und eigentlich das Beschreiben des Speichers verhindern soll, werden die Daten manipuliert.
Vielleicht kann man den Effekt ja mal gebrauchen. :wink:


Grüße,
Cassio
 
Welche Eeprom's hast du denn genau? denn bestell ich mir da je einen mit.
 
Hi Tommy!

Die anderen EEPROMs sind aus der selben Serie....

Einmal das 24LC512 und das 24LC16.


Grüße,
Cassio
 
Alles klar, liegen beide im Korb :)
Dieses WE gehts los, und wenn ich Bahn fahren muss (würg) ^^

Hast du eigentlich schon irgendwo was gelesen ob und wie man die Größe ermitteln kann?
Schmeißen die vielleicht eine Art NACK bei falscher (also zu hoher) Adresse?
 
Hallo Tommy!

Gute Frage, ob die einen "Hinweis" bei zu hoher Adressierung geben.
Das müsste ich erst mit dem LA überprüfen.

Ich habe lediglich die Speicherbereiche absichtlich mal etwas höher gewählt....
Die Daten wurden dann einfach nicht gespeichert. :wink:
Also auch nicht einfach auf die unteren Speicherbereiche "verschoben".


Stellst du später deinen PY-Code für die Chipkarte dann hier ein?
Bin ja schon gespannt, ob es mit dem Raspi und der Chipkarte auch Probleme gibt, oder alles funktioniert.
Schade, dass ich mit der Himbeere noch nicht so weit bin.


Grüße,
Cassio
 
Gute Frage, ob die einen "Hinweis" bei zu hoher Adressierung geben.
Das müsste ich erst mit dem LA überprüfen.
...
Stellst du später deinen PY-Code für die Chipkarte dann hier ein?
Bin ja schon gespannt, ob es mit dem Raspi und der Chipkarte auch Probleme gibt, oder alles funktioniert.
Schade, dass ich mit der Himbeere noch nicht so weit bin.

Das wäre nett, ich hab sowas (LA) ja leider (noch) nicht. Aber das hat keine Eile :)
Erstmal muss ich da meine ersten Schritte machen, da kann ich ja auch mit festen Adressbereichen arbeiten wie du.

Und natürlich mach ich das :)
Ist doch der Sinn eines Forums, ein Geben und Nehmen. Du hast deinen Code ja auch schon veröffentlicht :)

Mach dir nicht so ein Kopf über das Früchtchen. Da ist nichts schweres bei. Wie du I²C/TWI und SPI "freischaltest" hatte ich ja schon in dem Anleitungen-Thread geschrieben. Grade weil du Basic (Bascom) gewohnt bist wirst du dich garantiert auch schnell in Python einfinden. Ok, es ist nur eine Interpreter Sprache (wie VB6 und davor), C oder Pascal wäre wohl performanter, aber was solls ;)
 
Hi Tommy!

Python, TCL/TK und Ähnliches ist bei mir leider schon ein paar Jahre her, aber ich werde mich da schon wieder reinfinden.
Darum mache ich mir um Python auch nur beschränkte Gedanken.

Mit der Aussage, dass ich mit der Himbeere noch nicht so weit bin, meinte ich nur die Hardwareseite.....
aber das wird sich auch bald erledigt haben. :wink:


Grüße,
Cassio
 
Aso, denn hatte ich das falsch verstanden.
Hardwareseitig wirst du schätze ich mal stark nur ein paar Kabel brauchen und die 2 PullUp's. Die Chips sollten ja auch mit 3,3V laufen. Für den Port Expander hab ich auch die 3,3V vom Pi abgegriffen, ohne Probleme, obwohl da sogar noch das LCD mit Hintergrundbeleuchtung dran hängt.

Ihre Bestellung mit der Rechnungsnummer xxxxxxx (I-Net-Nummer xxxxxx) wurde heute um 11:18 Uhr dem
Kurier übergeben.
Wird also wohl so gegen 17 - 18 Uhr eintrudeln :)
Das Grundgerüst des Python Scripts steht auch schon. Geht also bald los.
 
Hast du eigentlich schon irgendwo was gelesen ob und wie man die Größe ermitteln kann?
Schmeißen die vielleicht eine Art NACK bei falscher (also zu hoher) Adresse?


Hallo Tommy!

Also mit der Größe bin ich mir auch nicht sicher.....

Das 24LC512 kann ich ja mit dem vollen Word (&HFFFF) adressieren.... also 0 bis 65535.
Alle Speicherbereiche lassen sich daher auch beschreiben.

Die Pausen habe ich übrigens mal minimiert bzw. herausgenommen.
Momentan habe ich nur eine 1ms Zwangspause zwischen dem Adress-High-Byte und dem Adress-Low-Byte....
und eine Pause vor der nächsten Write-Anweisung, da ich momentan das Page-Write nicht verwende.



Bei der Chipkarte (64kbit = 8kByte) komme ich aber über die 8192 Bytes hinaus. :hmmmm:
Wenn ich also den Adressbereich von 0 bis 8191 überschreite, werden trotzdem die gesendeten Werte abgespeichert.

Da aber das Beschreiben eines einzelnen Speicherbytes immer noch nicht funktioniert bin ich mir nicht sicher, ob das auch wirklich stimmt.
Es werden zumindest keine anderen Speicherbereiche überschrieben.


Schade, dass ich keine Lötstation mit in den Urlaub genommen habe, dann hätte ich die freien Kontakte einfach mal mit GND belegen können. :wink:
Ich habe langsam den Verdacht, dass es nur daran liegen kann.
Schließlich ist es egal, was ich softwareseitig so ändere.


Grüße,
Cassio
 
Also so viel kann ich schon mal sagen. Mit Zwangspausen, das wird in Python nix. Die Implementierung ist leider recht suboptimal gelößt, man hat keinen Zugriff drauf. Nur Byte Array senden oder empfangen. Start und Stopp wird intern geregelt und ist leider nicht zugreifbar :(
Naja, zur Not halt Software-TWI. Aber mal schaun, dauert ja nich mehr lang :)
 
Soo, angeschlossen ist er schon mal (der 24LC16B erstmal). Wie gesagt einfach nur die Strippen und 2 Pull-Up's.
Was mich verwundert: Der Chip meldet sich auf 8 I²C Adressen 0.o
i2c_float.png
Adressleitungen liegen auf GND, WP "fliegt" noch, so weit bin ich noch nicht.
 
Hallo Tommy!

Also ein wenig stehe ich mit dem Speicher des 24LC512 immer noch auf Kriegsfuß.

Generell geht alles, nur der obere Grenzbereich (über 63000) macht Probleme.
Einzeln passt es, aber in schneller Folge kommt da auch nur Mist raus.

Bin ja mal gespannt was bei deinem Testaufbau so rauskommt.
Hoffentlich klappt es damit besser.

Mich frusten die EEPROMs jedenfalls gerade.


Grüße,
Cassio
 
Was mich verwundert: Der Chip meldet sich auf 8 I²C Adressen 0.o

Hi Tommy!

Das ist schon OK so!

Der Chip hat zwar offiziell nur eine Adresse &HA0, aber acht Bänke mit 8 x 256 Bytes die einzeln über die "Adresse" angesteuert werden.
Das ist auch der Grund, warum du nur ein einziges EEPROM verwenden kannst. Das 24LC16 benötigt den gesamten Adressbereich. :(


Grüße,
Cassio
 
Also ich hab jetzt mal ein 24LC16B-I/P an mein Raspberry getackert und damit rum gespielt. Da ich Python immer noch lerne hat das am längsten gedauert und der Code könnte bestimmt schöner sein :rolleyes:

Also:
Das was ich sagte mit SMBus. Das ist fürn A....Sitzorgan. Viel zu unflexibel. Für so einen ollen PortExpander reichts, aber ... naja. Ich geh da später noch genauer drauf ein.
Sprich musste ich erst eine Alternative suchen und bin sogar fündig geworden: quick2wire.
Wesentlich besser dokumentiert (könnte trotzdem besser sein) und bietet wesentlich mehr Optionen an; zumindest beim I²C Bus. Andere Bereiche habe ich noch nicht getestet. Einziger Nachteil: Es läuft ausschließlich unter Python3. Man muss also ggf. in der Entwicklungsumgebung ein paar Änderungen vornehmen weil viele Python2 verwenden.

Anyway, meine Verkabelung:
Code:
Raspberry Pi:
         _____
+3,3V -- |O O|
SDA ---- |O O|
SCL ---- |O O|
         |O O|
GND ---- |O O|
         |...|


EEPROM (24LC16B-I/P)
      __ __
GND --| V |-- +3,3V
GND --|   |-- GND
GND --|   |-- SCL + R an +3,3V
GND --|   |-- SDA + R an +3,3V
      ¯¯¯¯¯
Das Script:
http://devs-on.net.nopaste.dk/p63469
Anhang anzeigen eeprom.zip
Wegen Syntax Highlighting extern, liegt aber auch hier als Anhang.
Ausführen in einer Konsole mit "sudo python3 eeprom.py"
Das HexView läuft noch nicht ganz rund wenn eine "krumme" Anzahl an Bytes (nicht durch 16 teilbar) angezeigt werden sollen. Nur zur Info.

Fazit:
Ich hab alles probiert. Vollständiges Beschreiben, teilweises überschreiben, bei mir geht alles.
Als nächstes wird der 24LC512-T/P getestet und dann die Karten.

Für die die es eilig haben ^^
Installiert hab ich das quick2wire nach dieser Anleitung:
http://quick2wire.com/articles/how-to-add-quick2wire-as-a-raspbian-software-source/
Die Pakete selbst (es sind 2) hab ich denn aber über synaptic gesucht und installiert.

Edit: Das Script hat noch einige Fehler durch die Migrierung von Python2 auf 3 (Einstellungen gehen nicht) und mit den größeren Chips wirds auch nicht. Klappt nur mit den 24xx16ern. Falsche Endianess oder wie das geschrieben wird. Fix wird folgen :)

Edit 2: Das Script und der Link dazu hab ich geändert. Sollte jetzt alles laufen :)
 
So, ich hab den Code im obrigem Beitrag geändert, der läuft jetzt fehlerfrei (zumindest soweit ich weiß ^^).
Sind jetzt auch alle Funktionen eingebunden, man kann also auch von Dateien lesen / schreiben (als Binärdatei).
Über das Konfig Menü kann man Dinge wie Anzahl der Adress-Bytes und Page Size einstellen, sollte also eigentlich mit jedem EEPROM laufen. Getestet hab ichs bisher mit "24LC16B-I/P" und "24LC512-T/P".
Ich habe mit dem Auslesen und Beschreiben (ob nun komplett oder teilweise) keine Probleme. Komisch was da bei dir los ist. Probiers einfach mal am RasPi um ein defekten Chip auszuschließen :)

Der Code ist mit fast 600 Zeilen doch etwas länger geworden, aber vieles ist nur User Interface und Kommentare. Die relevanten Routinen sind die die mit ee beginnen (los gehts bei Zeile 117).

Lesen ist simpel. Start - Adressbyte(s) senden - Angegebene Anzahl an Daten empfangen - Stop.
Schreiben (Byte Mode): Start - Adressbyte(s) senden - Datenbyte senden - Stop - 0.01s warten.
Schreiben (Page Mode): Start - Adressbyte(s) senden - Datenbytes senden - Stop - 0.01s warten.
Das Lesen auf dem Raspberry ist etwas umständlicher weil (so vermute ich) der Lesepuffer zu klein ist für den kompletten 512er. Daher lese ich den in Teilen ein und setze das nachher zusammen.

Zu den Adressen noch mal.
Was mich auch noch verwundert ist dass der 16er sich auf 8 Adressen anmeldet (warum denn überhaupt die Pins für die Adresse? Sind doch sinnfrei), der 512er meldet sich aber ausschließlich brav auf seiner Adresse. Die kann ich mit den Adressleitungen auch verändern wie ich möchte. Aber es stimmt schon, die 8 Adressen sprechen 8 verschiedene Speicherbänke in dem 16er an, hab ich grade noch mal getestet weil ichs erst nicht glauben konnte ^^
Wer kommt nur auf so einen Unsinn? Ohje. Naja, wenn mans weiß :)
Nimmt man halt nen Größeren mit echter Adresse wenn man mehrere an einem Bus haben möchte.
 
Hallo Tommy!

Es wundert mich jetzt gar nicht, dass es bei dir mit der Himbeere geht.
Ich hatte das schon erwartet. :wink:


Interessanter als der Programmcode wäre für mich viel mehr, wie dein Signalweg aussieht.
Da du aber keinen LA hast, hilft mir die Info das es bei dir geht leider nicht weiter.

Ergo muss ich mal schauen, dass ich mir einen kleinen Adapter für meine Himbeere baue, um die passenden GPIOs abgreifen zu können.
Einen separaten 9517 (Leveltranslater) habe ich hier auch noch.
Danach kann ich es ja mal mit Python versuchen.


Danke erst mal, für deine erste Info.

Grüße,
Cassio
 
Mit Signalweg assoziiere ich eher wie ich den angeklemmt habe?!
Mit simplen "Strippen", also kein IC (wie Bustreiber, Level Shifter, ...) dazwischen. Meine EEPROMs sitzen direkt am Raspberry, werden auch von dem mit 3,3V versorgt. Keinerlei externe Spannungsquellen o. Ä. :)
So wie ich es in dem Ascii-Art oben auch gezeichnet habe.
Kabel aus dem Pi raus, in's BreadBoard rein wo auch der Speicher sitzt, dann nur noch die 2 Widerstände, das wars schon. Da er den Chip ja selber versorgt kann ja nix kaputt gehen.

Mit einem LA kann ich leider nicht dienen. Außer Dirk hat grade mal ne soziale Ader und schickt einem armen Hobbyentwickler mal einen, so als Spende :D

Nein, Scherz bei Seite, ich mein ja auch dass du das jetzt mit dem Script selber testen kannst was bei deiner Schaltung schief gelaufen ist / schief läuft.
Noch mehr kann ich dir leider nicht helfen. Ok, man kann den Pi als LA verwenden, aber dann würde der für die Messdauer quasi stillgelegt werden (alle Interrupts aus, es läuft nur noch der LA), ergo würde währenddessen I²C nicht gehen.
Aus Bascom bin ich schon viel zu lange raus. Aber vielleicht bekomm ich da auch noch mal was zum laufen. Ich würde ja schon fast vermuten es liegt an den Bascom Routinen, aber das hattest du ja mit dem LA überprüft... Komisch alles.

Wetten der nächste Post kommt von Dirk? ^^
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)