AnsweredAssumed Answered

FlexMem Partition Fails (Access error detected)

Question asked by Leif Zars on Aug 4, 2014
Latest reply on Aug 5, 2014 by Kerry Zhou

I have a MK20DX256VLK7 that was previously partitioned, yet my data wasn't persisting. So I wanted to force a re partition. I used the attached code, yet I get an Access Error (ACCERR). I have reviewed the documentation and believe I am configuring the command properly, but something is wrong. Any help would be appreciated, thanks




#include "derivative.h" /* include peripheral declarations */

/* function prototypes */

int partition_flash(int, int);


#define EEPROM_256_256 0x35   // subsystem A = 256 bytes, subsystem B = 256 bytes

#define DFLASH_SIZE_16    0x02


/* Define globals for address of counters */

#define LONGWORD_COUNTER_ADDR 0x14000000

#define WORD_COUNTER_ADDR 0x14000004

#define BYTE_COUNTER_ADDR 0x14000006


void main(void) {




  /* Partition the memory to enable FlexMem mode */

  if (partition_flash(EEPROM_256_256, DFLASH_SIZE_16)) {

  /* Device has been partitioned for the first time, so this

  * means the counters have not been initialized yet. We'll

  * zero them out now.


  *((uint32_t *) (LONGWORD_COUNTER_ADDR)) = 0x0;



  /* Wait for the command to complete */





  *((uint16_t *) (WORD_COUNTER_ADDR)) = 0x0;



  /* Wait for the command to complete */



  *((uint8_t *) (BYTE_COUNTER_ADDR)) = 0x0;

  /* Wait for the command to complete */






/* Partition flash routine. This function can be used to setup

* the flash for enhanced EEPROM operation. In order to guarantee

* the eEE endurance the partition command should only be used one

* time (re-partitioning in a different configuration will erase

* wear-leveling data, so endurance can no longer be guaranteed).

* This function will test to make sure the flash has not been

* partitioned already.


* Parameters:

* eeprom_size size of the two EEPROM data sets (A and B) defines in flexmem_demo.h

* dlfash_size amount of dflash memory available after partitioning defines in flexmem_demo.h


* Returns:

* 1  partitioning completed successfully

* 0  partitioning not completed (device is already partitioned)


int partition_flash(int eeprom_size, int dflash_size) {

  /* Test to make sure the device is not already partitioned. If it

  * is already partitioned, then return with no action performed.


  if ((SIM_FCFG1 & SIM_FCFG1_DEPART(0xF))!= 0x00000F00){

  //  return 0; //Force a re partition



  /* Write the FCCOB registers */FTFL_FCCOB0 = FTFL_FCCOB0_CCOBn(0x80); // Selects the PGMPART command

  FTFL_FCCOB1 = 0x00;

  FTFL_FCCOB2 = 0x00;

  FTFL_FCCOB3 = 0x00;


  /* FCCOB4 is written with the code for the subsystem sizes (eeprom_size define) */

  FTFL_FCCOB4 = eeprom_size;


  /* FFCOB5 is written with the code for the Dflash size (dflash_size define) */

  FTFL_FCCOB5 = dflash_size;



  /* All required FCCOBx registers are written, so launch the command */



  /* Wait for the command to complete */



  return 1;