FlexMem Partition Fails (Access error detected)

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

FlexMem Partition Fails (Access error detected)

615 Views
leifzars
Contributor IV

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

Leif.

#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) {

  SCB_SHCSR |= SCB_SHCSR_BUSFAULTENA_MASK | SCB_SHCSR_MEMFAULTENA_MASK

  | SCB_SHCSR_USGFAULTENA_MASK;

  /* 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 */

  while (!(FTFL_FCNFG & FTFL_FCNFG_EEERDY_MASK))

  ;

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

  /* Wait for the command to complete */

  while (!(FTFL_FCNFG & FTFL_FCNFG_EEERDY_MASK))

  ;

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

  /* Wait for the command to complete */

  while (!(FTFL_FCNFG & FTFL_FCNFG_EEERDY_MASK))

  ;

  }

}

/********************************************************************/

/* 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 */

  FTFL_FSTAT = FTFL_FSTAT_CCIF_MASK;

  /* Wait for the command to complete */

  while (!(FTFL_FSTAT & FTFL_FSTAT_CCIF_MASK));

  return 1;

}

Labels (1)
0 Kudos
1 Reply

259 Views
kerryzhou
NXP TechSupport
NXP TechSupport

Hi  Leif Zars,

    Your flexmemory partition fails, it is because your partition is already exist.

    If you want to parittion the flexmemory again, you need to do the flash mass ease at first, then your older partition will not exit, and you can do your new partiotion.

    About how do mass ease,  if you are using cw, you do like following, just choose the "alway mass earse on connect‘.

pastedImage_0.png

  After the configration, then you downloader your code and run it again, you will partition the flexnvm succesfully.

Wish my answer will help you!

If you still have question, please let me know!


Have a great day,

Jingjing

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos