David LECOMTE

Erease Flash 0n MC9S08QE8

Discussion created by David LECOMTE on Feb 3, 2009
Latest reply on Feb 3, 2009 by bigmac
To erase flash, i use following  code and asm code doonstack.asm
 
#include <hidef.h>        /* for EnableInterrupts macro */
#include "derivative.h"  /* include peripheral declarations */
#include "hcs08.h"        // This is our definition file!
#include <MC9S08QE8.h>
#include "doonstack.h"
 
#define BUSCLK  8000000
#define vFCDIV  (BUSCLK/200000-1)
 
char fdata, operation;
unsigned int faddress;
// Write-protect addresses ranging from 0xE400 up to 0xFFFF
const byte NVPROT_INIT @0x0000FFBD = 0xE2;
// MCU innitialization
void mcu_init(void)
{
  SOPT1 = bBKGDPE;         // Enable debug pin
  ICSSC = NVFTRIM;        // configure FTRIM value
  ICSTRM = NVICSTRM;      // configure TRIM value
  ICSC2 = 0;               // ICSOUT = DCOOUT / 1
  // BUSCLK is now 8 MHz
  FCDIV = 39;//vFCDIV;          // set FCLK divider (FCLK = 200kHz)
}
#pragma inline
// Read the content of a memory address
char flash_read(unsigned int address)
{
  unsigned char *pointer;
  pointer = (char*) address;
  return (*pointer);
}
// Write a byte into the specified FLASH address
char flash_write(unsigned int address, unsigned char data)
{
  unsigned char *pointer;
  pointer = (char*) address;
  FlashProg(pointer,data);   // call the FLASH programming function
  if (FSTAT_FACCERR) data=1; else data=0;
  if (FSTAT_FPVIOL) data|=2;
  return(data);
}
// Erase a sector of the FLASH memory
unsigned char flash_sector_erase(unsigned int address)
{
  unsigned char *pointer, res;
  pointer = (char*) address;
  FlashErase(pointer);
  if (FSTAT_FACCERR) res=1; else res=0;
  if (FSTAT_FPVIOL) res|=2;
  return(res);
}
void main(void)
{
  mcu_init();
  fdata = 0;
  faddress = 0xE200;
  operation = 1;
  while (1)
  {
    switch (operation)
    {
      case 1: // sector erase
        fdata = flash_sector_erase(faddress);
        operation = 2;     
        break;
      case 2: // write operation
        faddress = 0xE200;
        fdata = 'D';
        fdata = flash_write(faddress,fdata);
        operation = 3;
        break;
      case 3: // read operation
        faddress = 0xE200;
        fdata = flash_read(faddress);
        operation = 0;
        break;
    }
  }
}
If i run full chip simulation and i run code my erase function don't run. I don't kown why?
Do you have any idea about this?
Thanks
david

Outcomes