Smart (Chip)-card mit 256Byte EEPROM auslesen newbie am Werk

Hallo zusammen,

habe da ein Problem eine Chipkarte auszulesen. Da auf der Karte ein EEPROM ST14C02C verbaut ist, gehe ich so vor, als wollte ich z.B. einen 8 beinigen DIP EEPROM-Speicherchip (z.B. 24LCXXX) auslesen.

Hier das Datenblatt:
Datenblatt ST14C02C

Mit Hilfe des I2C Scanners finde ich an den Adressen 0x50 bis 0x57 jeweils ein Gerät.

Um den Inhalt des EEPROM auszulesen verwende ich folgende sketch:

#include <Wire.h> 

#define disk1 0x50

void setup(void){
Serial.begin(9600);
Wire.begin();
unsigned int address = 0;
for (address = 0; address < 127; address++) 
{  
Serial.print(address);
Serial.print("\t"); 
Serial.print(readEEPROM(disk1, address), HEX);
Serial.println(); 
}
}
void loop()
{
}
byte readEEPROM(int deviceaddress, unsigned int eeaddress )
{
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
//Wire.write((int)(eeaddress >> 8));   // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();

Wire.requestFrom(deviceaddress,1);

if (Wire.available()) rdata = Wire.read();
return rdata;
}

Hier einmal der Inhalt wie ich ihn mit einem Chipdrive auslese:

0000:03 E8 00 01 00 01 07 D3 00 01 00 26 07 CA 03 DE 
0010:11 AA 03 DE 00 00 03 DE 00 00 00 00 45 55 03 E8 
0020:00 00 07 CA 00 00 11 AA 00 00 00 00 00 00 00 00 
0030:00 00 00 8C 00 02 00 03 00 00 00 00 00 00 00 00 
0040:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
0050:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
0060:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
0070:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
0080:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
0090:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
00A0:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
00B0:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
00C0:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
00D0:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
00E0:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
00F0:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

Wenn ich //Wire.write((int)(eeaddress >> 8)); // MSB
nicht auskommentiere, zeigt jede Adresse den Wert 255 bzw. FF.
Auskommentiert erhalte ich die richtigen Werte, bis auf die erste
Zeile, hier stimmt etwas nicht. Vermutlich hängt es mit der bitshift
Operation zusammen?

0000: 61 FF FF FF FF FF FF FE 00 10 00 26 07 CA 27 06 
0010: Ab hier stimmen die Werte........

Ich komme einfach nicht auf die Lösung obwohl es bestimmt ganz trivial ist :wink:

  for (byte address = 0; address < 127; address++) {
    Serial.print(address);
    Serial.print("  ");
    Serial.print(sizeof((int)(address >> 8)));   // MSB  Serial.print("Recording position: ");
    Serial.print("  ");
    Serial.println(sizeof((byte)(address >> 8)));   // MSB  Serial.print("Recording position: ");
  }

Ich gehe davon aus, Du erzeugst mit (int) zwei Byte. Definiere zum Testen eine Byte-Variable, damit Du sicher bist, es ist ein Byte. Wenn das das Problem löst Bingo! Wenn nicht, vergißt Du diesen Beitrag.

Du solltest hier nur ein Byte schicken:

Wire.write((byte)(eeaddress & 0xFF));

Es gibt nämlich Wire.write(int). Das sollte man nicht verwenden. Weiß aber nicht ob es daran liegt.

Das mit MSB/LSB ist so oder so Quatsch. Erwartet werden 2 Byte. Das erste Byte (device select) wird durch beginTransmission() gesendet. Das zweite Byte ist ein Byte für die Speicherzelle per write().

Du hast ein 256 Byte EEPROM. Es geht also nur von 0-255. Der Parameter könnte also auch ruhig Byte sein statt int. Und EEPROMs die mehr Speicher haben, sind oft in mehrere Seiten aufgeteilt. Dann schickt man für jede Seite eine andere Adresse per beginTransmission(), aber die Speicherzelle in der Seite geht immer noch von nur von 0-255.

Es gibt auch einen "sequential random read" Modus. Da muss man nur einmal die Anfangs-Adresse setzen und kann dann immer wieder ein Byte anfordern.

Danke für eure Antworten!

Habe mich gestern noch an eure Vorschläge gemacht.

@agmue:

Ergebnis int: 2
Ergebnis byte: 1

@Serenifly:

Habe das Wire.write(int) durch Wire.write(byte) ersetzt, das bleibt sich leider vom Resultat her gleich.
Vielleicht versuche ich dieser Tage mal den "sequential random read mode".....

Ansonsten bin ich immer noch für jede kreative Idee zu haben die ich ausprobieren kann :wink: