well approach seems to work , here is a rundown , the real key is USE A FLASH CHIP THAT SUPPORTS SMALL SECTOR ERASE SIZE AND USE THAT SETTING
3 new routines - to be added to examples i left
hope it save others time in the future
Regards
Sheldon
1. Flash_byte_modfy - use - change 1- 255 bytes of a selected sector/page ,
uses sector 0 as scratchpad and places changed code to sector 0 ,
copies all other pages / bytes not changed of the selected sector to sector 0
then erases the origin sector and copy complete sector 0 to origin
how to use
Code:'---------- FLASH_MODIFY_BYTE TEST - example Data_Length = 10 ' changed data length For SDC_index = 0 to Data_Length SDC_buffer[SDC_index] = SDC_index ' fill the changed data into buffer with values next SDC_index SDC_Sector = 1 ' sector start address for where data is to be placed SDC_Page = 3 ' page start address for where data is to be placed SDC_Byte = 16 ' byte start addresss for where data is to be placed gosub Flash_Byte_ModifyCode:Flash_Byte_Modify: ' assumes address , length ( upto 256bytes ) ' asusmes bytes changed are in the same sector and no boundry cross ' assumes sector 0 is not protected ' assumes selected sector is not protected Flash_Addr_Copy.byte3 = Data_Length ' save the selected address & length Flash_Addr_Copy.byte2 = SDC_Sector Flash_Addr_Copy.byte1 = SDC_Page Flash_Addr_Copy.byte0 = SDC_Byte SDC_sector = 0 gosub Flash_Sec_Erase ' erase sector 0 SDC_sector = 0 ' use sector 0,instead of given sector , but use given page, byte length gosub Flash_write ' Write the data to sector 0 if Flash_Addr_Copy.byte1 = 0 then ' find the pages to copy - copy all pages/ bytes above 0 for given sector Flash_Page_Orgin =1 ' start page of orgin Flash_Page_length = 255 ' how many pages Flash_Sec_Orgin = Flash_Addr_Copy.byte2 ' sector Flash_Sec_Dest = 0 Flash_Page_Dest = 1 gosub Flash_Page_Copy endif if Flash_Addr_Copy.byte1 = 255 then ' find the pages to copy - copy all pages/ bytes below given page/ byte of sector Flash_Page_Orgin =0 ' start page of orgin Flash_Page_length = 254 ' how many pages Flash_Sec_Orgin = Flash_Addr_Copy.byte2 ' sector Flash_Sec_Dest = 0 Flash_Page_Dest = 0 gosub Flash_Page_Copy endif if Flash_Addr_Copy.byte1 >0 and Flash_Addr_Copy.byte1 < 254 then ' find the pages to copy - copy all pages/ bytes below given page/ byte of sector Flash_Page_Orgin =0 ' start page of orgin Flash_Page_length = Flash_Addr_Copy.byte1 - 1 ' how many pages Flash_Sec_Orgin = Flash_Addr_Copy.byte2 ' sector Flash_Sec_Dest = 0 ' start at same page value as orgin Flash_Page_Dest = 0 gosub Flash_Page_Copy Flash_Page_Orgin = Flash_Addr_Copy.byte1 + 1 ' start page of orgin Flash_Page_length = 255 - Flash_Page_Orgin ' panges to copy = 255 - start address +1 Flash_Sec_Orgin = Flash_Addr_Copy.byte2 ' sector Flash_Sec_Dest = 0 Flash_Page_Dest = Flash_Addr_Copy.byte1 + 1 gosub Flash_Page_Copy endif if Flash_Addr_Copy.byte0 + Flash_Addr_Copy.byte3 < 255 then ' if the start byte + data length of the data changed is < 255 bytes , ' then copy bytes below the selected changed data SDC_Sector = Flash_Addr_Copy.byte2 ' read selected sector SDC_PAGE = Flash_Addr_Copy.byte1 ' of selected page SDC_byte = 0 ' start address bytes 0 to Data_Length = Flash_Addr_Copy.byte0 - 1 ' selected byte - 1 ( length) gosub Flash_Read ' read SDC_Sector = 0 ' use sector 0 aselected sector SDC_PAGE = Flash_Addr_Copy.byte1 ' of selected page SDC_byte = 0 ' start address bytes 0 to Data_Length = Flash_Addr_Copy.byte0 - 1 ' selected byte - 1 ( length) gosub Flash_Write ' write ' then copy bytes above the selected changed data SDC_Sector = Flash_Addr_Copy.byte2 ' read selected sector SDC_PAGE = Flash_Addr_Copy.byte1 ' of selected page SDC_byte = Flash_Addr_Copy.byte0 + Flash_Addr_Copy.byte3 ' start address bytes above given address and length Data_Length = 255 - SDC_byte ' data above changed bytes ( length = 255 bytes - given addrees + given length ) gosub Flash_Read ' read the data SDC_Sector = 0 ' use sector 0 SDC_PAGE = Flash_Addr_Copy.byte1 ' of selected page SDC_byte = Flash_Addr_Copy.byte0 + Flash_Addr_Copy.byte3 ' start address bytes above given address and length Data_Length = 255 - SDC_byte ' data above changed bytes ( length = 255 bytes - given addrees + given length ) gosub Flash_Write ' write the data endif ' Sector 0 should now have a complete copy of the data + changed data from the orginal selected sector Flash_Sec_Orgin = 0 ' copy sector 0 Flash_Sec_dest = Flash_Addr_Copy.byte2 ' erase destination and copy data from flash orgin Flash_clear = 1 ' set flag erase orgin sector 0 after copy gosub Flash_Sec_Copy ' copy the sector return
2. Sector copy routine - - this routine copy the data from the origin sector to destination sector
- will erase destination sector prior to copy
- option flag " Flash_clear " when set will Erase orgin sector after copy
- assumes no copy protect on destination or origin
how to use
Code:Flash_Sec_Orgin = 0 ' sector origin - sector to copy Flash_Sec_dest = 1 ' sector destination - will be erased then copy data from sector origin Flash_clear = 1 ' option flag to erase origin sector after copy gosub Flash_Sec_Copy ' copy the sector3. Page copy routine - this routine will copy pages 0-255 of origin to destinationCode:Flash_Sec_Copy: ' copys data from 1 sector to another ' erases destination sector - optional clean of orginal sector ' assumes Flash_Sect_Orgin,Flash_Sect_Dest Flash_clear ' Erases wont work on sectors that are write protected ' sector erase take 600ms per instruction SDC_Sector = Flash_Sec_Dest ' clear destination sector gosub Flash_Sec_Erase ' use SDC_sector info to erase destination sector for SDC_PAGE = 0 to 255 ' copy sector 0 pages to selected sector 0 ( 256bytes at a time) SDC_Sector = Flash_Sec_Orgin ' sector to copy SDC_byte = 0 Data_Length = 255 gosub Flash_Read ' read the data to buffer SDC_Sector = Flash_Sec_Dest ' sector to copy to SDC_byte = 0 ' use sector details for destination Data_Length = 255 gosub Flash_Write ' write the data next SDC_PAGE if Flash_clear = 1 then SDC_sector = Flash_Sec_Orgin ' clean up orgin sector gosub Flash_Sec_Erase endif return
- no sector boundry cross supported
- assumes destination is all "1" - no erase is required
- sector is not protected
how to use
Code:' example copy sector 0/ page 0 50 pages to sector 0 , start page 125 ( page size number of bytes depends on chip) Flash_Page_Orgin = 0 ' start address page of origin Flash_Page_length = 50 ' number of pages to copy Flash_Sec_Orgin = 0 ' sector origin address Flash_Sec_Dest = 0 ' Sector destination Flash_Page_Dest = 125 ' Page destination gosub Flash_Page_CopyCode:Flash_Page_Copy: ' copys data from pages 0 -255 from orgin or destination sector ' assumes destination sector pages are Erased ' assumes pages orgin and pages destination do not cross sector boundrys ' assumes Flash_Page_Orgin,Flash_Page_dest ,Flash_Page_length, Flash_Sec_orgin ,Flash_Sec_dest ' writes wont work on sectors that are write protected for Flash_tmp2 = Flash_Page_Orgin to Flash_Page_length ' copy sector 0 pages to selected sector 0 ( 256bytes at a time) SDC_Sector = Flash_Sec_Orgin ' sector to copy SDC_PAGE = Flash_tmp2 SDC_byte = 0 Data_Length = 255 gosub Flash_Read ' read the data to buffer SDC_Sector = Flash_Sec_Dest ' sector to copy to SDC_PAGE = Flash_Page_Dest ' page to copy to SDC_byte = 0 Data_Length = 255 gosub Flash_Write ' write the data Flash_Page_Dest = Flash_Page_Dest + 1 ' increment destination page next Flash_tmp2 return




Bookmarks