Error de escritura de la EEPROM serie Atmel SPI - ¿Escritura de página?

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?

¿Estás esperando hasta que el dispositivo esté listo cada vez?
@IgnacioVazquez-Abrams Sí, estoy sondeando el registro de estado para ver si el bit listo es 0, luego comienzo mi secuencia de escritura.
¿Estás tomando CS alto después de la escritura? ¿Puedes publicar un fragmento de código y un esquema?
@RogerRowland Sí y sí.
La hoja de datos que vinculó dice: "El AT25320B/640B es capaz de realizar una operación de escritura de página de 32 bytes. Después de recibir cada byte de datos, los cinco bits de dirección de orden inferior se incrementan internamente en uno; los bits de orden superior del la dirección permanecerá constante". Eso significa que las páginas están configuradas físicamente 0-31, 32-63, etc.
@kkrambo gracias. No entendí completamente eso hasta ahora. Probé esto ajustando mi código para verificar si estoy escribiendo sobre un límite de página y dividí la escritura en dos escrituras. Ahora no tengo problemas con la escritura.

Respuestas (1)

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);
        }