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


von Mirko (Gast)


Lesenswert?

hallo.
ich krieg den sch.. EEPROM nicht zum laufen. kann mir jemand bitte sagen 
was ich beim µC falsch einstelle? hier mein code:
1
AT91PS_SPI     pSPI = AT91C_BASE_SPI;
2
3
//lesen
4
unsigned char AT91F_SPI_Read_Data (const AT91PS_SPI pSpi) 
5
{
6
  unsigned char Data_Recieved;
7
8
        pSpi -> SPI_TDR = 0x03; //Read-Befehl
9
        pSpi -> SPI_TDR = 0x00; //EEPROM-Adresse
10
  Data_Recieved =pSpi -> SPI_RDR;  
11
12
  return Data_Recieved; // Return RDR (Read Data + PCS)
13
}
14
15
//schreiben
16
void AT91F_SPI_Send_Data (const AT91PS_SPI pSpi, unsigned char Data_To_Send)
17
{
18
  pSpi -> SPI_TDR = 0x02; //Write-Befehl
19
        pSpi -> SPI_TDR = 0x00; //EEPROM-Adresse
20
        pSpi -> SPI_TDR = Data_To_Send;
21
}
22
23
//Initialisierung
24
void SPI_Init(void){
25
  
26
// Configure SPI PIOs
27
AT91F_SPI_CfgPIO ();
28
// Configure PMC by enabling SPI clock
29
AT91F_SPI_CfgPMC ();
30
31
//Mode Register
32
pSPI -> SPI_MR = 0x00000019; // MsterMode,FDIV,MODFIS an
33
34
// Chip Select Register --> Baudrate, Delays, Phase, Polarität, u.s.w.
35
pSPI -> SPI_CSR[0]  = 0x00000F00; // SPCK=100000kHz
36
pSPI -> SPI_CR  = AT91C_SPI_SPIEN; // SPI is enable
37
38
}

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

help!!

von holger (Gast)


Lesenswert?

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

Deine Empfangsroutine sieht auch nicht richtig aus.

von Mirko (Gast)


Angehängte Dateien:

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
1
pSpi -> SPI_TDR = 0x00000003;
 bleibt TDR null.

von gerhard (Gast)


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

von Mirko (Gast)


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.

von gerhard (Gast)


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

von Mirko (Gast)


Angehängte Dateien:

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

von holger (Gast)


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.







von holger (Gast)


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.

von Mirko (Gast)


Angehängte Dateien:

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?

von holger (Gast)


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.

von Mirko (Gast)


Angehängte Dateien:

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)?

von Mirko (Gast)


Lesenswert?

vergessen: gelb ist MOSI, blau MISO, rosa Takt, grüün CS

von holger (Gast)


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 .

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.