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

0

Estoy usando esta EEPROM: Atmel AT25640B SPI EEPROM HOJA DE DATOS

Parece bastante sencillo de operar y he seguido de cerca la hoja de datos al codificar mi controlador. Parecía tener algún éxito sin demasiados problemas. Ahora, tengo algún problema con la escritura de bytes y no se pegan. Por ejemplo, escribo 10 bytes, pero cuando los leo inmediatamente (para verificar que se hayan escrito, recibo los 10 bytes de nuevo en 0. ¿Hay algo fundamental que me esté faltando sobre cómo operar esta EEPROM?

Según entiendo de Page Write, ¿puedo escribir hasta 32 bytes secuencialmente y luego se desplazará a la dirección de inicio? ¿Las "páginas" están configuradas físicamente 0-31, 32-63, etc. o están determinadas por el lugar en el que comienza a escribir? Ejemplo: si escribo 8 bytes en la dirección 29, ¿se transferirá a 0 o continuará como se esperaba y terminará de escribir a los 36? La hoja de datos no está clara.

Los pasos básicos parecen ser enviar un comando WRITE ENABLE (1). Luego, por separado, envíe un comando ESCRIBIR seguido de la dirección y los bytes para escribir.

Estoy ejecutando el a 5v. He intentado reducir la velocidad del reloj SPI a 1 khz desde 10 mhz sin ninguna diferencia en el comportamiento.

¿Qué más puedo probar?

    
pregunta GisMofx

1 respuesta

0

Este dispositivo tiene funcionalidad de escritura de página. Las páginas tienen un tamaño de 32 bytes y se fijan en la dirección a partir de 0. Como lo señala @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 una página termina y otra comienza.

Aquí hay algunos ejemplos de código si una secuencia se extiende a lo largo de dos páginas (varias páginas no se tratan aquí):

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);
        }
    
respondido por el GisMofx

Lea otras preguntas en las etiquetas