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
Es schreibt erst, wenn alle übertragen sind. Wichtig dabei ist, dass alle zu schreibenden Bytes in der selben Page liegen.
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
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.
Hallo Benedikt, prima, jetzt ist alles klar! Vielen Dank und schönen Restfeiertag noch ! Gruß Ralf
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; }
Wiso schaltests du CPOL beim Lesen und schreiben um ? Ich verwende CPOL und CPHA = 0
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).
ups das war nur zum testen das ist eigentlich schon wieder wegkommentiert.
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
Andreas Engler wrote:
> kann ich mal den Code von dir haben Benedikt ?
Welchen Code ?
Du hast doch auch schon soen EEProm benutzt ? "Wiso schaltests du CPOL beim Lesen und schreiben um ? Ich verwende CPOL und CPHA = 0"
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.
ok einen fehler hab ich bei mir schon gefunden werd ich gleich mal ausprobieren wenn ich von der arbeit daheim bin ;)
mhh geht immernoch nicht... warum sind die nops da drin ?
Die nops kann man weglassen, ebenso die ganzen sei und cli. Die sind nur drin, da ich das SPI Interface auch in Interrupts verwende.
mhh was sagst du zu meinem teiber, ich weii jetzt wirklich nimmer weiter...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.