Autor Tema: uC freescale grabar y borar MEMORIA FLASH-2  (Leído 2958 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Saaac

  • PIC10
  • *
  • Mensajes: 17
uC freescale grabar y borar MEMORIA FLASH-2
« en: 11 de Julio de 2012, 12:43:08 »
Hola,

En cuestion es del siguiente micro controlador MC68HC908GZ60. No he encontrado nada relacionada con la flash-2 por eso abro este tema. Intento grabar y borrar informacion en la memoria FLASH-2 del MC68HC908GZ60 de la misma forma que lo hacia en la FLASH-1,con las mismas instruciones pero cambiando los registros del 1 al 2. El problema que me encuentro es que siempre que intento grabar algo en la FLASH-2 me sale en todas las posiciones de memoria el valor 0xAD y yo intento grabar cualquier otra valor. Os pongo aqui el codigo de como grabo y borro en la FLASH-1 que me funciona.
y de como grabo y borro en la FLASH-2 que no me funciona y siempre que intento grabar en una direccion, me sale 0xAD en todas las posiciones de esa parte de la FLASH-2.

FLASH-1 Codigo:
__________________________________________________​________________________________
extern void GRABAR_FLASH(unsigned char bits);
extern void BORRAR_FLASH();

#define __DI() \
{ asm sei; }      /* Disable interrupts  */ \
#define __EI() \
 { asm cli; }      /* Enable interrupts */ \
 
UINT8 *PunteroMemoria=(UINT8*)0;
extern UINT8 *PunteroMemoria;

void GRABAR_FLASH(unsigned char bits)
{
  char VARIABLEINUTIL;
  char DELAY = 1;
     
  __DI();
  //1
  setReg8Bits(FL1CR,FL1CR_PGM_MASK);
  //2
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  VARIABLEINUTIL=FL1BPR;
  //3
  PunteroMemoria = 0;
  PunteroMemoria += 0xFFD0; 
  *PunteroMemoria = 25;
  //4
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //5
  setReg8Bits(FL1CR,FL1CR_HVEN_MASK);
  //6
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //7
  PunteroMemoria = 0;
  PunteroMemoria += 0xFFD0; 
  *PunteroMemoria = bits;
  //8
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //10
  clrReg8Bits(FL1CR,FL1CR_PGM_MASK);
  //11
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //12
  clrReg8Bits(FL1CR,FL1CR_HVEN_MASK);
  //13
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<200;++VARIABLEINU​TIL){};
  __EI();
}

void BORRAR_FLASH()
{
  char VARIABLEINUTIL;
  char DELAY = 1;
 
  __DI();
  //1
  setReg8Bits(FL1CR,FL1CR_ERASE_MASK);  //ERASE
  clrReg8Bits(FL1CR,FL1CR_MASS_MASK);  //MASS
  //2
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  VARIABLEINUTIL=FL1BPR;
  //3
  PunteroMemoria = 0;
  PunteroMemoria += 0xFFD0; 
  *PunteroMemoria = 25;
  //4
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //5
  setReg8Bits(FL1CR,FL1CR_HVEN_MASK);
  //6
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //7
  clrReg8Bits(FL1CR,FL1CR_ERASE_MASK);
  //8
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //9
  clrReg8Bits(FL1CR,FL1CR_HVEN_MASK);
  //10
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  __EI();
}
_____________________END FLASH1____________________________________________

FLASH-2 Codigo:
__________________________________________________​___________________________

extern void GRABAR_FLASH(unsigned char bits);
extern void BORRAR_FLASH();

#define __DI() \
{ asm sei; }      /* Disable interrupts  */ \
#define __EI() \

 { asm cli; }      /* Enable interrupts */ \

UINT8 *PunteroMemoria=(UINT8*)0;
extern UINT8 *PunteroMemoria;

void GRABAR_FLASH(unsigned char bits)
{
  char VARIABLEINUTIL;
  char DELAY = 1;
     
  __DI();
  //1
  setReg8Bits(FL2CR,FL2CR_PGM_MASK);
  //2
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  VARIABLEINUTIL=FL2BPR;
  //3
  PunteroMemoria = 0;
  PunteroMemoria += 0x0462; 
  *PunteroMemoria = 25;
  //4
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //5
  setReg8Bits(FL2CR,FL2CR_HVEN_MASK);
  //6
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //7
  PunteroMemoria = 0;
  PunteroMemoria += 0x0462; 

  *PunteroMemoria = bits;
  //8
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //10
  clrReg8Bits(FL2CR,FL2CR_PGM_MASK);
  //11
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //12
  clrReg8Bits(FL2CR,FL2CR_HVEN_MASK);
  //13
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<200;++VARIABLEINU​TIL){};
  __EI();
}

void BORRAR_FLASH()
{
  char VARIABLEINUTIL;
  char DELAY = 1;
 
  __DI();
  //1
  setReg8Bits(FL2CR,FL2CR_ERASE_MASK);  //ERASE
  clrReg8Bits(FL2CR,FL2CR_MASS_MASK);  //MASS
  //2
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  VARIABLEINUTIL=FL2BPR;
  //3
  PunteroMemoria = 0;
  PunteroMemoria += 0x0462; 
  *PunteroMemoria = 25;
  //4
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //5
  setReg8Bits(FL2CR,FL2CR_HVEN_MASK);
  //6
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //7
  clrReg8Bits(FL2CR,FL2CR_ERASE_MASK);
  //8
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  //9
  clrReg8Bits(FL2CR,FL2CR_HVEN_MASK);
  //10
  for (VARIABLEINUTIL=0;VARIABLEINUTIL<DELAY;++VARIABLEI​NUTIL){};
  __EI();
}

______________________END FLASH2____________________________________________

Gracias.

Desconectado Saaac

  • PIC10
  • *
  • Mensajes: 17
Re: uC freescale grabar y borar MEMORIA FLASH-2
« Respuesta #1 en: 13 de Julio de 2012, 02:50:08 »
Sigo mirandome el datasheet y lo unico que no me cuadra es esta nota:

NOTE
The vector locations and the FLASH block protect registers are located in
the same page. FL1BPR and FL2BPR are not protected with special
hardware or software. Therefore, if this page is not protected by FL1BPR
and the vector locations are erased by either a page or a mass erase
operation, both FL1BPR and FL2BPR will also get erased.

Pq el resto del proceso es identico el algoritmo de la FLASH-1.

Un saludo.

Desconectado Saaac

  • PIC10
  • *
  • Mensajes: 17
Re: uC freescale grabar y borar MEMORIA FLASH-2
« Respuesta #2 en: 23 de Julio de 2012, 04:34:50 »
Hola,

Al final la solucion es que cuando grabas o borras en la flash-2. las rutinas del codigo de programa para realizar esta accion tienen que estar en la flash-1.
Teniendo en cuenta esto no hay ningun problema con el codigo que he puesto.

Gracias a todos.