Probleme mit SPI EEPROM

OP #974845
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
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
>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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.