PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : EEPROM lesen/schreiben



MechMac
03.01.2011, 21:14
Hallo,

ich wollte nun mal auf meinem Pollin Evaluationboard 2.01 den EEPROM nutzen. Dazu habe ich (ebenfalls von Pollin) einen M24C08 gekauft.

Nun stehe ich vor dem Problem das ich nachdem ich einiges dazu gelesen habe, nun gar nicht mehr weiß wie ich das anfangen soll.

Der wird ja über I2C angesteuert. Ich nutze für einen Servocontroller die
i2cmaster.h von Peter Fleury und hatte gehofft damit etwas anfangen zu können.
Nun lese ich aber etwas von eeprom_read_byte auf microcontroller.net. Soll ich das nun wie in dem Tutorial da machen, oder über I2C ?
Wo ist der Unterschied? Wenn es doch über I2C angesprochen wird, warum gibt es dann von AVR irgendwelche Lib`s dazu?

Ich hatte bereits verzweifelt versucht die Adresse aus dem Datenblatt zu entnehmen. Außer 1010b steht da irgendwie nix. Reicht das denn?
Bei dem Servocontroller brauche ich eine Hauptadresse zum ansprechen und dann noch weitere Adressen, das der überhaupt weiß, wo ich was hinschreiben möchte.

Für`s erste würde es mir reichen einfach nur eine Zahl zu schreiben und wieder auszulesen. Nur um das erst mal zu verstehen.

Ich hatte mir das eigentlich vorgestellt wie folgt:

i2c_start_wait( 0xC2+ I2C_WRITE);
i2c_write(address); //Adresse
i2c_write(value); //Wert
i2c_stop();

Mein Gedanke war, die 0xC2 vom Servocontroller mit der 1010b aus dem Datenblatt zu ersetzen. Für mich sieht das 1010b nicht wie eine gültige Adresse aus, aber was solls.
Und wo schreibe ich nun hin? Sind die INIT Adresse und die Write Adresse die selbe?

Wäre nett, wenn mich dazu mal jemand aufklären könnte.

Gruß

Hubert.G
03.01.2011, 22:54
Nun lese ich aber etwas von eeprom_read_byte auf microcontroller.net.Das bezieht sich auf den EEPROM im Kontroller.
Die Device-Adresse sollte A8 sein?
Vielleicht kannst du mit dem hier was anfangen:

/************************************************** **************************
Title: Access serial EEPROM 24C02 using I2C interace
Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
Date: 9-Mar-2003
Software: AVR-GCC 3.3
Hardware: AT90S8515 at 4 Mhz, any AVR device can be used

Description:
This example shows how the I2C library i2cmaster.S can be used to
access a serial eeprom.
Based on Atmel Application Note AVR300, adapted to AVR-GCC C interface

************************************************** ***************************/
#include <avr/io.h>
#include "i2cmaster.h"


#define Dev24C02 0xA2 // device address of EEPROM 24C02, see datasheet


int main(void)
{
unsigned char ret;


DDRB = 0xff; // use all pins on port B for output
PORTB = 0xff; // (active low LED's )

i2c_init(); // init I2C interface

/* write 0x75 to eeprom address 0x05 (Byte Write) */
ret = i2c_start(Dev24C02+I2C_WRITE); // set device address and write mode
if ( ret ) {
/* failed to issue start condition, possibly no device found */
i2c_stop();
PORTB=0x00; // activate all 8 LED to show error */
}else {
/* issuing start condition ok, device accessible */
i2c_write(0x05); // write address = 5
i2c_write(0x75); // ret=0 -> Ok, ret=1 -> no ACK
i2c_stop(); // set stop conditon = release bus

/* write ok, read value back from eeprom address 0x05, wait until
the device is no longer busy from the previous write operation */
i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
i2c_write(0x05); // write address = 5
i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode
ret = i2c_readNak(); // read one byte
i2c_stop();

PORTB = ~ret; // output byte on the LED's

/* write 0x70,0x71,072,073 to eeprom address 0x00..0x03 (Page Write),
wait until the device is no longer busy from the previous write operation */
i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
i2c_write(0x00); // write start address = 0
i2c_write(0x70); // write data to address 0
i2c_write(0x71); // " " " " 1
i2c_write(0x72); // " " " " 2
i2c_write(0x74); // " " " " 3
i2c_stop(); // set stop conditon = release bus

/* write ok, read value back from eeprom address 0..3 (Sequencial Read),
wait until the device is no longer busy from the previous write operation */
i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
i2c_write(0x00); // write address = 0
i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode
ret = i2c_readAck(); // read one byte form address 0
ret = i2c_readAck(); // " " " " " 1
ret = i2c_readAck(); // " " " " " 2
ret = i2c_readNak(); // " " " " " 3
i2c_stop(); // set stop condition = release bus

PORTB = ~ret; // output byte on the LED's
}

for(;;);
}Bezieht sich zwar auf einen 24C02 sollte aber sonst passen.

MechMac
04.01.2011, 20:51
Das wird immer verzwickter. Ich habe nun folgendes Herausgefunden:

Dieses EEPROM was ich da habe wird nicht mit 8Bit adressiert, sondern mit 10 Bit.

Ein normaler Zugriff über 8Bit würde lauten:

Quelle(http://www.mikrocontroller.net/topic/109417)
[.............]
Peter Fleury übergibt diese 8-Bit mit dem ersten i2c_write -Befehl. Hier
i2c_write(0x00); Es wird also die Speicherstelle 0x00 ausgewählt. Mit
den nächsten Befehlen werden dann Buchstaben aufs EEPROM geschrieben.

i2c_start_wait(Dev24C02+I2C_WRITE);
i2c_write(0x00); // write start address = 0
i2c_write(0x70); // write data to address 0
i2c_write(0x71); // " " " " 1
i2c_write(0x72); // " " " " 2
i2c_write(0x74); // " " " " 3
i2c_stop();
[.............]

Genau so war das bei meinem Servo Controller auch. Erst die Geräteadresse, dann die Speicheradresse und dann die Daten.


So, nun kommt dieses 10Bit Wunderding:

Quelle(http://www.mikrocontroller.net/topic/109417)
[.............]
AT24C08, 8K SERIAL EEPROM: Internally organized with 64 pages of 16
bytes each, the 8K requires a 10-bit data word address for random word
addressing. 4K(512x8)=64x16x8

Dabei sind zwei Bits in der Device Adresse. Hier P1 und P0
1010 A2 P1 P0 R/W

Du übergibst somit mit der Device-Adresse schon ein Teil und mit
i2c_write(0x00) den Rest der Speicheradresse.
[.............]


Damit komme ich nicht klar.
Ist folgendes alles die Adresse? 1010 A2 P1 P0 R/W
Oder ist das ein(e) Schema/Maske?

Hier ein Auszug aus dem Datenblatt meines EEPROMS:
(http://www.pollin.de/shop/downloads/D100756D.PDF)
[.............]
The Device Select Code consists of a 4-bit Device Type Identifier, and a 3-bit Chip Enable
“Address” (E2, E1, E0). To address the memory array, the 4-bit Device Type Identifier is
1010b.
[.............]


Immerhin deckt sich diese "1010" schon mal mit dem Beitrag von mikrocontroller.net
Was hat das nun mit diesem E0, E1,E2 auf sich?
Hängen die mit den "64 Pages" zusammen?
Und das R/W heißt wohl ob man Lese- oder Schreibzugriff möchte.
Nur wie schreibt man das alles in die adresse?


Gruß

Hubert.G
05.01.2011, 10:02
Der 28C08 hat nur ein E2, mit A1 und A2 schaltest du zwischen den Blöcken um.
Das 1010 ist in hex ein A, daher A8.

MechMac
06.01.2011, 20:59
Nach vielen Versuchen ist mir wenigstens ein Teilerfolg gelungen.

Vorweg: mit der Adresse A8 geht es nicht. Wenn man sie Aufdröselt:
10101000
1010 ist die Adresse, die auch schon im Datenblatt steht, soweit okay.
Kommen wir zum Auszug aus dem Datenblatt:
M24C08 Select Code 1 0 1 0 E2 A9 A8 RW
Mit den letzten vier Bits von der Adresse A8 würde ich Bit E2 aktivieren. Auch das habe ich irgendwo gelesen, dass das Bit E2 bei dem M24C08 verwendet werden soll (muss). Trotzdem geht es nicht.

Ich wollte entnervt aufgeben als ich es ein letztes Mal mit der Adresse A2 probieren wollte:
10100010
Danach würde das Bit A8 statt Bit E2 verwendet. Damit geht es. Aber vermutlich nur die ersten 256 Adressen. Das habe ich nicht getestet, da mir 4 Byte vollkommen reichen.



Ich musste grad feststellen das das sehr ätzend ist, das es einmal die Device Adresse A8 gibt und einmal das Bit A8. Das kann bei einer Fehlerbeschreibung ganz schön zu Verwirrung führen weil ohne Erklärung niemand weiß wovon man spricht.

Zufrieden bin ich nicht mit dem Ergebniss, aber wenigstens kann ich nun ein paar Zahlen schreiben und lesen.

uwegw
06.01.2011, 23:07
Das habe ich nicht getestet, da mir 4 Byte vollkommen reichen.

Und wieso bleibst du dann nich gleich im internen EEPROM des AVRs? Der einzige Grund für ein externes EEPROM wäre, dass man mehr Speicher braucht als intern vorhanden ist... und wenn das der Fall ist, dann braucht man meist gleich so viel mehr Speicher, dass sich ein SD-Karte lohnt. Die Zeiten der externen EEPROMs sind langsam vorbei, sie sammen noch aus der Ära, als noch nicht alle Mikrocontroller inegriertes EEPROM hatten...

Jaecko
06.01.2011, 23:12
Der einzige Grund für ein externes EEPROM wäre, dass man mehr Speicher braucht als intern vorhanden ist.

Nicht nur. Weiterer Vorteil: Ext. EEPROM ist austauschbar, sollte man den mal kaputtschreiben. Aber da wärs mal interessant: Wer hat schon mal den internen EEPROM im normalen Betrieb zerlegt?

Hubert.G
07.01.2011, 10:24
Bei einem Mega16 könnte man, bei den garantierten 100000 Schreib/Lese Zyklen, den EEPROM 10 Jahre lang täglich 27 mal neu beschreiben.