I think that I posted somewhere code for that.
But here is my code that copy from external I2C mem to FLASH
For first programming I joint two hex files manually.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
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.
In Main application I use GOTO StartBootloader to run bootloader.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 last project I had lot of free space in pic, and use Flash to Flash bootloader.
EDIT: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
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