Pages: [1]   Go Down
Author Topic: I2C EEPROM geht nicht?  (Read 1145 times)
0 Members and 1 Guest are viewing this topic.
Hamburg, Germany
Offline Offline
Full Member
***
Karma: 3
Posts: 192
Hello world!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe hier einen 24C08 (meine ersten Gehversuche mit I2C) und irgendwie funktioniert das nicht smiley-sad 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:
       +----  ----+
GND <- O    --    O -> 5V
GND <- O          O -> -
GND <- O          O -> A5
GND <- O          O -> A4
       +----------+     




Sketch:

Code:
#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;
}
Logged


Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21939
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

... - 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
 
Logged

Hamburg, Germany
Offline Offline
Full Member
***
Karma: 3
Posts: 192
Hello world!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Hamburg, Germany
Offline Offline
Full Member
***
Karma: 3
Posts: 192
Hello world!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
  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:
  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();
  }
Logged


Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: April 22, 2011, 06:40:15 am by Marcus W » Logged


Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21939
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: