mikrocontroller.net

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


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();
}

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Martin (Gast)
Datum:

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

Autor: tom (Gast)
Datum:

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

Autor: Martin (Gast)
Datum:

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

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.