www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zum "Page Write" bem externen EEprom


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe einen SPI EEprom (95128) an einem Mega 16 angeschlossen.
Funktioniert auch ganz gut wenn ich die Daten Byteweise schreibe und 
lese.

Das mit dem Page Write habe ich so einigermaßen begriffen, aber wie kann 
ich den zwischen den gesendeten Bytes das Statusregister auslesen, um 
festzustellen, ob der Schreibzyklus abgeschlossen ist?

Oder speichert der EEprom die Daten zwischen und schreibt sie erst wenn 
der komplette Datenblock übertragen ist?



Gruß Ralf

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es schreibt erst, wenn alle übertragen sind. Wichtig dabei ist, dass 
alle zu schreibenden Bytes in der selben Page liegen.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,

das ging ja schnell !

> Es schreibt erst, wenn alle übertragen sind.

gilt das denn zeitmäßig als ein Schreibzyklus?
Also der EEprom hat zB 5 mS Schreibzeit, sind es dann 5 mS oder zB. 30 
Byte * 5 mS ?

> Wichtig dabei ist, dass
> alle zu schreibenden Bytes in der selben Page liegen.

Habe ich dann doch noch nicht richtig verstanden, bein 95128 kann ich 
bis zu 64 Byte auf einmal schreiben.
Darf die Anfangsadresse dann nur das Vielfache von 64 Byte betragen und 
wird der Rest der Seite verschenkt, wenn zB. nur jeweils nur 20 Byte 
übertragen werden.


Vielen Dank!




Gruß Ralf

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf wrote:

> gilt das denn zeitmäßig als ein Schreibzyklus?
> Also der EEprom hat zB 5 mS Schreibzeit, sind es dann 5 mS oder zB. 30
> Byte * 5 mS ?

Ja.

> Habe ich dann doch noch nicht richtig verstanden, bein 95128 kann ich
> bis zu 64 Byte auf einmal schreiben.
> Darf die Anfangsadresse dann nur das Vielfache von 64 Byte betragen und
> wird der Rest der Seite verschenkt, wenn zB. nur jeweils nur 20 Byte
> übertragen werden.

Nicht ganz. Du darfst irgendwo in der Page anfangen, musst aber 
innerhalb der selben Page aufhören. Den 95128 speziell kenne ich jetzt 
nicht, aber andere EEPROMs ignorieren dann entweder die ungültigen 
Bytes, oder schreiben diese in der Anfang der aktiven Page. Man sollte 
dies einfach vermeiden, dann gibt es keine Probleme.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,

prima, jetzt ist alles klar!

Vielen Dank und schönen Restfeiertag noch !

Gruß Ralf

Autor: AndreasE112 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi könntest du bitte mal deinen Code Posten ?
Ich hab nämlich den 95256 und ist ja lt Datasheet fast das gleiche Teil, 
nur doppelt so groß wie deiner. Aber ich hab da Probleme ich lese immer 
0xff zurück. Wobei ich ja noch nicht mal richtig weiss ob ich richtig 
schreib !

Also ich hab im SPI CPOL = 0 und CPHA auch. Stimmt dass vom Spi schon 
mal ?
und hier der Code.

unsigned int extern_ee_write_byte(unsigned char data, unsigned int 
adress)
{
  unsigned char data_ret = 0;
  unsigned int timeout = 0;

  sbi(SPCR,CPOL);

  //Check if Device is busy, if busy -> wait until ready
  cbi(PORT_CS_EEPROM,PIN_CS_EEPROM); //CS LOW
  //Wait for Bit is cleared
  while ( data_ret & (1<<WIP) && (timeout < 32000) )
  {
    data_ret = SPI_MasterTransmit(RDSR);
    timeout ++;
  }
  timeout = 0 ;


was ist nun noch falsch ich verstehs ned ?
hier noch die commando codes:

#define WREN    0x06
#define WRDI     0x04
#define RDSR        0x05
#define WRSR    0x01
#define READ    0x03
#define WRITE    0x02

#define SRWD           7
#define BP1    3
#define BP0    2
#define WEL    1
#define WIP    0

  sbi(PORT_CS_EEPROM,PIN_CS_EEPROM); //CS HIGH
  // Device Ready not Busy

  // Set Write Enable Latch
  cbi(PORT_CS_EEPROM,PIN_CS_EEPROM); //CS LOW
  data_ret = SPI_MasterTransmit(WREN);
  sbi(PORT_CS_EEPROM,PIN_CS_EEPROM); //CS HIGH

  // Wait for Bit is set
  cbi(PORT_CS_EEPROM,PIN_CS_EEPROM); //CS LOW
  while ( data_ret & (1<<WEL) && (timeout < 32000))
  {
    data_ret = SPI_MasterTransmit(RDSR);
    timeout ++;
  }
  sbi(PORT_CS_EEPROM,PIN_CS_EEPROM); //CS HIGH
  // Device Ready to write


  cbi(PORT_CS_EEPROM,PIN_CS_EEPROM); //CS LOW
  SPI_MasterTransmit(WRITE);  // Set Write Modi
  SPI_MasterTransmit( (unsigned char) ((adress>>8)&& 0xFF) ); // Adress 
High Byte
  SPI_MasterTransmit( (unsigned char)   (adress    && 0xFF) ); // Adress 
Low  Byte
  SPI_MasterTransmit(data);  // DATA zu write
  sbi(PORT_CS_EEPROM,PIN_CS_EEPROM); //CS HIGH

  cbi(SPCR,CPOL);
}

und lesen :

unsigned int extern_ee_read_byte (unsigned char data, unsigned int 
adress)
{
  unsigned char data_ret = 0;
  unsigned int timeout = 0;

  sbi(SPCR,CPOL);

  cbi(PORT_CS_EEPROM,PIN_CS_EEPROM); //CS LOW
  //Check if Device is busy, if busy -> wait until ready
  while ( data_ret & (1<<WIP) && (timeout < 32000))
  {
    data_ret = SPI_MasterTransmit(RDSR);
    timeout ++;
  }
  sbi(PORT_CS_EEPROM,PIN_CS_EEPROM); //CS HIGH

  // Byte schreiben
  cbi(PORT_CS_EEPROM,PIN_CS_EEPROM); //CS LOW

  data_ret = SPI_MasterTransmit(READ);  // Set Read Modi
  data_ret = SPI_MasterTransmit( (unsigned char) ((adress>>8)&& 0xFF) );
  data_ret = SPI_MasterTransmit( (unsigned char)   (adress    && 0xFF) 
);

  sbi(PORT_CS_EEPROM,PIN_CS_EEPROM); //CS HIGH
  cbi(SPCR,CPOL);

  return data_ret;
}

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wiso schaltests du CPOL beim Lesen und schreiben um ? Ich verwende CPOL 
und CPHA = 0

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

Bewertung
0 lesenswert
nicht lesenswert
Wenn man am gleichen SPI mehrere Devices sitzen hat, kommt es nicht 
selten vor, dass eines davon nur in Mode 0 und das andere nur in Mode 3 
funktioniert (z.B. EA DOG + RFM02 oder Dataflash + FRAM + ENC28J60).

Autor: Andreas Engler (andrease112)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups das war nur zum testen das ist eigentlich schon wieder 
wegkommentiert.

Autor: Andreas Engler (andrease112)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
passt der Code ansonsten ? kann ich mal den Code von dir haben Benedikt 
?
PS:

Ich hab noch nen MCP2515 am SPI aber der läuft ja auch mit cpol und cpha 
= 0

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Engler wrote:
> kann ich mal den Code von dir haben Benedikt ?

Welchen Code ?

Autor: Andreas Engler (andrease112)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast doch auch schon soen EEProm benutzt ?

"Wiso schaltests du CPOL beim Lesen und schreiben um ? Ich verwende CPOL
und CPHA = 0"

Autor: Benedikt K. (benedikt) (Moderator)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende M25Pxx und 25AAxxx. Die sind ähnlich, aber der Code ist 
nicht ganz der selbe, von daher kannst du zwar den Code anschauen, aber 
nicht 1:1 übernehmen.

Autor: Andreas Engler (andrease112)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok einen fehler hab ich bei mir schon gefunden werd ich gleich mal 
ausprobieren wenn ich von der arbeit daheim bin ;)

Autor: AndreasE112 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mhh geht immernoch nicht... warum sind die nops da drin ?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die nops kann man weglassen, ebenso die ganzen sei und cli. Die sind nur 
drin, da ich das SPI Interface auch in Interrupts verwende.

Autor: AndreasE112 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
mhh was sagst du zu meinem teiber, ich weii jetzt wirklich nimmer 
weiter...

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.