Forum: Mikrocontroller und Digitale Elektronik Probleme mit SPI EEPROM


von Michael L. (nemesisod)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche seit ein paar Stunden mein 93LC46 EEPROM mit meinem 
ATMega32 zum laufen zubekommen.

Also meine SPI-Routine funktioniert, ich kann sowohl lesen als auch 
schreiben. Nur wenn ich eine bestimmte Adresse auslese (Werkseinstellung 
0xFF) empfange ich 0x7F, also um ein bit nach rechtsverschoben. Dann 
habe ich einmal ein Byte 0x1C geschrieben und beim wieder auslesen 
erhalte ich 0x0E, also auch wieder um ein bit verschoben.

Leider finde ich den Fehler nicht.

Laut Datenblatt (welches ich euch einmal angehängt habe) wird eine null 
auf die DO Leitung mit dem letzten Bit welches ich Sende, also vermute 
ich mal das es damit zu tun haben wird.

Aber wie kann ich diesen Fehler verhindern?
1
// Dieser Abschnitt steht in meiner Main
2
spi_send_word(0x0349);  //Read 0x49
3
param = spi_send_byte(0xFF);
4
5
uint8_t spi_send_byte(uint8_t byte)
6
{
7
8
  SPDR = byte;
9
  while(!(SPSR & (1<<SPIF)))
10
    ;
11
  return SPDR;
12
}
13
14
uint16_t spi_send_word(uint16_t word)
15
{
16
uint16_t rxData = 0;
17
18
// send MS byte of given data
19
rxData = (spi_send_byte((word>>8) & 0x00FF))<<8;
20
// send LS byte of given data
21
rxData |= (spi_send_byte(word & 0x00FF));
22
23
// return the received data
24
return rxData;
25
}

Danke für Eure Hilfe.

Michael

von holger (Gast)


Lesenswert?

Geh mal auf Seite 4, Table 1-2, Zeile 1 bei READ.

Dort steht doch eindeutig 18 CLK Zyklen um ein Byte zu lesen.
Du hast aber nur 16.

von Michael L. (nemesisod)


Lesenswert?

Hallo  holger,

und dnake für deine schnelle Antwort. Und wie bekomme ich zwei 
zusätzliche Takte dazu? Ich nutze Hardware-SPI.

von Michael L. (nemesisod)


Lesenswert?

Ok,
ich habe das abhohlen nun etwas umständlich geschrieben, aber so klappt 
es.

Ich hole einfach 2 Bytes ab:

Das erste Byte wird um 1 nach links verschoben,
das zweite Byte um 7 nach rechts,
und dann muss ich nurnoch beide Addieren.
Und schon habe ich mein Abgespeichertes Byte.
1
byte = spi_send_byte(0xFF);
2
byte2 = spi_send_byte(0xFF);
3
byte = (byte << 1) + (byte2 >> 7);

von holger (Gast)


Lesenswert?

>Dort steht doch eindeutig 18 CLK Zyklen um ein Byte zu lesen.
>Du hast aber nur 16.

Stimmt nicht, ich nehme alles zurück :(
Du hast 24 CLK. Gezählt wird aber erst ab dem Startbit.
Ist ja Microwire und nicht SPI. Deshalb stimmt das so schon.

Ich denke du hast da eine falsche Einstellung für
CPOL und CPHA. Das letzte Bit wird nicht gesampelt.
CPOL würde ich auf 0 setzen. CPHA auf 1.

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.