¡No se puede escribir más de un byte en la memoria flash SST39SF010A!

Uso Code Composer para programar el TMS320C31 DSP (a través de MPSD) para escribir en el flash SST39SF010A . Puedo escribir con éxito un byte en cualquier ubicación del flash siguiendo las secuencias "Borrado de chip" y luego "Algoritmo de programa de bytes" mencionadas en la hoja de datos.

El problema es cuando quiero escribir más de un byte en diferentes ubicaciones, solo se escribe el primer byte y el resto no. Agregué retrasos entre escrituras pero no hubo diferencia.

¿Cuál es la causa de este problema? ¡Busqué controladores (algoritmos de programación) para este flash pero no pude encontrarlos!

Actualización: 21/7/2013

  • Primero:

Este es el código que escribimos para programar el flash:

void main()  {

volatile unsigned int * start_flash = (volatile unsigned int *)0x00001000;   
      volatile unsigned int * end_flash = (volatile unsigned int *)0x0001ffff;

      volatile unsigned char * flash_addr1 = (volatile unsigned char *)0x005555;    
      volatile unsigned char * flash_addr2 = (volatile unsigned char *)0x002aaa;
      volatile unsigned char * flash_addr3 = (volatile unsigned char *)0x005555; 
      volatile unsigned char * flash_addr4 = (volatile unsigned char *)0x010000;

      volatile unsigned int x = 0;     

          // Chip Erase

        * flash_addr1 = 0xaa;    
        * flash_addr2 = 0x55;      
        * flash_addr1 = 0x80;    
        * flash_addr1 = 0xaa;
        * flash_addr2 = 0x55;
        * flash_addr1 = 0x10; 

        // Delay
        for(x=0;x<=100000;x++);          

        // Byte Program

        * flash_addr1 = 0xaa;    
        * flash_addr2 = 0x55;
        * flash_addr3 = 0xa0;  

        // Data in the first address

        * (start_flash) = 0xba;

        for(x=0;x<=100000;x++); 

       // Data in the following address

        * (start_flash+1) = 0xab;

        while(1);
  }

"BA" está escrito correctamente en la primera dirección pero "AB" no.

  • Segundo:

Estamos usando un FPGA en el sistema entre el DSP y el Flash (y todos los demás periféricos del sistema). Los datos y la dirección de DSP se desvían a través de la FPGA a la memoria flash, y las señales de control se generan desde la FPGA. Creo que no hay problema en generar las señales de control ya que podemos escribir un byte con éxito, ¿es correcto?

¿Alguna ayuda? Por favor, hágame saber la sección adecuada para esta pregunta si publiqué en una incorrecta.
¿Estás seguro de que tu hardware está bien? Estos problemas aleatorios se producirán cuando cualquiera de las líneas de dirección, datos o control se acorte a GND o VCC o se golpeen. Las variaciones de tiempo pueden no ser la causa...
@ user19579, sí, verifiqué las líneas de datos y direcciones y no hay pines flotantes o atascados. Este problema hasta ahora no es aleatorio. Es consistente, solo se escribe un byte en cualquier dirección. ¡No puedo escribir más que eso!
¿Puedes adjuntar el esquema de la sección de interfaz de memoria solo? Cómo OE # de memoria conectado. proporcione también los detalles del controlador de software.
@user19579, gracias por seguirnos. Por favor, consulte las actualizaciones anteriores.
Sus conexiones no son simples, porque ha utilizado FPGA para señales de control. intente verificar o sondear las señales de control. Una cosa más, la dirección y los datos están directamente conectados al flash desde DSP y las señales de control son de FPGA. No estoy seguro de cómo está sincronizando ambos (cómo FPGA genera señales de control). Puedo decir que simplemente los pruebe y confirme. Una cosa más, primero lea la ID del dispositivo de flash y confirme el dispositivo. No me gusta mucho la codificación, para mí la codificación se ve bien. Solo verifique cómo se realiza el mapeo de memoria en el interior
@user19579, los datos y la dirección también son entradas para el FPGA. Probaré las señales de control y las compararé con los diagramas de tiempo en la hoja de datos. También confirmaré la identificación del dispositivo. Gracias.
@user19579, Problema resuelto. Los 3 comandos bajo el comentario "Programa de bytes" en el código anterior son en realidad para la protección de datos de software (SDP). Estos comandos deben enviarse antes de cualquier operación de escritura de bytes, no solo antes de escribir el primer byte. Gracias.

Respuestas (1)

Problema resuelto y me gustaría compartir la solución:

Protección de datos de software

Esta característica está disponible en algunos flashes que requieren una secuencia de software al comienzo de cada ciclo de escritura para que se realice una escritura. Para habilitar la función de protección de datos del software, se debe realizar una serie de comandos de tres escrituras a direcciones específicas con datos específicos. Una vez configurado, el mismo código de 3 bytes debe comenzar cada solicitud de escritura. Esta característica está habilitada permanentemente en el flash que estoy usando.

Entonces, la solución es agregar los siguientes comandos antes de cualquier operación de escritura de bytes, no solo la primera:

    * flash_addr1 = 0xaa;    
    * flash_addr2 = 0x55;
    * flash_addr3 = 0xa0;