1 votos

No se puede usar las funciones integradas del compilador para escribir en la EEPROM de dsPIC

Como mencioné aquí, he estado teniendo problemas con la EEPROM en dsPIC30F6012A. Dado que mi antigua biblioteca de EEPROM era difícil de analizar y soportar, volví a empezar desde cero y la reescribí utilizando las rutinas de EEPROM integradas en el nuevo (más reciente que mi biblioteca) compilador C30. Tomé el código de demostración de Microchip y traté de ejecutarlo. Compilé, programé, sin problemas, pero no parecía operar correctamente. Hice una versión modificada de su demostración, también sin éxito.

Ejecuto este programa, leo el contenido del chip de nuevo en MPLAB X, y observo el contenido de la EEPROM. Las operaciones de borrado funcionan correctamente, cualquier dirección que borro vuelve como 0xFFFF. Pero las operaciones de escritura no hacen nada. He probado varias combinaciones, escrituras repetidas, diferentes direcciones, nada parece ser escrito.

#include <p30fxxxx.h>
#include <libpic30.h>

 _FOSC(CSW_FSCM_OFF & FRC_PLL16); 
_FWDT(WDT_OFF);                 /* Turn off the Watch-Dog Timer.  */
_FBORPOR(MCLR_EN & PWRT_OFF);   /* Enable MCLR reset pin and turn off the power-up timers. */
_FGS(CODE_PROT_OFF);            /* Disable Code Protection */

 typedef struct _eestruct {
    unsigned char testdata[10];
} eestruct;
 eestruct eedata __attribute__((space(eedata)));
 eestruct backup_eedata __attribute__((space(eedata)));

 int main(){

    _prog_addressT EE_addr;
    //_init_prog_address(EE_addr, eedata);
    EE_addr = 0x7FF000;

    int temp_word = 0x0102;
    _erase_eedata(EE_addr, _EE_WORD);
    _wait_eedata();
    _write_eedata_word(EE_addr, temp_word);
    _wait_eedata();

    while(1){
    ClrWdt();
    };
    return 0;
}

Tengo cuatro teorías:

  1. Las escrituras están teniendo lugar, y no estoy leyendo los datos de vuelta correctamente.
  2. Las escrituras no están teniendo lugar, porque algo está mal con mi código.
  3. Las escrituras no están teniendo lugar, porque algo está mal con mis opciones de proyecto/compilación.
  4. Las escrituras no están teniendo lugar, porque algo está mal con mi hardware.

He publicado en los foros de Microchip sin resultado. Abrí un ticket con Microchip, y todo lo que hicieron fue decirme que use/escriba una llamada de ensamblaje. Parecen no estar interesados en si/por qué estas llamadas de función integrada no funcionan.

¿Alguien tiene alguna sugerencia?

2voto

jason saldo Puntos 5036

Si tienes dudas, refactoriza.

No es probable que sea un problema de hardware, pero para descartarlo, intentaría reemplazar las llamadas en C con las instrucciones exactas de ensamblador en línea descritas en la sección 7 de la hoja de datos, siguiendo todas sus recomendaciones (desactivando interrupciones, haciendo polling a WR para probar si ha finalizado, etc.)

Si logras que funcione, crea tu propia función/biblioteca a partir del ensamblador en línea y continúa.

0voto

RelaXNow Puntos 1164

Primero, una buena manera de verificar si la EEPROM ha sido escrita correctamente es leyéndola a través de la ventana de PSV (Visibilidad del Espacio de Programa). En muchos casos no necesito la ventana de PSV para nada más, así que la dejo configurada permanentemente para acceder a la EEPROM.

Segundo, no revisé tu código en C pero aquí tienes un fragmento de un proyecto de 30F4013 que configura la ventana de PSV para la lectura y escribe un byte en la EEPROM:

;\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
;
;   Subrutina IEE\_INIT
;
;   Inicializar el estado de hardware y software gestionado por este módulo.
;
         glbsub  iee\_init, regf0
;
;   Configurar la ventana de visibilidad del espacio de programa para mapear la EEPROM de datos internos
;   al espacio de datos.
;
         mov     #psvpage(ieestart), w0
         mov     w0, Psvpag  ;qué región de memoria de programa mapear en la dirección de datos 8000-FFFF
         bset    Corcon, #Psv ;habilitar la ventana de visibilidad del espacio de programa

         leaverest

... // contenido de la subrutina IEE\_WRITE

Ten en cuenta que esta rutina hace cosas interesantes más allá de simplemente escribir ciegamente los nuevos datos en la EEPROM. No hace nada si la palabra de la EEPROM ya está configurada como se desea, y también salta el borrado si solo los bits 1 se invierten a 0. De esta manera, se desgastará menos la EEPROM, especialmente si algún otro código accidentalmente entra en un bucle escribiendo en la EEPROM.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X