www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit SPI EEPROM


Autor: Michael Leske (nemesisod)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?
// Dieser Abschnitt steht in meiner Main
spi_send_word(0x0349);  //Read 0x49
param = spi_send_byte(0xFF);

uint8_t spi_send_byte(uint8_t byte)
{

  SPDR = byte;
  while(!(SPSR & (1<<SPIF)))
    ;
  return SPDR;
}

uint16_t spi_send_word(uint16_t word)
{
uint16_t rxData = 0;

// send MS byte of given data
rxData = (spi_send_byte((word>>8) & 0x00FF))<<8;
// send LS byte of given data
rxData |= (spi_send_byte(word & 0x00FF));

// return the received data
return rxData;
}

Danke für Eure Hilfe.

Michael

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Leske (nemesisod)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo  holger,

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

Autor: Michael Leske (nemesisod)
Datum:

Bewertung
0 lesenswert
nicht 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.
byte = spi_send_byte(0xFF);
byte2 = spi_send_byte(0xFF);
byte = (byte << 1) + (byte2 >> 7);

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.