Atmel SPI Serial EEPROM Schreibfehler - Seite schreiben?

Ich verwende dieses EEPROM: Atmel AT25640B SPI EEPROM DATASHEET

Die Bedienung scheint ziemlich einfach zu sein, und ich habe mich beim Codieren meines Treibers genau an das Datenblatt gehalten. Ich schien einige Erfolge ohne allzu große Schwierigkeiten zu haben. Jetzt habe ich ein Problem mit dem Schreiben von Bytes und sie bleiben nicht hängen. Zum Beispiel schreibe ich 10 Bytes, aber wenn ich sie sofort zurücklese (um zu überprüfen, ob sie geschrieben wurden, bekomme ich alle 10 Bytes auf 0 zurück. Gibt es möglicherweise etwas Grundlegendes, das mir bei der Bedienung dieses EEPROM fehlt?

Wie ich Page Write verstehe, kann ich bis zu 32 Bytes nacheinander schreiben und dann wird es auf die Startadresse übertragen? Sind die "Seiten" physisch auf 0-31, 32-63 usw. eingestellt oder werden sie dadurch bestimmt, wo Sie mit dem Schreiben beginnen? Beispiel: Wenn ich 8 Bytes an Adresse 29 schreibe, wird es auf 0 zurückgesetzt oder wird es wie erwartet fortgesetzt und das Schreiben bei 36 beendet? Das Datenblatt ist nicht eindeutig.

Die grundlegenden Schritte scheinen darin zu bestehen, einen WRITE ENABLE-Befehl (1) zu senden. Senden Sie dann separat einen WRITE-Befehl, gefolgt von der Adresse und den zu schreibenden Bytes.

Ich betreibe das mit 5V. Ich habe versucht, die SPI-Uhr von 10 MHz auf 1 kHz zu verlangsamen, ohne dass sich das Verhalten änderte.

Was kann ich noch versuchen?

Warten Sie jedes Mal, bis das Gerät bereit ist?
@IgnacioVazquez-Abrams Ja, ich frage das Statusregister ab, um zu sehen, ob das Bereit-Bit 0 ist, dann beginne ich mit meiner Schreibsequenz.
Nimmst du CS nach dem Schreiben hoch? Kannst du Codeschnipsel und Schaltplan posten?
@RogerRowland Ja und ja.
Das von Ihnen verlinkte Datenblatt sagt: „Der AT25320B/640B kann einen 32-Byte-Seitenschreibvorgang ausführen. Nachdem jedes Datenbyte empfangen wurde, werden die fünf niederwertigen Adressbits intern um eins erhöht; die höherwertigen Bits der Adresse bleibt konstant." Das bedeutet, dass die Seiten physikalisch auf 0-31, 32-63 usw. eingestellt sind.
@kkrambo danke. Das habe ich bis jetzt nicht ganz verstanden. Ich habe dies getestet, indem ich meinen Code angepasst habe, um zu prüfen, ob ich über eine Seitengrenze schreibe, und den Schreibvorgang in zwei Schreibvorgänge aufgeteilt habe. Jetzt habe ich keine Probleme mit dem Schreiben.

Antworten (1)

Dieses Gerät verfügt über eine Page Write-Funktion. Seiten sind 32 Byte groß und haben eine feste Adresse, beginnend bei 0. Wie von @kkrambo hervorgehoben

0-31 32-63 ... usw

Wenn eine Folge von Bytes über eine Seitengrenze geschrieben wird, müssen wir die Bytes an dem Punkt, an dem eine Seite endet und eine andere beginnt, in zwei Teile aufteilen.

Hier ist ein Beispielcode, wenn sich eine Sequenz über zwei Seiten erstreckt (mehrere Seiten werden hier nicht angesprochen):

public void WriteBytesPageSpan(ushort startAddress, byte[] byteBuffer)
        {
            ushort spanAddress = AddressSpansPage(startAddress, byteBuffer.Length);
            if (spanAddress != 0)
            {   
                //perform write on first half
                byte[] splitBuffer= new byte[spanAddress-startAddress];
                Array.Copy(byteBuffer, 0, splitBuffer, 0, spanAddress - startAddress);
                WriteBytes(startAddress, splitBuffer);

                //perform write on second half
                ushort endAddress = (ushort)((startAddress + byteBuffer.Length) - 1);
                splitBuffer = new byte[(endAddress - spanAddress) + 1];
                Array.Copy(byteBuffer, spanAddress-startAddress, splitBuffer, 0, splitBuffer.Length);
                WriteBytes(spanAddress, splitBuffer);
            }

            else WriteBytes(startAddress, byteBuffer);
        }