English
Language : 

S29WSXXXN Datasheet, PDF (32/95 Pages) SPANSION – 256/128/64 Megabit (16/8/4 M x 16-Bit) CMOS 1.8 Volt-only Simultaneous Read/Write, Burst Mode Flash Memory
Preliminary
Software Functions and Sample Code
Table 7.21. Write Buffer Program
(LLD Functions Used = lld_WriteToBufferCmd, lld_ProgramBufferToFlashCmd)
Cycle
Description
Operation
Byte Address
Word Address
Data
1
Unlock
Write
Base + AAAh
Base + 555h
00AAh
2
Unlock
Write
Base + 554h
Base + 2AAh
0055h
3
Write Buffer Load Command
Write
Program Address
0025h
4
Write Word Count
Write
Program Address
Word Count (N–1)h
Number of words (N) loaded into the write buffer can be from 1 to 32 words.
5 to 36
Load Buffer Word N
Write
Program Address, Word N
Word N
Last
Write Buffer to Flash
Write
Sector Address
0029h
Notes:
1. Base = Base Address.
2. Last = Last cycle of write buffer program operation; depending on number of
words written, the total number of cycles may be from 6 to 37.
3. For maximum efficiency, it is recommended that the write buffer be loaded with
the highest number of words (N words) possible.
The following is a C source code example of using the write buffer program function. Refer to
the Spansion Low Level Driver User’s Guide (available on www.amd.com and
www.fujitsu.com) for general information on Spansion Flash memory software development
guidelines.
/* Example: Write Buffer Programming Command
*/
/* NOTES: Write buffer programming limited to 16 words. */
/*
All addresses to be written to the flash in */
/*
one operation must be within the same flash */
/*
page. A flash page begins at addresses
*/
/*
evenly divisible by 0x20.
*/
UINT16 *src = source_of_data;
/* address of source data
*/
UINT16 *dst = destination_of_data;
/* flash destination address
*/
UINT16 wc = words_to_program -1;
/* word count (minus 1)
*/
*( (UINT16 *)base_addr + 0x555 ) = 0x00AA; /* write unlock cycle 1
*/
*( (UINT16 *)base_addr + 0x2AA ) = 0x0055; /* write unlock cycle 2
*/
*( (UINT16 *)sector_address ) = 0x0025; /* write write buffer load command */
*( (UINT16 *)sector_address ) = wc;
/* write word count (minus 1)
*/
loop:
*dst = *src; /* ALL dst MUST BE SAME PAGE */ /* write source data to destination */
dst++;
/* increment destination pointer */
src++;
/* increment source pointer
*/
if (wc == 0) goto confirm
/* done when word count equals zero */
wc--;
/* decrement word count
*/
goto loop;
/* do it again
*/
confirm:
*( (UINT16 *)sector_address ) = 0x0029; /* write confirm command
*/
/* poll for completion */
/* Example: Write Buffer Abort Reset */
*( (UINT16 *)addr + 0x555 ) = 0x00AA; /* write unlock cycle 1
*/
*( (UINT16 *)addr + 0x2AA ) = 0x0055; /* write unlock cycle 2
*/
*( (UINT16 *)addr + 0x555 ) = 0x00F0; /* write buffer abort reset
*/
32
S29WSxxxN_00_F0 October 29, 2004