I2C seriële EEPROM – 256 kb

Sketch

http://arduino.cc/playground/Code/I2CEEPROM

I2C

I2C = Inter-Integrated Circuit

I2C = “i-squared-Cee”

I2C = two-wire interface

I2C = TWI

I2C = Een protocol dat meerdere IC’s op twee ‘lijnen’ zet: KLOK (SCL) en DATA (SDA)

I2C = Bedacht door Philips.

I2C = Een protocol waarbij DATA-IN  en DATA-UIT over dezelfde lijn gaan (SDA).

I2C = Een protocol waarin de synchronisatie van de klok- en datalijn hardwarematig vastligt in het ontwerp van de ATmega processoren. Hieronder een plaatjes uit de datasheet van de ATMega328:

Hier een quote uit de datasheet van de Arduino Mega 2560:

TWI: pin nummer 20 (SDA) and pin nummer 21 (SCL). Support TWI communication using the Wire library. Note that these pins are not in the same location as the TWI pins on the Duemilanove or Diecimila.

I2C = Arduino Uno

  • analoog-pin 5 = klok = scl
  • analoog-pin 4 = data = sda

I2C: Arduino Mega2560

  • analoog-pin 21 = klok = scl
  • analoog-pin 20 = data = sda

EEPROM

hier een plaatje uit de datasheet van de 24LC256 geheugen IC.

Het mag nu DUIDELIJK zijn hoe doe boel aan elkaar moet:

  • SDA naar SDA
  • SCL naar SCL
  • Vcc naar 5 Volt
  • Vss naar Aarde

Maar:

Wat met de WP, A0, A1 en A2 Pin van de EEPROM?

de datasheet zegt:

Write-Protect (WP)
This pin must be connected to either VSS or VCC. If  tied to VSS, write operations are enabled. If tied to  VCC, write operations are inhibited but read operations are not affected.

Dus:

  • WP naar grond = schrijven en lezen
  • WP naar 5 Volt = alleen lezen

Kort:

Over pin A0, A1 en A2: deze bepalen mede het adres van de chip op de I2C SDA lijn.

Nu langer: Je kunt je dit voorstellen als een huis vol met mensen (de IC’s) met maar één telefoonlijn (SDA). Als je wilt dat bijvoorbeeld Pietje (geheugenchip 1) en niet de anderen aan de lijn komt, dan moet je beginnen met zijn naam te roepen.

De eerste byte die de Arduino op de SDA-lijn zet, is dan ook de naambyte van de EEPROM.

De communicatie over een SDA lijn begin wanneer 5 volt op de SDA lijn wordt weggehaald als de SCL lijn 5 volt heeft. Hier het plaatje uit de datasheet:

Na deze eerste “klop op de I2C-deur,

  • volgen vier bits (1010) die uniek voor eprom zijn.
  • daarna komen de 3 bits die pin A0, A1 en A3 adresseren.
  • Als laatste nog een bit die bepaald of de opdracht lezen of schrijven is.

Dat zijn er ach na de eerste “klop-bit”. Hier het plaatje uit de datasheet.

De ACK is een klopje terug van de EEPROM als alles goed is gegaan.

Nu zou je verwachten dat de naambyte van EEPROM dus met een 1 begint en eindigd met 1 of 0 van lezen of schrijven. Maar hier een quote uit de WIRE library van de arduino IDE:

There are both 7- and 8-bit versions of I2C addresses. 7 bits identify the device, and the eighth bit determines if it’s being written to or read from. The Wire library uses 7 bit addresses throughout. If you have a datasheet or sample code that uses 8 bit address, you’ll want to drop the low bit (i.e. shift the value one bit to the right), yielding an address between 0 and 127.

Dus

I2C – EEPROM heeft niet naamadres 1010 000 0 – 1010 111 0. zie tabel hieronder:

hier een voorbeeldcode:

blabla = i2c_eeprom_read_byte(0×50, addr);

waarbij blbla de waarde van geheugenplaats addr krijgt.

addr ligt tussen de 0 en 32 kilobyte ( = 0×0000 tot 0×8000)

En hier hoe je 4 EEPROMmetjes op een breedboard zet:

  • EEPROM_1 = i2c_eeprom_read_byte(0×50, addr);
  • EEPROM_2 = i2c_eeprom_read_byte(0×51, addr);
  • EEPROM_3 = i2c_eeprom_read_byte(0×52, addr);
  • EEPROM_4 = i2c_eeprom_read_byte(0×53, addr);

En je kunt dus tot 8 gaan.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>