Forum: Mikrocontroller und Digitale Elektronik Externes serielles EEPROM


von schurli (Gast)


Lesenswert?

Hallo

Ich will mit einem Atmega64 ein serielles EEPROM (SPI) beschreiben, 
lesen.
Wenn ich über RS232 einen Text an den Atmega sende, soll dieser diesen 
Text in den EEPROM speichern.
Es sollen ~100 Telefonnummern und ein Namen an den Atmega gesendet 
werden.
Der Atmega soll anschließend an die Nummern die als String im EEPROM 
vorliegen eine SMS versenden.

Hatt jemand ein gut dokumentiertes Programm für serielle EEPROMS?
Ich verwende ein 25AA512 von Microchip.
Wie kann ich einen String ins EEPROM schreiben?

Vielen Dank

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Schau Dir das Datenblatt vom EEPROM an und forme das benötigte Protokoll 
in der Firmware des Controllers nach. Das ist ein wenig Fleißarbeit und 
das kannst Du selber. Wie das SPI funktioniert, steht im Datenblatt des 
ATMega. Wenn Du das mal programmiert hast und kommst nicht weiter, 
kannst Du ja wieder fragen.

von schurli (Gast)


Lesenswert?

hast du vielleicht ein beispielprogramm?

von Dennis (Gast)


Lesenswert?

Junge raff es doch endlich:

selber machen macht erst schlau. Dumme Fragen werden nun mal ungern 
beantwortet... Wenn du nicht in der Lage bist ein Software-SPI zu 
schreiben, dann hast du ein falsches Hobby gewählt. Selber suchen gehört 
nun mal dazu. Die Seite für alle deiner Fragen: http://www.gidf.de

von schurli (Gast)


Lesenswert?

@Dennis
Investiere deine Zeit anderst als dumme Sprüche zu klopfen.

Wenn du mir nicht helfen willst lass es eben!

von schurli (Gast)


Lesenswert?

Hat niemand etwas?
ich finde auch nichts dazu

von Peter D. (peda)


Lesenswert?

Ja, die SPI-EEPROMs werden doch recht selten verwendet.

Die meisten (ich auch) nehmen die I2C-EEPROMs 24C512 und dazu findet man 
dann auch Beispiele.


Aber warum speicherst Du nicht einfach die Telefonnummern im Flash?
Der ATmega64 hat doch massig davon.

Dazu muß man nur eine Flashroutine in den Bootsektor schreiben.
Oder man nimmt nen Bootloader mit integrierter Flashroutine (API-Call), 
die man dann von der Applikation aus aufruft.


Peter

von schurli (Gast)


Lesenswert?

möchte es mit einem VB Programm updatebar machen!

mfg

von spess53 (Gast)


Lesenswert?

Hi

>Hat niemand etwas?
>ich finde auch nichts dazu

Lass dein Rumgeheule. Sieh dir das Datenblatt von deinem EEPROM an und 
vergleiche das mit dem SPI-Interface vom ATMEGA64. Und dann 
Programmiere. Wenn du das nicht willst, solltest du dein Hobby 
überdenken.

MfG Spess

von Peter D. (peda)


Lesenswert?

schurli wrote:
> möchte es mit einem VB Programm updatebar machen!


Spricht doch nichts dagegen, z.B. über die UART.


Peter

von Dennis (Gast)


Lesenswert?

>@Dennis
>Investiere deine Zeit anderst als dumme Sprüche zu klopfen.

Bist du dir sicher, das das dumme Sprüche waren??? Denn so gemeint waren 
sie eigentlich nicht. Erst denken, dann maulen.

>Wenn du mir nicht helfen willst lass es eben!

Aber natürlich helfe ich dir, siehe mein Posting oben!!! Vieviele 
hundert Links möchtest du denn haben, in denen Haarklein SW-SPI 
beschrieben wird???

http://www.gidf.de

RTFM: http://atmel.com/dyn/resources/prod_documents/2490S.pdf, da steht 
auch viel über SPI drinn....

BTW: welche Programmiersprache wäre dir denn angenehm??? Bisher hast du 
uns diesbezüglich noch keinen Wunsch geäussert, wie wir dir diese 
armseligen 20 Zeilen SW-SPI vorkauen sollen...

von Stephan H. (stephan-)


Lesenswert?

ziehe CS nach Low, sende Deinen Befehl und danach dein Datum. Das Was´s.
Du findest hier etwas. Vor einigen Wochen war jamand mit AVR und C hier,
der seinen Code eingestellt hat.
Und von mir findest du auch einen Teil davon für 8051.

Einfach OBEN aus Suche gehen.

von schurli (Gast)


Lesenswert?

Habe noch ne Frage zur EEProm Sruktur:

Kann ich bei einem 512kByte EEprom auf 512*1024 Byte Adressen zugreifen?


Hier ein Programm aus dem Forum:
Warum weist er dem Zeiger einen Wert von 2 zu?
Hat das damit zu tun dass er 65534 Bits hat? (8kByte EEPROM)

mfg

[c]
//eeprom instructions
#define WREN    0x06
#define WRDI    0x04
#define RDSR    0x05
#define WRSR    0x01
#define READ    0x03
#define WRITE   0x02


void spi_init(void);                                        //initialize 
spi interface
unsigned char spi_transfer(unsigned char data);             //transmit 
data via spi
void spi_eeprom_write(unsigned int adress, unsigned int data);  //write 
data to external eeprom via spi
unsigned int spi_eeprom_read(unsigned int adress);          //read data 
from external eeprom via spi


int main(void)
{
  //init ports
  DDRB   = 0xFF;
  PORTB  = 0xFF;
      DDRC   = 0x00;
  PORTC  = 0x00;
  DDRC   = 0xFF;
   PORTC  = 0x00;

  spi_init();

  spi_eeprom_write(0,1);

  unsigned int data = spi_eeprom_read(0);

      for(;;);
 }


void spi_eeprom_write(unsigned int adress, unsigned int data)
{
    adress *= 2;

    unsigned char dummy;

    if (adress < 65534)
    {
        PORTB &= ~(1<<CS);                                      //pull 
chip select low

        dummy = spi_transfer(WREN); 
//transmit write enable instruction

        PORTB |=  (1<<CS);                                      //pull 
chip select high
        _delay_ms(1);
        PORTB &= ~(1<<CS);                                      //pull 
chip select low

        dummy = spi_transfer(WRITE); 
//transmit write instruction
        dummy = spi_transfer((unsigned char) adress>>8); 
//transmit adress MSB
        dummy = spi_transfer((unsigned char) adress); 
//transmit adress LSB
        dummy = spi_transfer((unsigned char) data>>8); 
//transmit data MSB
        dummy = spi_transfer((unsigned char) data); 
//transmit data LSB
        dummy = spi_transfer(WRDI); 
//transmit write disable instruction

        PORTB |=  (1<<CS);                                      //pull 
chip select high
    }
}  //end of eeprom_write


unsigned int spi_eeprom_read(unsigned int adress)
{
    unsigned char dummy;
    unsigned int data = 0;

    PORTB &= ~(1<<CS);                                      //pull chip 
select low

    dummy = spi_transfer(READ);                             //transmit 
write enable instruction
    dummy = spi_transfer((unsigned char) adress>>8);        //transmit 
adress MSB
    dummy = spi_transfer((unsigned char) adress);           //transmit 
adress LSB
    data += (8<<spi_transfer(0x00));                        //read data 
LSB by dummy transmission
    data += spi_transfer(0x00);                             //read data 
MSB by dummy transmission

    PORTB |=  (1<<CS);                                      //pull chip 
select high

    return data;
}  //end of spi_eeprom_read


void spi_init(void)
{
    DDRB  |=  (1<<PB3) | (1<<PB5);                          //set MOSI 
and SCK output
    DDRB  &= ~(1<<PB4);                                     //set MISO 
input

    SPCR = (1<<SPE) | (1<<MSTR);                            //enable 
spi, master, clock rate f_cpu/4
}   //end of spi_init


unsigned char spi_transfer(unsigned char data)
{
    SPDR = (unsigned char) data;                            //transmit 
data

    while (!(SPSR & (1<<SPIF)));                            //wait for 
transmission complete

    return SPDR;
[\c]

von Stephan H. (stephan-)


Lesenswert?

es sind Seiten von 256 Byte.
Der Counter ist selbst incrementierend und macht nach FF Roll over.
Also dann neue Adresse setzen.

Keine Ahnung was er mit 2us macht. Beim Lesen gibt es keine Zeiten in 
diesem Bereich. Beim Schreiben pro Page oder Byte eben 4-5 ms

von schurli (Gast)


Lesenswert?

Mir stehen bei 512kByte
524288 Byte zu verfügung.

Kann ich direkt auf Adresse 5242.. zugreifen (schreiben,lesen)?

von jolau (Gast)


Lesenswert?

Hast Du das Datenblatt immer noch nicht gelesen? 25AA512 ist ein 512 
KBit-EEPROM, das heißt 56536 Bytes.

von jolau (Gast)


Lesenswert?

Muß natürlich heißen: 65536 Bytes.

von Stephan H. (stephan-)


Lesenswert?

Sorry , Dein EEPROM hat nur eine Pagesize von 128 Byte !!!

von schurli (Gast)


Lesenswert?

hab mich vertan.

Kann man jetzt auf die Adressen durchgehend zugreifen oder nicht?

mfg

von Falk B. (falk)


Lesenswert?

@schurli (Gast)

>Kann man jetzt auf die Adressen durchgehend zugreifen oder nicht?

Warum sollte man nicht?

Page Size ist nur für das Schreiben relevant.

MFG
Falk

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Ja, kann man. Beim seitenweisen lesen sollte man aber den Zeiger immer 
auf den Anfang einer Seite setzen (also in diesem Fall auf ein 
Vielfaches von 128), da es sonst passieren kann das er dir Daten von 
zwei Seiten mischt, da serielle EPROMS immer nur den internen Zähler für 
die einzelnen Bytes innerhalb der Seite hochzählt nicht aber den Zähler 
für die Seite.

Wenn du also den Adresszeiger auf Byte 64 von Seite 0 setzt und du die 
nächsten 128 Bytes lesen willst (was also 64 Bytes von Seite0 und 64 
Bytes von Seite1 wären), wird er dir dir hinteren 64 Bytes von Seite0 
und dannach die vorderen 64 Bytes von Seite0 zurück geben, da er den 
Seitenzähler nicht automatisch erhöht.

Einzelne Bytes können aber direkt Adressiert werden und kommen auch 
richtig zurück. Du kannst auch nur 4 oder 8 Bytes holen, musst aber auch 
hier auf die Seitengrenzen achten (es geht also nicht von Adresse 124, 8 
Bytes zu lesen, da hier wieder ein Seitenwechsel statt findet).

Sven

von schurli (Gast)


Lesenswert?

@Sven Stefan

Gute erklärt! Jetzt bin ich schlauer geworden.

Funtktioniert Byteweises schreiben mit den gleichen Bedinungen die du 
erwähnt hast?

von schurli (Gast)


Lesenswert?

???

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

NEIN. Wenn das EEPROM in Pages organisiert ist, muß immer eine gesamte 
Page geschrieben werden, auch wenn man nur ein einziges Bit eines Bytes 
innerhalb dieser Page geändert haben will. Die Struktur der Befehle und 
die genaue Abfolge der Steuersignale und das Timing entnimmst Du 
vielleicht dann doch dem Datenblatt.

von schurli (Gast)


Lesenswert?

danke

von Falk B. (falk)


Lesenswert?

@Travel Rec. (travelrec)

>NEIN. Wenn das EEPROM in Pages organisiert ist, muß immer eine gesamte
>Page geschrieben werden, auch wenn man nur ein einziges Bit eines Bytes
>innerhalb dieser Page geändert haben will.

Stimmt nicht. Wir reden über EEPROM, nicht FLASH!

Siehe Speicher

MFG
Falk

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hier mal ein Ausschnitt aus dem DB - für alle zum Mitlesen.

von Andreas K. (a-k)


Lesenswert?

Die üblichen EEPROMs besitzen alle solche Pages. Anders als bei 
Flash-ROMs kann man die Daten trotzdem byteweise schreiben. Man kann die 
Pages benutzen um Zeit zu sparen - man muss es aber nicht.

von Stephan H. (stephan-)


Lesenswert?

Zitat aus dem Datahseet Seite 8

"Up to 128 bytes of data can be sent to the
device before a write cycle is necessary. The"

von Stephan H. (stephan-)


Lesenswert?

allerdings:
"When doing a write of less than 128 bytes
the data in the rest of the page is refreshed along with
the data bytes being written."

Er macht es also selber intern.

von Falk B. (falk)


Lesenswert?

@Travel Rec. (travelrec)

>Hier mal ein Ausschnitt aus dem DB - für alle zum Mitlesen

Ja eben. Byte and Page-level write operation. ;-)

MfG
Falk

von Magnus Müller (Gast)


Lesenswert?

Und hier der Link zum Datenblatt des 25AA512 (32 Seiten / 476kB):

http://www.datasheetarchive.com/pdf/4012139.pdf

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>Ja eben. Byte and Page-level write operation. ;-)

Darum hab ich´s doch ´reingestellt. Lesen bildet ;-)

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Was auch immer mir sagen wollt, ich hab hier jedenfalls momentan einen 
24C256 seriellen EEPROM (I2C) in der Mache und der schreibt auch 
einzelne Bytes und kann auch einzelne Bytes lesen. Derzeit schreibe ich 
immer 8 Bytes hintereinander und lese auch 8 Bytes hintereinander obwohl 
die Seitengröße mit 64 Bytes angegeben ist. Bei meinen ersten Tests vor 
2 Wochen hatte ich nur einzelne Bytes geschrieben und gelesen und das 
ging auch. Schau dir halt das DB zu deinem EPROM an. Am genauesten 
siehst du es bei den Taktdiagrammen wie du die Daten zu senden und zu 
lesen hast.

Sven

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.