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?
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);
}
Ignacio Vazquez-Abrams
GisMofx
Roger Rowland
GisMofx
krambo
GisMofx