Go Down

Topic: I2C EEPROM geht nicht? (Read 1 time) previous topic - next topic

sui

Ich habe hier einen 24C08 (meine ersten Gehversuche mit I2C) und irgendwie funktioniert das nicht :( ich bekomme einfach kein Byte ausgelesen, Wire.available() ist offenbar immer false.

- Adresse sollte laut Datenblatt 1010 + die drei Pins die auf GND und somit 0 sind  = 1010000 (binär) = 80 (dezimal) sein. Ist in den meisten Anleitungen im Netz und in meinem schlauen Arduino Buch auch so, zwar mit einem anderen Chip (24LC..) aber die scheinen ja kompatibel zu sein, oder? Abgesehen davon hab' ich auch alle Addressen von 0..255 ausprobiert, ging auch nicht.

Aufbau:

PIN 1,2,3,4 => GND
PIN 5 => Aruino PIN A04
PIN 6 => Arduino PIN A05
PIN 7 => unbelegt oder GND (beides ausprobiert)
PIN 8 => 5V
Code: [Select]

       +----  ----+
GND <- O    --    O -> 5V
GND <- O          O -> -
GND <- O          O -> A5
GND <- O          O -> A4
       +----------+     





Sketch:

Code: [Select]

#include <Wire.h>

void setup() {
  Serial.begin(9600);
  Wire.begin();
}

void loop() {
  // schreiben
  i2c_write_byte(80, 1, 'a');
  delay(1000);
 
  // lesen
  byte inByte = i2c_read_byte(80, 1);
  Serial.println(inByte);
  delay(1000);
}


void i2c_write_byte( int device, unsigned int eeaddress, byte data ) {
  Wire.beginTransmission(device);
  Wire.send((int)(eeaddress >> 8)); // MSB
  Wire.send((int)(eeaddress & 0xFF)); // LSB
  Wire.send(data);
  Wire.endTransmission();
  delay(10);
}

byte i2c_read_byte( int device, unsigned int eeaddress ) {
  byte rdata = 'x';
  Wire.beginTransmission(device);
  Wire.send((int)(eeaddress >> 8)); // MSB
  Wire.send((int)(eeaddress & 0xFF)); // LSB
  Wire.endTransmission();
  Wire.requestFrom(device,1);
  if (Wire.available()) {
    Serial.print("jaaa!");
    rdata = Wire.receive();
  }
  return rdata;
}

uwefed


... - Adresse sollte laut Datenblatt 1010 + die drei Pins die auf GND und somit 0 sind  = 1010000 (binär) = 80 (dezimal) sein. Ist in den meisten Anleitungen im Netz und in meinem schlauen Arduino Buch auch so, zwar mit einem anderen Chip (24LC..) aber die scheinen ja kompatibel zu sein, oder? Abgesehen davon hab' ich auch alle Addressen von 0..255 ausprobiert, ging auch nicht.


Zuerst mal sind die Adressen der I2C Bausteine 7 Bit lang nicht 8 Bit.  
101 0000 ist nicht 0x80 sondern 0x50 (hex); Außerdem sind nicht alle 3 Adressleitungen nur für die I2C-Adresse da, sondern das EEprom 24C08 ist in 4 Blöcke mit jeweils eigenen I2C Adressen eingeteilt, also 0x50, 0x51, 0x52 und 0x53 also jeweils 256 Bytes. (falls Du die vollen 1kByte verwenden willst).

Es gibt auch den Sketch der den ganze I2C-Adressraun scannt falls mal Zweifel an der Adresse bestehen: http://todbot.com/blog/2009/11/29/i2cscanner-pde-arduino-as-i2c-bus-scanner/

Grüße Uwe


sui

Danke, der Scanner ist klasse. Immerhin alles richtig verkabelt, denn bei 80 bis 83 findet er was.

sui

Ok, ich habe also 4 Geräte 80, 81, 82, 83 mit jeweils 256 Adressen 0..255 und kann da jeweils ein Byte schreiben/lesen.

Folgendes geht auch:

Code: [Select]

  Wire.beginTransmission(device);
  Wire.send(eeaddress);
  Wire.endTransmission();
  Wire.requestFrom(device,1);
  if (Wire.available()) {
    rdata = Wire.receive();
  }


Aber ich verstehe den Code aus den gängigen Beispielen (die so bei mir nicht funktionieren) nicht. Kann mir jemand die Zeilen 2+3 im folgenden Snippet erklären?

Code: [Select]

  Wire.beginTransmission(device);
  Wire.send((int)(eeaddress >> 8)); // MSB
  Wire.send((int)(eeaddress & 0xFF)); // LSB
  Wire.endTransmission();
  Wire.requestFrom(device,1);
  if (Wire.available()) {
    rdata = Wire.receive();
  }

Marcus W

#4
Apr 22, 2011, 12:39 am Last Edit: Apr 22, 2011, 01:40 pm by Marcus W Reason: 1
Die zeile 2 und 3 sind lediglich zwei arten einen EPROM anzusteuern: MSB ist most significant bit, LSB steht für least significant bit. in einer Binärzahl ist das MSB immer die erste stelle, das LSB die letzte Stelle - MSB und LSB stellt einfach die Reihenfolge dar, von deraus gezählt bzw gesendet wird.

Siehe auch:
http://de.wikipedia.org/wiki/Bitwertigkeit

uwefed

Muß mich entschuldigen;
"1010000 (binär) = 80 (dezimal)" stimmt, habs mit Hex verwechselt.

Quote
Ok, ich habe also 4 Geräte 80, 81, 82, 83 mit jeweils 256 Adressen 0..255 und kann da jeweils ein Byte schreiben/lesen.

Ja genau; diese Art von EEprom macht das so; größere Eproms haben dann eine 2 Byte Adresse für die Speicherzelle, die Du über I2C überträgst.
Grüße Uwe

Go Up