I am attempting to store an event log in the FlexNVM memory of the MK20DX128VLH5 which is partitioned for half data flash and half EEPROM backup (16K each).
I did the development using the top part of the program flash and everything is working well. Events are stored as expected and can be retrieved without any flash programming errors.
My understanding is that the only difference in storing to program flash or data flash is the address being used in the FTFL_FCCOB registers. In program flash I am using 0x1F000 up to 0x1FFFF (top of the 128K device). For the FlexNVM, as I have it partitioned (DEPART= 2), I understand that the lower address area is used for data flash and the upper area is used for EEPROM backup records. So the address I am using for the data flash is 0x10000000-0x10003FFF. Before any write I confirm that the area being written is currently erased (0xFFFFFFFF).
When I write to an aligned address in the FlexNVM range I get back the MGSTAT0 flag which says that there was an error during the verify operation. Also, once the MGSTAT0 flag is set I can not write to the EEPROM anymore. This would indicate that something is messed up in the entire FlexNVM block. A reset or a write to the program flash will clear the MGSTAT0 flag and I can write to EEPROM again...until I try a write to the data flash.
NOTE: The final step in the Program Long Word command...clearing the CCIF bit...is done in a RAM located function called after the FCCOB registers are all setup in the Flash programming routine.
Debugging activity is shown below.
Does anyone have any ideas as to why the data is not being written to the FlexNVM and why the MGSTAT0 flag is being set?
Thanks,
Bill
Here are some debug requests and their related output.
- TEST command shows the current status of FTFL_FSTAT.
- TEST2 command attempts to write two long words to the FlexNVM memory
- TEST3 command writes two long words to the program flash memory
- MEMDUMP will show a range of memory
TEST2 and TEST3 commands are making calls to the exact same Flash programming routine...just the address is different. If FTFL_FSTAT is non-zero (other than the set CCIF flag) after programming it is shown in the debug output.
Solved! Go to Solution.
Hi Bill Elliot,
Thanks for your updated information.
How do you identify the PFLASH or DFLASH with the same function command(0x06 (PGM4))?
Do you use this one?
I think you can write a simple project, just test your DFLASH write, read and erase without eeprom at first, when it works, then you can add the eeprom code again.
Any updated information from your side, please kindly let me know.
Have a great day,
Kerry
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------
Question answered! As kerryzhou mentioned, the read and write addresses for the FlexNVM are different.
When setting up a FLASH command to write to the FlexNVM, bit 23 of the address must be a '1'. Reads of the FlexNVM are from the standard addresses for the Kinetis part. In the case of the K20DX128VLH5, with the FlexNVM partitioned for 16K of data and 16K of EEPROM backup, the 'reads' are from 0x1000_0000 to 0x1000_3FFF but the 'writes' are from 0x0080_0000 to 0x0080_3FFF.
HI Bill Elliot,
Please give me your detial chip partnumber, then I can help you to check more detials.
As you know, K20 have a lot of series, 50M, 72M, 100M, ect.
So, please give me your chip full name.
Waiting for your updated information.
Have a great day,
Kerry
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------
Hi Bill Elliot,
Thanks for your updated information.
1. When you do the Program Longword command to Pflash, it has problems or not?
2. If you don't do the FlexNVM partition(no eeprom function), then when you do the Dflash longword program, it has problems or not?
3. After the FlexNVM partition, do you check SIM_FCFG1, whether EESIZE and DEPART is like which you have defined?
4. When you do the flash operation, please disable all the other interrupt function. Run the flash command in the RAM.
5. The program command, do you use this command:
Have a great day,
Kerry
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------
Hello kerryzhou,
Here are the answers to your questions:
1) Programming to PFLASH works correctly.
2) The application I am running requires EEPROM so I am unable to try this at this time.
3) SIM_FCFG1 contains the correct values. DEPART = 0x02 and EESIZE = 0x06.
4) Interrupts are disabled when writing to the FLASH.
5) Yes, I am using the LongWord Program command as you show.
Again, the function called is the same for PFLASH or DFLASH, only the address to the call is different per my original question.
Thanks,
Bill
Hi Bill Elliot,
Thanks for your updated information.
How do you identify the PFLASH or DFLASH with the same function command(0x06 (PGM4))?
Do you use this one?
I think you can write a simple project, just test your DFLASH write, read and erase without eeprom at first, when it works, then you can add the eeprom code again.
Any updated information from your side, please kindly let me know.
Have a great day,
Kerry
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------
Hello kerryzhou. That was the missing piece! As stated in my original question the address of where to write the event is passed to the programming function but the 23rd bit was not being addressed. If the passed-in address is at or above the base address of the FlexNVM (0x10000000) I now create the 'write' address with
ulAdd ^= 0x10800000;
This puts the write address in the correct FLASH command range for the FlexNVM...in my case between 0x800000 and 0x803FFF.
Thanks again,
Bill