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