Forum Discussion

Altera_Forum's avatar
Altera_Forum
Icon for Honored Contributor rankHonored Contributor
12 years ago

Nios II erase sector

I'm working on cyclone III with the EPCS64, in my Nios code C the time delay of erasing for one sector is

defined at 3 seconds to be sure of the erasing, I would like to know if there is a way to

reduce this time of erasing in reading one of the epcs register for example ?

5 Replies

  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    Here is the piece of C code Nios to erase a sector :

    alt_epcs_flash_erase_block(p_epcs_fd,epcs_addr);

    OSTimeDly(3*OS_TICKS_PER_SEC);
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    Assuming it is NOR flash, you repeatedly read the flash's status register until it indicates that the sector is written.

    I'd have thought that alt_epcs_flash_erase_block() already did that - IIRC you can't do any other flash cycles until the ease completes (it is a long time since I wrote NOR flash code).

    You should have the source for the flash functions - look at what they do.
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    I've something like that : // polling on the busy bit of the EPCS every 100 ms

    // while ((epcs_read_status_register(EPCS_CTRL_BASE_B+0x400) & 0x1) != 0x0)

    // OSTimeDly(OS_TICKS_PER_SEC/100); Don't know if I've to use it to look each 100 ms if I erased the sector, what is the value send back the alt_epcs_erase_block() ?!
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    FWIW if your board has two 16bit flash chips to generate a 32bit memory device, you must wait for both chips to signal that the erase (or write) has completed - that was the first bug I had to fix in the vendor supplied software for an evaluation board! (vendor and board will remain nameless!!).

    I don't beleive there is any reason to do any kind of delay between the reads of the status register. Once the erase/write is complete I think you then write to the device to terminate the erase/write - so this would have to be done inside the erase/write function.

    (It is over 10 years since I was doing this.)

    Just look at the source for alt_epcs_erase_block().
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    Ok, did it and just see that alt_epcs_erase_block() send back 0 when it's ok otherwise another value.

    So I did something like this

    while(alt_epcs_flash_erase_block(p_epcs_fd,epcs_addr))

    OSTimeDly(OS_TICKS_PER_SEC);

    is it good to do this or am I completely wrong