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:
- Las escrituras están teniendo lugar, y no estoy leyendo los datos de vuelta correctamente.
- Las escrituras no están teniendo lugar, porque algo está mal con mi código.
- Las escrituras no están teniendo lugar, porque algo está mal con mis opciones de proyecto/compilación.
- 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?