MPC5748 Flash Program and Erase MCR DONE bit

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

MPC5748 Flash Program and Erase MCR DONE bit

Jump to solution
3,082 Views
shijiaguo
Contributor II

Hello, 

 

I'm currently using the flash module of MPC5748G. In the reference manual, it mentioned that during flash program/erase, after initiating the program/erase action, you need to wait for MCR[DONE] to go high. I'm pasting the whole sequence in below:

1. Change the value in the MCR[ERS] bit from 0 to 1.
2. Select the block or blocks to be erased by writing ones to the appropriate registers in
SEL0, SEL1, SEL2, or SEL3 registers.
NOTE
Lock and Select are independent. If a block is selected and
locked, no erase occurs.
3. Write to any address in flash memory. This is referred to as an erase interlock write.
An erase interlock write to UTest NVM space is not allowed if sealed (since erase is
not allowed in the UTest NVM space when sealed).
4. Write a logic 1 to the MCR[EHV] bit to start an internal erase sequence or skip to
step 9 to terminate.
5. Wait until the MCR[DONE] bit goes high.
NOTE
Since MCR[DONE] clears with MCR[EHV] being set, it
may not be possible for software to read MCR[DONE] as a
0 prior to this step, depending on the operation selected.
6. Confirm MCR[PEG] = 1.
7. Write a logic 0 to the MCR[EHV] bit.
8. If more blocks are to be erased, return to step 2.
9. Write a logic 0 to the MCR[ERS] bit to terminate the erase.

 

 

 

The problem I'm running into is that I'm trying to erase a block (4K) at a time, however, it's taking too long. If I do as the reference manual says: to wait for the DONE bit to go high, it's blocking other processes for too long. So I'm trying to figure out: what's the best practice to negate this. I can think of some options:

1. I can try to segment the block and erase them part by part, but this is not very elegant

2. I can skip the waiting part, and just check the DONE bit whenever I have to do another program/erase. But how do I perform the steps afterwards (step 6,7,8,9)? Can you set a software interrupt when the DONE bit goes high? Or do you have to poll the register, say, every second?

 

Or is there some other more elegant way of doing this?

Labels (1)
0 Kudos
1 Solution
1,592 Views
lukaszadrapa
NXP TechSupport
NXP TechSupport

Hi,

yes, you do not need to wait for the DONE flag. You can either poll the flag or you can enable interrupt using MCR[PECIE]:

pastedImage_1.png

Just do not access the RWW Partition which is being erased because Read-While-Write is supported only  between partitions. 

Next option is to use SSD flash drivers:

http://www.nxp.com/assets/downloads/data/en/device-drivers/C55_JDP_SSD.exe

The drivers are asynchronous - the erase operation is started by FlashErase function. The function does not wait for completion of the operation. Then you can periodically check the status by FlashCheckStatus function. SW example can be found here:

https://community.nxp.com/docs/DOC-106580

And this is the same example without SSD drivers:

https://community.nxp.com/docs/DOC-105380

Regards,

Lukas

View solution in original post

2 Replies
1,593 Views
lukaszadrapa
NXP TechSupport
NXP TechSupport

Hi,

yes, you do not need to wait for the DONE flag. You can either poll the flag or you can enable interrupt using MCR[PECIE]:

pastedImage_1.png

Just do not access the RWW Partition which is being erased because Read-While-Write is supported only  between partitions. 

Next option is to use SSD flash drivers:

http://www.nxp.com/assets/downloads/data/en/device-drivers/C55_JDP_SSD.exe

The drivers are asynchronous - the erase operation is started by FlashErase function. The function does not wait for completion of the operation. Then you can periodically check the status by FlashCheckStatus function. SW example can be found here:

https://community.nxp.com/docs/DOC-106580

And this is the same example without SSD drivers:

https://community.nxp.com/docs/DOC-105380

Regards,

Lukas

1,592 Views
shijiaguo
Contributor II

Thank you! that works.

0 Kudos