AT91SAM7 und SPI-EEPROM 25LC040

Gast #539254
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!!
Gast #540675
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.
Angehängte Dateien:
Gast #540905
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.
Gast #541115
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.






Gast #541127
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.
Gast #541809
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?
Angehängte Dateien:
Gast #541989
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.
Gast #542113
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)?
Angehängte Dateien:
Gast #542120
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren