Estoy usando esta EEPROM: Atmel AT25640B SPI EEPROM HOJA DE DATOS
Parece bastante sencillo de operar y he seguido la hoja de datos de cerca al codificar mi controlador. Parecía tener cierto éxito sin demasiados problemas. Ahora, tengo un problema con la escritura de bytes y no se pegan. Por ejemplo, escribo 10 bytes, pero cuando los vuelvo a leer de inmediato (para verificar que se han escrito), obtengo los 10 bytes en 0. ¿Existe posiblemente algo fundamental que me esté faltando con respecto a cómo operar esta EEPROM?
Según entiendo Page Write, ¿puedo escribir hasta 32 bytes secuencialmente y luego se transferirá a la dirección de inicio? ¿Las "páginas" están configuradas físicamente 0-31, 32-63, etc. o están determinadas por dónde comienza a escribir? ej.: si escribo 8 bytes en la dirección 29, ¿volverá a 0 o continuará como se esperaba y terminará de escribir en 36? La hoja de datos no es clara.
Los pasos básicos parecen ser enviar un Comando HABILITAR ESCRITURA (1). Luego, por separado, envíe un comando ESCRIBIR seguido de la dirección y los bytes para escribir.
Estoy corriendo a 5v. Intenté reducir la velocidad del reloj SPI a 1 khz desde 10 MHz sin ninguna diferencia en el comportamiento.
¿Qué más puedo probar?
Este dispositivo tiene la función de escritura de página. Las páginas tienen un tamaño de 32 bytes y una dirección fija a partir de 0. Como lo señaló @kkrambo
0-31 32-63 ... etc.
Si escribimos una secuencia de bytes a través de un límite de página, necesitamos dividir los bytes en dos partes en el punto donde termina una página y comienza otra.
Aquí hay un código de muestra si una secuencia se extiende a lo largo de dos páginas (aquí no se abordan varias páginas):
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 Vázquez-Abrams
gismofx
Rogelio Rowland
gismofx
krambo
gismofx