Dear NXP,
I'm developing a firmware which is supposed to store some data in internal flash. The target hardware used by the customer is based on MK20DN512ZVMD10, while for development I have your tower system with MK60DN512VMD10. We both have a recent MCUXpresso and SDK for K20.
I expected that these two microcontrollers would be compatible, but there are some differences in their operation regarding flash. Could you, please, help me with that?
1) Erasing flash
a) On my K60 the function fsl_flash_erase works fine, but on the target K20 it causes a reset.
b) We've also tried a "custom" erase function according to the description in the manual. In pseudocode it goes like this:
wait for completion of previous operation (CCIF -> 0)
delay (for loop)
clear ACCERR and FPVIOL fields - just in case
load values to FCCOBx registers
set CCIF to start erase
delay (for loop)
wait for completion of the operation (CCIF -> 0)
Note the two delay loops. On my K60 the code runs fine without them, but they turned out to be needed for the target K20. Without them a reset occurs.
The delay loop works just like this:
volatile unsigned int i=0, tmp=0;
for (i=0 ;i<1000000 ; ++i) { tmp += 0; }
Also, note that the function at the end waits for the operation to complete.
2) Reading flash after write
This was not working well on both K20 and K60 until we applied some mechanism to refresh the cache.
On the K60 is seems that functions from the SDK handle that correctly.
On the target K20 that was not the case, in particular flash_cache_clear did not help. What did work for us was a number of "dummy reads":
static uint32_t read_val(void)
{
uint32_t v = 0;
// ugly hack to ensure correct reading of flash memory
for (int i=0 ; i<10 ; ++i)
{
v = data.val;
}
return v;
}
Above, the structure "data" is located in the flash range of interest. It seems that reading twice is sufficient.
If you could shed any light on this case, please, help me understand what is happening.
Best regards,
Adam Rudziński