I think that I posted somewhere code for that.
But here is my code that copy from external I2C mem to FLASH
	Code:
	    DEFINE RESET_ORG 1EC00h 'Move all library sub and code to start from location 125952
    EraseStr        VAR BYTE[128]
    Adr             VAR LONG
    MAdr            VAR WORD
    MCtrl           VAR BYTE
    FlashByte1      VAR BYTE
    FlashByte2      VAR BYTE
    FlashByte3      VAR BYTE
    Err             VAR BYTE
    BlockSize       VAR BYTE BANKA SYSTEM
    @ MovLW BLOCK_SIZE
    @ MovWF BlockSize
    Mem_Vcc=1
    PAUSE 6
    FOR Adr=0 TO 79999 STEP BlockSize
        ERASECODE Adr
    NEXT Adr
    FOR Adr=0 TO 79999
        MAdr=Adr.WORD0
        MCtrl=$A0 + ((Adr.BYTE2 & %00000011)<<1)
        Err=0
    BootI2CR:
        Err=Err+1
        IF Err>1 THEN PAUSE 1
        I2CREAD Mem_Sda,Mem_Scl,MCtrl,MAdr,[FlashByte1],BootI2CR
        IF Err>1 THEN PAUSE 1
        I2CREAD Mem_Sda,Mem_Scl,MCtrl,MAdr,[FlashByte2],BootI2CR
        IF Err>1 THEN PAUSE 1
        I2CREAD Mem_Sda,Mem_Scl,MCtrl,MAdr,[FlashByte3],BootI2CR
        IF FlashByte1<>FlashByte2 THEN GOTO BootI2CR
        IF FlashByte1<>FlashByte3 THEN GOTO BootI2CR
        WRITECODE Adr, FlashByte1
    NEXT Adr
    'Optional Erase I2C EEPROM
    FOR Adr=0 TO 79999 STEP 128
        MAdr=Adr.WORD0
        MCtrl=$A0 + ((Adr.BYTE2 & %00000011)<<1)
     BootI2CW:
        I2CWRITE Mem_Sda,Mem_Scl,MCtrl,MAdr,[STR EraseStr\128],BootI2CW
        PAUSE 5
    NEXT Adr
    INPUT Mem_Sda
    INPUT Mem_Scl
    Mem_Vcc=0
    @ RESET
 For first programming I joint two hex files manually.
First compile bootloader, then open hex in MPLAB X, and copy code from program memory window from 1EC00h to end of bootloader and then format it and put at end of main app.
	Code:
	@ ORG 1EC00h
StartBootloader:
ASM
    dw 06A01h, 0EFEBh, 0F0F6h, 08A01h, 0AA01h, 09A01h, 0B601h, 0D003h, 08601h, 0D851h, 0E234h, 00E08h, 06E18h, 0D861h, 03617h, 02E18h
    dw 0D7FCh, 0AA01h, 0D83Bh, 0D869h, 0D862h, 0BA01h, 0D828h, 0D82Eh, 05017h, 090D8h, 0EFE8h, 0F0F6h, 08C01h, 0AC01h, 09C01h, 06ED9h
    dw 00603h, 0E203h, 0BC01h, 0D01Bh, 0D018h, 050DEh, 0D804h, 0E215h, 0D7F7h, 08A01h, 0AA01h, 09A01h, 0B401h, 0D005h, 00BFEh, 06E0Ch
    dw 08401h, 090D8h, 0D00Ah, 0B801h, 0D005h, 06E1Fh, 08801h, 0D823h, 0E206h, 0501Fh, 0D827h, 0E203h, 0AA01h, 0EFE8h, 0F0F6
    ...........
ENDASM
 In Main application I use GOTO StartBootloader to run bootloader.
In last project I had lot of free space in pic, and use Flash to Flash bootloader.
	Code:
	DEFINE RESET_ORG .65024
Adr VAR WORD
Tmp VAR BYTE
BlockSize       VAR BYTE BANKA SYSTEM
@ MovLW BLOCK_SIZE
@ MovWF BlockSize
FOR Adr=0 TO 32255 STEP BlockSize
    ERASECODE Adr
NEXT Adr
FOR Adr=0 TO 32255 
    Adr.15=1
    READCODE Adr,Tmp
    Adr.15=0
    WRITECODE Adr,Tmp
NEXT Adr
@ RESET
 EDIT:
I didn't point out that using this method all library for bootloader are stored after RESET_ORG vector.
This way it uses little bit more code space(because you probably have same library in main application), but this makes implementation of bootloader and main app as simple as possible.
				
			
Bookmarks