www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT91SAM7 und SPI-EEPROM 25LC040


Autor: Mirko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo.
ich krieg den sch.. EEPROM nicht zum laufen. kann mir jemand bitte sagen 
was ich beim µC falsch einstelle? hier mein code:
AT91PS_SPI     pSPI = AT91C_BASE_SPI;

//lesen
unsigned char AT91F_SPI_Read_Data (const AT91PS_SPI pSpi) 
{
  unsigned char Data_Recieved;

        pSpi -> SPI_TDR = 0x03; //Read-Befehl
        pSpi -> SPI_TDR = 0x00; //EEPROM-Adresse
  Data_Recieved =pSpi -> SPI_RDR;  

  return Data_Recieved; // Return RDR (Read Data + PCS)
}

//schreiben
void AT91F_SPI_Send_Data (const AT91PS_SPI pSpi, unsigned char Data_To_Send)
{
  pSpi -> SPI_TDR = 0x02; //Write-Befehl
        pSpi -> SPI_TDR = 0x00; //EEPROM-Adresse
        pSpi -> SPI_TDR = Data_To_Send;
}

//Initialisierung
void SPI_Init(void){
  
// Configure SPI PIOs
AT91F_SPI_CfgPIO ();
// Configure PMC by enabling SPI clock
AT91F_SPI_CfgPMC ();

//Mode Register
pSPI -> SPI_MR = 0x00000019; // MsterMode,FDIV,MODFIS an

// Chip Select Register --> Baudrate, Delays, Phase, Polarität, u.s.w.
pSPI -> SPI_CSR[0]  = 0x00000F00; // SPCK=100000kHz
pSPI -> SPI_CR  = AT91C_SPI_SPIEN; // SPI is enable

}

und UART-Abfrage, also wenn "W" kommt soll in die EEPROM-Adresse null, 
5A geschrieben werden.
 if (strcmp(string,"W")==0)
  {  
    AT91F_SPI_Send_Data (AT91C_BASE_SPI, 0x5A);
    if ((AT91F_SPI_Read_Data (AT91C_BASE_SPI) & 0xFF) == 0xA5) //!=
    {
      AT91F_DBGU_Printk("Test OK!\n\r");
    }
    else
    {
      AT91F_DBGU_Printk("Fehler!\n\r");
    }

help!!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo wartest du auf das Ende der SPI-Übertragung ?
Oder hat der SAM nen SPI-FIFO ?

Deine Empfangsroutine sieht auch nicht richtig aus.

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

Bewertung
0 lesenswert
nicht lesenswert
ok hast recht, danke.
jetzt wartet er auf ende der übertragung (main.c ist im anhang). aber es 
funzt irgendwie trotzdem nicht. ich weis nicht mehr wo ich den fehler 
suchen soll. habt ihr ein paar tips.
das komische ist auch, daß beim debuggen auch kein wert an SPI Transmit 
Data Register übergeben wird. TDR bleib immer null. z.b. nach
pSpi -> SPI_TDR = 0x00000003;
 bleibt TDR null.

Autor: gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
das TDR beim lessen immer 0 zeigt ist klar. dieses register ist 
write-only!

hast du mal auf clock/mosi/cs gemessen ob da überhaupt was rauskommt?

gruss
gerhard

Autor: Mirko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja clock und cs waren schon da.
jetzt habe ich noch mal das statusregister vom EEPROM abgefragt(mit Read 
Status Register also mit 0x05) und sehe da MOSI ist auch 0x05 (auf dem 
oszi).
nur eins kann hier nicht stimmen. nach acht MOSI-bits geht der takt und 
cs wieder aus und deher kann der EEPROM keine daten an MISO aussenden. 
also MISO  geht kurz vom ende des taktes auf low und wenn der takt 
aufhört wieder fast auf high (seltsam wieso nicht ganz auf high).
kann mich wage an CSAAT in SPI Chip Select Register erinnern. vielleicht 
hilft das? aber glaube das ist für was anderes vorgesehen.

Autor: gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
der spi-master (in deinem fall at91sam7) muß für den empfang die 
notwendigen "dummy"-bits senden.
wie sieht den nun dein code aus?

gruss
gerhard

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

Bewertung
0 lesenswert
nicht lesenswert
ist jetzt im anhang.
bei der menu-funktion braucht man nicht auf die fehlermeldung(Fehler!) 
zu achten, da ich jetzt nur das statusregister vom EEPROM abfrage und 
mir das ganze auf dem oszi ansehe.
hie noch datenblatt vom EEPROM:
http://ww1.microchip.com/downloads/en/DeviceDoc/21204d.pdf

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt sendest du weder Adresse noch Daten.
Oder hab ich was übersehen.


So ungefähr beschreibt man ein SPI EEPROM.

Beginn SpiWrite()
sende Schreibbefehl (schreibe ins SPI Register)
warte bis SPI Übertragung zuende ist
sende Adresse im EEPROM (schreibe ins SPI Register)
warte bis SPI Übertragung zuende ist
sende Datenbyte (schreibe ins SPI Register)
warte bis SPI Übertragung zuende ist
Eventuell kannst du hier auch erst eine ganze Page (mehrere Bytes)
senden.
Statusregister im EEprom pollen bis Programmierung zuende ist.
Ende SPiWrite

Beginn SpiRead()
sende Lesebefehl (schreibe ins SPI Register)
warte bis SPI Übertragung zuende ist
sende Adresse im EEPROM (schreibe ins SPI Register)
warte bis SPI Übertragung zuende ist
Sende DummyByte (0xFF)
warte bis SPI Übertragung zuende ist
Lese Spi Empfangsregister
Ende SpiRead()

Und bevor du überhaupt schreiben kannst musst du
das schreiben im EEProm erst mal FREISCHALTEN.
Siehe WREN im EEProm Datenblatt.

Und wenn du mehr als 256 Bytes in dein EEprom
schreiben/lesen willst musst du das Bit A8 der
Adresse in den Lese/Schreibbefehl einfügen.
Auch dazu siehe Datenblatt des EEproms.







Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: Ich sehe auch keine vernünftige CS Ansteuerung.
Eine Befehlssequenz darf nicht duch CS High unterbrochen
werden.

Also so:
CS low, Befehl, Adresse, Daten, CS High

Sieh dir die Timingdiagramme im EEPROM Datenblatt
noch mal genau an.

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

Bewertung
0 lesenswert
nicht lesenswert
so jetzt habe ich mit CSAAT (in SPI Chip Select Register)und LASTXFER 
(in SPI Transmit Data Register) den CS so gemacht wie du es gesagt hast. 
also "CS low, WREN, Schreibbefehl, Adresse, Daten, WRDI, CS High" . und 
beim lesen "CS low, Lesebefehl, Adresse, Dummybits, CS High" . 
seltsamerweise wrerden nur 2 befehlsfolgen ausgegeben (also nur WREN, 
Schreibbefehl). wieso kann ich nicht verstehen.
habe jetzt neuen code (IAR-Projekt, sehe anhang) mit interrupts.
noch eine frage. zwischen den einzelnen befehlen (z.b WREN, 
Schreibbefehl) geht der takt aus, ist das ok?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>also "CS low, WREN, Schreibbefehl, Adresse, Daten, WRDI, CS High" . und

Das sollte so aussehen:
CS low, WREN, CS High
CS low, Schreibbefehl, Adresse, Daten, CS High
Hier auf das Ende der Programmierung warten (Status polling)
CS low, WRDI, CS High

Die Befehle werden erst nach CS high ausgeführt !

Wie gesagt, schau dir die Timingdiagramme an.

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

Bewertung
0 lesenswert
nicht lesenswert
im anhang ist jetzt ein oszilloskopbild. zwar ist auf dem bild WREN 
falsch (also mit Schreibbefehl, Adresse, Daten, WRDI zusammen) aber es 
kommen nur zwei befehle aus dem µC und nicht fünf wie im code 
vorgesehen. und wenn ich dieses problem nicht löse kann ich ja auch 
nicht schreiben und lesen. bis jetzt habe ich es nicht rausgefunden 
woran es liegt.
und noch mal, ist es ok das der takt zwischen den befehlen ausgeht (ich 
glaube ja)?

Autor: Mirko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vergessen: gelb ist MOSI, blau MISO, rosa Takt, grüün CS

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ey geil ein TDS1024 :)
Hab den großen Bruder ;)

>und noch mal, ist es ok das der takt zwischen den befehlen ausgeht (ich
>glaube ja)?

Der Takt geht immer dann aus wenn das SPI Register
keine Daten mehr enthält. Sobald du welche reinschreibst
kommt wieder ein Takt .

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.