mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Externes serielles EEPROM


Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du vielleicht ein beispielprogramm?

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Dennis
Investiere deine Zeit anderst als dumme Sprüche zu klopfen.

Wenn du mir nicht helfen willst lass es eben!

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat niemand etwas?
ich finde auch nichts dazu

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
möchte es mit einem VB Programm updatebar machen!

mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schurli wrote:
> möchte es mit einem VB Programm updatebar machen!


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


Peter

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir stehen bei 512kByte
524288 Byte zu verfügung.

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

Autor: jolau (Gast)
Datum:

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

Autor: jolau (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muß natürlich heißen: 65536 Bytes.

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry , Dein EEPROM hat nur eine Pagesize von 128 Byte !!!

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab mich vertan.

Kann man jetzt auf die Adressen durchgehend zugreifen oder nicht?

mfg

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sven Stefan

Gute erklärt! Jetzt bin ich schlauer geworden.

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

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
???

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein Ausschnitt aus dem DB - für alle zum Mitlesen.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Magnus Müller (Gast)
Datum:

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

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ja eben. Byte and Page-level write operation. ;-)

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

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.