Forum: Mikrocontroller und Digitale Elektronik Probleme EEPROM mit SPI zu beschreiben


von Martin (Gast)


Lesenswert?

Hallo!

Ich versuche zur Zeit zweifelhaft einen EEPROM über SPI zu beschreiben 
(93LC86 von Microchip).Hat jemand zufälliger Weise Erfahrung mit der 
Thematik? Das senden der Daten vom Pic auf den EEPROM funktioniert. Ich 
weiss nur nicht ob ich die Freigabe für das beschreiben richtig mache, 
oder ob es vielleicht timing Probleme gibt. An der clk Freuenz liegt es 
nicht diese ist unter der maximal erlaubten. Anbei auch noch ein kurzer 
Auszug  aus meinem Programmcode.Hoffe jemand kann mir helfen.Danke!

void SPI_init_memory(char chn)
{
  unsigned int config=
  SPI_CONFIG_MSTEN|   //set the Master mode
  SPI_CONFIG_MODE32;  //set 32 bits/char
  SpiChnOpen(chn, config, 40);//clk 1MHz
}

void enable_memory()
{
LATFbits.LATF5=1;//chip select ein
LATEbits.LATE0=1;//program enable ein
delay_ns(100);//chip select setup time
SPI1ACONbits.ON=1;//spi einschalten
spi_send_data(0b10011000000000000000000000000000);//Steuerzeichen EN an
LATFbits.LATF5=0;//chip select aus
SPI1ACONbits.ON=0;//Spi aus
delay_ns(400);//Chip select low time
LATEbits.LATE0=0;//programm enable aus
}

void write_memory()
{
LATFbits.LATF5=1;//chip select ein
LATEbits.LATE0=1;//programm enable ein
delay_ns(100);//chip select setup time
SPI1ACONbits.ON=1;//SPI einschalten
spi_send_data(0b10100000000001010101010101010000);//daten schreiben auf 
0x0
LATFbits.LATF5=0;//chip select aus
SPI1ACONbits.ON=0;//spi aus
delay_ns(300);Chip select low time
LATEbits.LATE0=0;//programm enable aus
}

void main(void)
{
SPI_init_memory(3);
enable_memory();
write_memory();
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin schrieb:
> Ich versuche zur Zeit zweifelhaft
Versuch das mal besser ernsthaft... ;-)

> Das senden der Daten vom Pic auf den EEPROM funktioniert.
Das ist gut. Denn dann funktioniert bei SPI zwingend auch das 
Empfangen.

> Ich weiss nur nicht ob ich die Freigabe für das beschreiben richtig mache,
Meinst du den CS (aka SS)?

> An der clk Freuenz liegt es nicht diese ist unter der maximal erlaubten.
Das ist auch gut. Was ist also das Problem?
Hast du überhaupt ein Problem?
Hast du wenigstens deine Frage vor dem Absenden mal durchgelesen?
Und? Wirst du schlau draus?

> delay_ns(100); //chip select setup time
Hmmm...
Welchen uC mit welcher Taktfrequenz verwendest du nochmal?

von Martin (Gast)


Lesenswert?

Danke für die schnelle Antwort.

Zu dem Problem der Freigabe: Der EEPROM ist schreibgeschützt. Erst durch 
senden eines bestimmten Datenpakets ist er beschreibbar.Mein Problem ist 
halt das,ich versuche den EEPROM freizuschalten und danach auf der 
Adresse 0 Daten zu schreiben und später wieder auszulesen. Und das 
beschreiben funktioniert halt nicht.Ich lese immer das selbe Ergebnis 
auf dem Speicherplatz aus, egal was ich hineinschreibe.Ich benutze einen 
PIC32 und die SPI-clk hat 1MHz.

von tom (Gast)


Lesenswert?

...nimm einen logic analyser oder scope und schaue dir mal die signale 
auf den leitungen an ob das so elektrisch+timing alles hinhaut.

wie ist z.b. deine spi-send funktion realisiert ? evtl. sind die bits 
alle noch gar nicht rausgeclockt, wenn du CS abschaltest... ?

ist deine spi hinsichtlich msb oder lsb first richtig konfiguriert ?

gruss, tom.

von Martin (Gast)


Lesenswert?

Hallo!

Die Signale die der µC sendet sehen in Ordnung aus, die habe ich mir 
angeschaut.Das ist ja gerade das komische.Es wird genau das gesendet was 
ich will und der CS macht auch das was er soll.Ich habe auch die 
Hinweise im Datenblatt beachtet wie zum Beispiel aktiv Zustand des clk 
ist high und übernahme mit steigender clk Flanke.Ich weiss nicht ob ich 
sonst noch auf irgendwelche timing Sachen achten soll.

meine sende Funktion lautet:

void spi_send_data(unsigned int dat1)
{
  //wait for the SPI channel to be idle
  while(SpiChnIsBusy(SPIchn)==1)
  {
  }
  SpiChnPutC(SPIchn, dat1);

  //wait for the end of transfering data to the SPI channel
  while(SpiChnTxBuffEmpty(SPIchn)!=1)
  {
  }
}

MfG

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.