Probleme mit SPI EEPROM

OP #974845
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
Angehängte Dateien:
OP #974901
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);
Gast #974925
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.

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