/** * \file progP32.c - algorithms to program the PIC32 family of microcontrollers * Copyright (C) 2019 Alberto Maccioni * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA * or see */ #include "common.h" /*#ifdef _MSC_VER void COpenProgDlg::CheckData(int a,int b,int addr,int *err) #else void CheckData(int a,int b,int addr,int *err) #endif { if(a!=b){ #ifdef _MSC_VER CString str; #endif PrintMessage(strings[S_NL]); PrintMessage4(strings[S_CodeVError],addr,addr,a,b); //"Error writing address %4X: written %02X, read %02X\r\n" (*err)++; } } */ struct ID32{ int id; char *device; } PIC32LIST[]={ {0x0938053,"PIC32MX360F512L"}, {0x0934053,"PIC32MX360F256L"}, {0x092D053,"PIC32MX340F128L"}, {0x092A053,"PIC32MX320F128L"}, {0x0916053,"PIC32MX340F512H"}, {0x0912053,"PIC32MX340F256H"}, {0x090D053,"PIC32MX340F128H"}, {0x090A053,"PIC32MX320F128H"}, {0x0906053,"PIC32MX320F064H"}, {0x0902053,"PIC32MX320F032H"}, {0x0978053,"PIC32MX460F512L"}, {0x0974053,"PIC32MX460F256L"}, {0x096D053,"PIC32MX440F128L"}, {0x0952053,"PIC32MX440F256H"}, {0x0956053,"PIC32MX440F512H"}, {0x094D053,"PIC32MX440F128H"}, {0x0942053,"PIC32MX420F032H"}, {0x04317053,"PIC32MX575F256H"}, {0x0430B053,"PIC32MX675F256H"}, {0x04303053,"PIC32MX775F256H"}, {0x04309053,"PIC32MX575F512H"}, {0x0430C053,"PIC32MX675F512H"}, {0x04325053,"PIC32MX695F512H"}, {0x0430D053,"PIC32MX775F512H"}, {0x0430E053,"PIC32MX795F512H"}, {0x04333053,"PIC32MX575F256L"}, {0x04305053,"PIC32MX675F256L"}, {0x04312053,"PIC32MX775F256L"}, {0x0430F053,"PIC32MX575F512L"}, {0x04311053,"PIC32MX675F512L"}, {0x04341053,"PIC32MX695F512L"}, {0x04307053,"PIC32MX775F512L"}, {0x04307053,"PIC32MX795F512L"}, {0x04400053,"PIC32MX534F064H"}, {0x04401053,"PIC32MX564F064H"}, {0x04403053,"PIC32MX564F128H"}, {0x04405053,"PIC32MX664F064H"}, {0x04407053,"PIC32MX664F128H"}, {0x0440B053,"PIC32MX764F128H"}, {0x0440C053,"PIC32MX534F064L"}, {0x0440D053,"PIC32MX564F064L"}, {0x0440F053,"PIC32MX564F128L"}, {0x04411053,"PIC32MX664F064L"}, {0x04413053,"PIC32MX664F128L"}, {0x04417053,"PIC32MX764F128L"}, {0x04A07053,"PIC32MX110F016B"}, {0x04A09053,"PIC32MX110F016C"}, {0x04A0B053,"PIC32MX110F016D"}, {0x04A01053,"PIC32MX210F016B"}, {0x04A03053,"PIC32MX210F016C"}, {0x04A05053,"PIC32MX210F016D"}, {0x04A06053,"PIC32MX120F032B"}, {0x04A08053,"PIC32MX120F032C"}, {0x04A0A053,"PIC32MX120F032D"}, {0x04A00053,"PIC32MX220F032B"}, {0x04A02053,"PIC32MX220F032C"}, {0x04A04053,"PIC32MX220F032D"}, {0x04D07053,"PIC32MX130F064B"}, {0x04D09053,"PIC32MX130F064C"}, {0x04D0B053,"PIC32MX130F064D"}, {0x04D01053,"PIC32MX230F064B"}, {0x04D03053,"PIC32MX230F064C"}, {0x04D05053,"PIC32MX230F064D"}, {0x04D06053,"PIC32MX150F128B"}, {0x04D08053,"PIC32MX150F128C"}, {0x04D0A053,"PIC32MX150F128D"}, {0x04D00053,"PIC32MX250F128B"}, {0x04D02053,"PIC32MX250F128C"}, {0x04D04053,"PIC32MX250F128D"}, {0x06610053,"PIC32MX170F256B"}, {0x0661A053,"PIC32MX170F256D"}, {0x06600053,"PIC32MX270F256B"}, {0x0660A053,"PIC32MX270F256D"}, {0x0660C053,"PIC32MX270F256DB"}, {0x06703053,"PIC32MX130F256B"}, {0x06705053,"PIC32MX130F256D"}, {0x06700053,"PIC32MX230F256B"}, {0x06702053,"PIC32MX230F256D"}, {0x05600053,"PIC32MX330F064H"}, {0x05601053,"PIC32MX330F064L"}, {0x05704053,"PIC32MX350F256H"}, {0x05705053,"PIC32MX350F256L"}, {0x05602053,"PIC32MX430F064H"}, {0x05603053,"PIC32MX430F064L"}, {0x05706053,"PIC32MX450F256H"}, {0x05707053,"PIC32MX450F256L"}, {0x0570C053,"PIC32MX350F128H"}, {0x0570D053,"PIC32MX350F128L"}, {0x0570E053,"PIC32MX450F128H"}, {0x0570F053,"PIC32MX450F128L"}, {0x05808053,"PIC32MX370F512H"}, {0x05809053,"PIC32MX370F512L"}, {0x0580A053,"PIC32MX470F512H"}, {0x0580B053,"PIC32MX470F512L"}, {0x05710053,"PIC32MX450F256HB"}, {0x05811053,"PIC32MX470F512LB"}, {0x05103053,"PIC32MZ1024ECG064"}, {0x05108053,"PIC32MZ1024ECH064"}, {0x05130053,"PIC32MZ1024ECM064"}, {0x05104053,"PIC32MZ2048ECG064"}, {0x05109053,"PIC32MZ2048ECH064"}, {0x05131053,"PIC32MZ2048ECM064"}, {0x0510D053,"PIC32MZ1024ECG100"}, {0x05112053,"PIC32MZ1024ECH100"}, {0x0513A053,"PIC32MZ1024ECM100"}, {0x0510E053,"PIC32MZ2048ECG100"}, {0x05113053,"PIC32MZ2048ECH100"}, {0x0513B053,"PIC32MZ2048ECM100"}, {0x05117053,"PIC32MZ1024ECG124"}, {0x0511C053,"PIC32MZ1024ECH124"}, {0x05144053,"PIC32MZ1024ECM124"}, {0x05118053,"PIC32MZ2048ECG124"}, {0x0511D053,"PIC32MZ2048ECH124"}, {0x05145053,"PIC32MZ2048ECM124"}, {0x05121053,"PIC32MZ1024ECG144"}, {0x05126053,"PIC32MZ1024ECH144"}, {0x0514E053,"PIC32MZ1024ECM144"}, {0x05122053,"PIC32MZ2048ECG144"}, {0x05127053,"PIC32MZ2048ECH144"}, {0x0514F053,"PIC32MZ2048ECM144"}, {0x06A10053,"PIC32MX150F256H"}, {0x06A11053,"PIC32MX150F256L"}, {0x06A30053,"PIC32MX170F512H"}, {0x06A31053,"PIC32MX170F512L"}, {0x06A12053,"PIC32MX250F256H"}, {0x06A13053,"PIC32MX250F256L"}, {0x06A32053,"PIC32MX270F512H"}, {0x06A33053,"PIC32MX270F512L"}, {0x06A14053,"PIC32MX550F256H"}, {0x06A15053,"PIC32MX550F256L"}, {0x06A34053,"PIC32MX570F512H"}, {0x06A35053,"PIC32MX570F512L"}, {0x06A50053,"PIC32MX120F064H"}, {0x06A00053,"PIC32MX130F128H"}, {0x06A01053,"PIC32MX130F128L"}, {0x06A02053,"PIC32MX230F128H"}, {0x06A03053,"PIC32MX230F128L"}, {0x06A04053,"PIC32MX530F128H"}, {0x06A05053,"PIC32MX530F128L"}, {0x07201053,"PIC32MZ0512EFE064"}, {0x07206053,"PIC32MZ0512EFF064"}, {0x0722E053,"PIC32MZ0512EFK064"}, {0x07202053,"PIC32MZ1024EFE064"}, {0x07207053,"PIC32MZ1024EFF064"}, {0x0722F053,"PIC32MZ1024EFK064"}, {0x07203053,"PIC32MZ1024EFG064"}, {0x07208053,"PIC32MZ1024EFH064"}, {0x07230053,"PIC32MZ1024EFM064"}, {0x07204053,"PIC32MZ2048EFG064"}, {0x07209053,"PIC32MZ2048EFH064"}, {0x07231053,"PIC32MZ2048EFM064"}, {0x0720B053,"PIC32MZ0512EFE100"}, {0x07210053,"PIC32MZ0512EFF100"}, {0x07238053,"PIC32MZ0512EFK100"}, {0x0720C053,"PIC32MZ1024EFE100"}, {0x07211053,"PIC32MZ1024EFF100"}, {0x07239053,"PIC32MZ1024EFK100"}, {0x0720D053,"PIC32MZ1024EFG100"}, {0x07212053,"PIC32MZ1024EFH100"}, {0x0723A053,"PIC32MZ1024EFM100"}, {0x0720E053,"PIC32MZ2048EFG100"}, {0x07213053,"PIC32MZ2048EFH100"}, {0x0723B053,"PIC32MZ2048EFM100"}, {0x07215053,"PIC32MZ0512EFE124"}, {0x0721A053,"PIC32MZ0512EFF124"}, {0x07242053,"PIC32MZ0512EFK124"}, {0x07216053,"PIC32MZ1024EFE124"}, {0x0721B053,"PIC32MZ1024EFF124"}, {0x07243053,"PIC32MZ1024EFK124"}, {0x07217053,"PIC32MZ1024EFG124"}, {0x0721C053,"PIC32MZ1024EFH124"}, {0x07244053,"PIC32MZ1024EFM124"}, {0x07218053,"PIC32MZ2048EFG124"}, {0x0721D053,"PIC32MZ2048EFH124"}, {0x07245053,"PIC32MZ2048EFM124"}, {0x0721F053,"PIC32MZ0512EFE144"}, {0x07224053,"PIC32MZ0512EFF144"}, {0x0724C053,"PIC32MZ0512EFK144"}, {0x07220053,"PIC32MZ1024EFE144"}, {0x07225053,"PIC32MZ1024EFF144"}, {0x0724D053,"PIC32MZ1024EFK144"}, {0x07221053,"PIC32MZ1024EFG144"}, {0x07226053,"PIC32MZ1024EFH144"}, {0x0724E053,"PIC32MZ1024EFM144"}, {0x07222053,"PIC32MZ2048EFG144"}, {0x07227053,"PIC32MZ2048EFH144"}, {0x0724F053,"PIC32MZ2048EFM144"}, {0x05F0C053,"PIC32MZ1025DAA169"}, {0x05F0D053,"PIC32MZ1025DAB169"}, {0x05F0F053,"PIC32MZ1064DAA169"}, {0x05F10053,"PIC32MZ1064DAB169"}, {0x05F15053,"PIC32MZ2025DAA169"}, {0x05F16053,"PIC32MZ2025DAB169"}, {0x05F18053,"PIC32MZ2064DAA169"}, {0x05F19053,"PIC32MZ2064DAB169"}, {0x05F42053,"PIC32MZ1025DAG169"}, {0x05F43053,"PIC32MZ1025DAH169"}, {0x05F45053,"PIC32MZ1064DAG169"}, {0x05F46053,"PIC32MZ1064DAH169"}, {0x05F4B053,"PIC32MZ2025DAG169"}, {0x05F4C053,"PIC32MZ2025DAH169"}, {0x05F4E053,"PIC32MZ2064DAG169"}, {0x05F4F053,"PIC32MZ2064DAH169"}, {0x05F78053,"PIC32MZ1025DAA176"}, {0x05F79053,"PIC32MZ1025DAB176"}, {0x05F7B053,"PIC32MZ1064DAA176"}, {0x05F7C053,"PIC32MZ1064DAB176"}, {0x05F81053,"PIC32MZ2025DAA176"}, {0x05F82053,"PIC32MZ2025DAB176"}, {0x05F84053,"PIC32MZ2064DAA176"}, {0x05F85053,"PIC32MZ2064DAB176"}, {0x05FAE053,"PIC32MZ1025DAG176"}, {0x05FAF053,"PIC32MZ1025DAH176"}, {0x05FB1053,"PIC32MZ1064DAG176"}, {0x05FB2053,"PIC32MZ1064DAH176"}, {0x05FB7053,"PIC32MZ2025DAG176"}, {0x05FB8053,"PIC32MZ2025DAH176"}, {0x05FBA053,"PIC32MZ2064DAG176"}, {0x05FBB053,"PIC32MZ2064DAH176"}, {0x05F5D053,"PIC32MZ1025DAA288"}, {0x05F5E053,"PIC32MZ1025DAB288"}, {0x05F60053,"PIC32MZ1064DAA288"}, {0x05F61053,"PIC32MZ1064DAB288"}, {0x05F66053,"PIC32MZ2025DAA288"}, {0x05F67053,"PIC32MZ2025DAB288"}, {0x05F69053,"PIC32MZ2064DAA288"}, {0x05F6A053,"PIC32MZ2064DAB288"}, {0x07800053,"PIC32MX154F128B"}, {0x07804053,"PIC32MX154F128D"}, {0x07808053,"PIC32MX155F128B"}, {0x0780C053,"PIC32MX155F128D"}, {0x07801053,"PIC32MX174F256B"}, {0x07805053,"PIC32MX174F256D"}, {0x07809053,"PIC32MX175F256B"}, {0x0780D053,"PIC32MX175F256D"}, {0x07802053,"PIC32MX254F128B"}, {0x07806053,"PIC32MX254F128D"}, {0x0780A053,"PIC32MX255F128B"}, {0x0780E053,"PIC32MX255F128D"}, {0x07803053,"PIC32MX274F256B"}, {0x07807053,"PIC32MX274F256D"}, {0x0780B053,"PIC32MX275F256B"}, {0x0780F053,"PIC32MX275F256D"}, {0x06211053,"PIC32MK0512GPD064"}, {0x0620E053,"PIC32MK1024GPD064"}, {0x06210053,"PIC32MK0512GPD100"}, {0x0620D053,"PIC32MK1024GPD100"}, {0x0620B053,"PIC32MK0512GPE064"}, {0x06208053,"PIC32MK1024GPE064"}, {0x0620A053,"PIC32MK0512GPE100"}, {0x06207053,"PIC32MK1024GPE100"}, {0x06205053,"PIC32MK0512MCF064"}, {0x06202053,"PIC32MK1024MCF064"}, {0x06201053,"PIC32MK0512MCF100"}, {0x06201053,"PIC32MK1024MCF100"}, }; void PIC32_ID(int id) { char s[64]; int i; for(i=0;i500){ //limit number of lines printed strcat(aux,"(...)\r\n"); i=(dim TCK=RB6 -> TDO=RB5 <- TMS=RB4 -> MCLR=RB3 -> */ //MCHP TAP INSTRUCTIONS (sent via JTAGSendCommand) #define MTAP_COMMAND 0x07 //TDI and TDO connected to MCHP Command Shift register #define MTAP_SW_MTAP 0x04 //Switch TAP controller to MCHP TAP controller #define MTAP_SW_ETAP 0x05 //Switch TAP controller to EJTAG TAP controller #define MTAP_IDCODE 0x01 //Select Chip Identification Data register //MTAP_COMMAND DR COMMANDS (sent via xferData) #define MCHP_STATUS 0x00 //NOP and return Status. #define MCHP_ASSERT_RST 0xD1 //Requests the reset controller to assert device Reset. #define MCHP_DE_ASSERT_RST 0xD0 //Removes the request for device Reset, which causes the reset controller //to deassert device Reset if there is no other source requesting Reset (i.e., MCLR). #define MCHP_ERASE 0xFC //Cause the Flash controller to perform a Chip Erase. #define MCHP_FLASH_ENABLE 0xFE //Enables fetches and loads to the Flash (from the processor). #define MCHP_FLASH_DISABLE 0xFD //Disables fetches and loads to the Flash (from the processor). //EJTAG TAP INSTRUCTIONS #define ETAP_ADDRESS 0x08 //Select Address register. #define ETAP_DATA 0x09 //Select Data register. #define ETAP_CONTROL 0x0A //Select EJTAG Control register. #define ETAP_EJTAGBOOT 0x0C //Set EjtagBrk, ProbEn and ProbTrap to ‘1’ as the reset value. #define ETAP_FASTDATA 0x0E //Selects the Data and Fastdata registers. void XferInstruction(int* j,int instruction){ // fill buffer with XferInstruction (14 bytes) // if j<0 use separate counter and perform IO directly (also wait for CPU ready) int i=0,z,w0=0; int IO=0; if((int)j==-1){ j=&i; IO=1; } if(IO){ // bufferU[(*j)++]=JTAG_SEND_CMD; // bufferU[(*j)++]=MTAP_SW_ETAP; // bufferU[(*j)++]=JTAG_SET_MODE; // bufferU[(*j)++]=0x3E;//0x1F; bufferU[(*j)++]=JTAG_SEND_CMD; bufferU[(*j)++]=ETAP_CONTROL; bufferU[(*j)++]=FLUSH; for(;(*j)>24)&0xFF; bufferU[(*j)++]=(instruction>>16)&0xFF; bufferU[(*j)++]=(instruction>>8)&0xFF; bufferU[(*j)++]=instruction&0xFF; bufferU[(*j)++]=JTAG_SEND_CMD; bufferU[(*j)++]=ETAP_CONTROL; bufferU[(*j)++]=JTAG_XFER_DATA; bufferU[(*j)++]=0x00; bufferU[(*j)++]=0x00; bufferU[(*j)++]=0xC0; bufferU[(*j)++]=0x00; if(IO){ bufferU[(*j)++]=FLUSH; for(;(*j)0x80000||dim<0){ PrintMessage(strings[S_CodeLim]); //"Code size out of limits\r\n" return; } //unsigned char *memExec=0; //executiveArea*=2; //if(executiveArea) memExec=(unsigned char *)malloc(executiveArea); //for(i=0;i>8; bufferU[j++]=10000&0xff; bufferU[j++]=EN_VPP_VCC; //enter program mode bufferU[j++]=0x0; bufferU[j++]=WAIT_T2; bufferU[j++]=EN_VPP_VCC; //VDD bufferU[j++]=0x1; bufferU[j++]=WAIT_T3; bufferU[j++]=SET_PORT_DIR; bufferU[j++]=0x27; //RB7-6-4-3 output bufferU[j++]=0xFF; bufferU[j++]=EXT_PORT; bufferU[j++]=0x08; //MCLR=1 bufferU[j++]=0; bufferU[j++]=EXT_PORT; bufferU[j++]=0; //MCLR=0 bufferU[j++]=0; bufferU[j++]=JTAG_SET_MODE; bufferU[j++]=0x3E;//0x1F; bufferU[j++]=JTAG_SEND_CMD; bufferU[j++]=MTAP_SW_MTAP; bufferU[j++]=JTAG_SET_MODE; bufferU[j++]=0x3E;//0x1F; bufferU[j++]=JTAG_SEND_CMD; bufferU[j++]=MTAP_COMMAND; bufferU[j++]=JTAG_XFER_DATA; bufferU[j++]=0; bufferU[j++]=0; bufferU[j++]=0; bufferU[j++]=MCHP_STATUS; bufferU[j++]=FLUSH; for(;j>16)); //lui $t0, XferInstruction(&j,0x35080000+(i%0xFFFF)); //ori $t0, XferInstruction(&j,0x8d090000); //lw $t1, 0($t0) bufferU[j++]=FLUSH; for(;j>16)); //lui $t0, XferInstruction(-1,0x35080000+(i&0xFFFF)); //ori $t0, XferInstruction(-1,0x8d090000); //lw $t1, 0($t0) XferInstruction(-1,0xae690000); //sw $t1, 0($s3) XferInstruction(-1,0); //nop j=0; bufferU[j++]=JTAG_SEND_CMD; bufferU[j++]=ETAP_FASTDATA; bufferU[j++]=JTAG_XFER_F_DATA; bufferU[j++]=0x00; bufferU[j++]=0x00; bufferU[j++]=0x00; bufferU[j++]=0x00; bufferU[j++]=FLUSH; for(;j>16)); //lui $t0, XferInstruction(-1,0x35080000+(i&0xFFFF)); //ori $t0, XferInstruction(-1,0x8d090000); //lw $t1, 0($t0) XferInstruction(-1,0xae690000); //sw $t1, 0($s3) XferInstruction(-1,0); //nop j=0; /* XferInstruction(&j,0x3C13FF20); //lui $s3, 0xFF20 XferInstruction(&j,0x3C080000+(i>>16)); //lui $t0, XferInstruction(&j,0x35080000+(i%0xFFFF)); //ori $t0, XferInstruction(&j,0x8d090000); //lw $t1, 0($t0) bufferU[j++]=FLUSH; for(;j>16)); //lui $t0, XferInstruction(-1,0x35080000+(i&0xFFFF)); //ori $t0, XferInstruction(-1,0x8d090000); //lw $t1, 0($t0) XferInstruction(-1,0xae690000); //sw $t1, 0($s3) XferInstruction(-1,0); //nop j=0; bufferU[j++]=JTAG_SEND_CMD; bufferU[j++]=ETAP_FASTDATA; bufferU[j++]=JTAG_XFER_F_DATA; bufferU[j++]=0x00; bufferU[j++]=0x00; bufferU[j++]=0x00; bufferU[j++]=0x00; bufferU[j++]=FLUSH; for(;j>16)); //lui $t0, XferInstruction(&j,0x35080000+(i%0xFFFF)); //ori $t0, XferInstruction(&j,0x8d090000); //lw $t1, 0($t0) bufferU[j++]=FLUSH; for(;j2){ //config area @ 0xF80000 if(saveLog) fprintf(logfile,"\nCONFIG:\n"); bufferU[j++]=SIX_N; bufferU[j++]=4; bufferU[j++]=0x20; //MOV XXXX,W0 bufferU[j++]=0x0F; bufferU[j++]=0x80; bufferU[j++]=0x88; //MOV W0,TABLPAG if(newTABLPAG){ bufferU[j++]=0x02; bufferU[j++]=0xA0; } else{ bufferU[j++]=0x01; bufferU[j++]=0x90; } bufferU[j++]=REGOUT; bufferU[j++]=FLUSH; for(;j>8; bufferU[j++]=2000&0xff; bufferU[j++]=EXT_PORT; bufferU[j++]=0; //MCLR=0 bufferU[j++]=0; bufferU[j++]=EN_VPP_VCC; //0 bufferU[j++]=0x0; bufferU[j++]=FLUSH; for(;j2){ //only if separate config area PrintMessage(strings[S_ConfigMem]); //"\r\nConfig Memory:\r\n" if(config==3||config==4||config==6){ PrintMessage1("0xF80000: FBS = 0x%02X\r\n",memCONFIG[0]); if(config==4){ //0xF80000-16 PrintMessage1("0xF80002: FSS = 0x%02X\r\n",memCONFIG[4]); } PrintMessage1("0xF80004: FGS = 0x%02X\r\n",memCONFIG[8]); PrintMessage1("0xF80006: FOSCSEL = 0x%02X\r\n",memCONFIG[12]); PrintMessage1("0xF80008: FOSC = 0x%02X\r\n",memCONFIG[16]); PrintMessage1("0xF8000A: FWDT = 0x%02X\r\n",memCONFIG[20]); PrintMessage1("0xF8000C: FPOR = 0x%02X\r\n",memCONFIG[24]); PrintMessage1("0xF8000E: FICD = 0x%02X\r\n",memCONFIG[28]); if(config==3){ //0xF80000-10 except 02 PrintMessage1("0xF80010: FDS = 0x%02X\r\n",memCONFIG[32]); } else if(config==4){ //0xF80000-16 PrintMessage1("0xF80010: UID0 = 0x%02X\r\n",memCONFIG[32]); PrintMessage1("0xF80012: UID1 = 0x%02X\r\n",memCONFIG[36]); PrintMessage1("0xF80014: UID2 = 0x%02X\r\n",memCONFIG[40]); PrintMessage1("0xF80016: UID3 = 0x%02X\r\n",memCONFIG[44]); } } else if(config==5){ //0xF80000-0C (16 bit) PrintMessage2("0xF80000: FOSC = 0x%02X%02X\r\n",memCONFIG[1],memCONFIG[0]); PrintMessage2("0xF80002: FWDT = 0x%02X%02X\r\n",memCONFIG[5],memCONFIG[4]); PrintMessage2("0xF80004: FBORPOR = 0x%02X%02X\r\n",memCONFIG[9],memCONFIG[8]); PrintMessage2("0xF80006: FBS = 0x%02X%02X\r\n",memCONFIG[13],memCONFIG[12]); PrintMessage2("0xF80008: FSS = 0x%02X%02X\r\n",memCONFIG[17],memCONFIG[16]); PrintMessage2("0xF8000A: FGS = 0x%02X%02X\r\n",memCONFIG[21],memCONFIG[20]); PrintMessage2("0xF8000C: FICD = 0x%02X%02X\r\n",memCONFIG[25],memCONFIG[24]); } } else{ //last 2 program words PrintMessage2("CONFIG1: 0x%04X\r\nCONFIG2: 0x%04X\r\n",(memCODE[dim-3]<<8)+memCODE[dim-4]\ ,(memCODE[dim-7]<<8)+memCODE[dim-8]); if(config==1){ //last 3 program words PrintMessage1("CONFIG3: 0x%04X\r\n",(memCODE[dim-11]<<8)+memCODE[dim-12]); } if(config==2){ //last 4 program words PrintMessage1("CONFIG4: 0x%04X\r\n",(memCODE[dim-15]<<8)+memCODE[dim-16]); } } PrintMessage(strings[S_CodeMem]); //"\r\nCode memory:\r\n" DisplayCODE24F(dim); if(dim2){ PrintMessage(strings[S_EEMem]); //"\r\nEEPROM memory:\r\n" DisplayEE24F(); } if(executiveArea){ char s[256],t[256]; int d,valid,empty=1; char* aux=(char*)malloc((dim/COL+1)*2*(16+COL*9)); aux[0]=0; s[0]=0; empty=1; PrintMessage(strings[S_ExeMem]); //"\r\nExecutive memory:\r\n" for(i=0;i>4)&0xF; int EEbaseAddr=0x1000-dim2; int newTABLPAG=options&0x100000?1:0; int err=0; if(FWVersion<0x700){ PrintMessage1(strings[S_FWver2old],"0.7.0"); //"This firmware is too old. Version %s is required\r\n" return; } if(entry<2&&!CheckV33Regulator()){ //except 30Fxx which is on 5V PrintMessage(strings[S_noV33reg]); //Can't find 3.3V expansion board return; } if(saveLog){ OpenLogFile(); fprintf(logfile,"Write24Fx(%d,%d,%d,%d,%d,%.1f) (0x%X,0x%X,0x%X,0x%X,0x%X,%.3f)\n" ,dim,dim2,options,appIDaddr,rowSize,wait,dim,dim2,options,appIDaddr,rowSize,wait); } dim*=2; //from words to bytes if(dim>0x80000||dim<0){ PrintMessage(strings[S_CodeLim]); //"Code size out of limits\r\n" return; } if(dim2>0x1000||dim2<0){ PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" return; } j=size; if(j%(rowSize*4)){ //grow to an integer number of rows size=(j/(rowSize*4)+1)*rowSize*4; memCODE=(unsigned char*)realloc(memCODE,size); for(;jsize) dim=size; if(sizeEE<0x1000) dim2=0; if(dim<1){ PrintMessage(strings[S_NoCode]); //"Empty code area\r\n" return; } if((entry==1)||(entry==2)){ //High voltage programming: 3.3V + 1.5V + R drop + margin if(!StartHVReg(entry==2?12:6)){ //12V only for 30Fxx !!! PrintMessage(strings[S_HVregErr]); //"HV regulator error\r\n" return; } } else StartHVReg(-1); //LVP: current limited to (5-0.7-3.6)/10k = 50uA if(config>2){ //only if separate config area PrintMessage(strings[S_ConfigMem]); //"\r\nConfig Memory:\r\n" if(config==3||config==4||config==6){ PrintMessage1("0xF80000: FBS = 0x%02X\r\n",memCONFIG[0]); if(config==4){ //0xF80000-16 PrintMessage1("0xF80002: FSS = 0x%02X\r\n",memCONFIG[4]); } PrintMessage1("0xF80004: FGS = 0x%02X\r\n",memCONFIG[8]); PrintMessage1("0xF80006: FOSCSEL = 0x%02X\r\n",memCONFIG[12]); PrintMessage1("0xF80008: FOSC = 0x%02X\r\n",memCONFIG[16]); PrintMessage1("0xF8000A: FWDT = 0x%02X\r\n",memCONFIG[20]); PrintMessage1("0xF8000C: FPOR = 0x%02X\r\n",memCONFIG[24]); PrintMessage1("0xF8000E: FICD = 0x%02X\r\n",memCONFIG[28]); if(config==3){ //0xF80000-10 except 02 PrintMessage1("0xF80010: FDS = 0x%02X\r\n",memCONFIG[32]); } else if(config==4){ //0xF80000-16 PrintMessage1("0xF80010: UID0 = 0x%02X\r\n",memCONFIG[32]); PrintMessage1("0xF80012: UID1 = 0x%02X\r\n",memCONFIG[36]); PrintMessage1("0xF80014: UID2 = 0x%02X\r\n",memCONFIG[40]); PrintMessage1("0xF80016: UID3 = 0x%02X\r\n",memCONFIG[44]); } } else if(config==5){ //0xF80000-0C (16 bit) PrintMessage2("0xF80000: FOSC = 0x%02X%02X\r\n",memCONFIG[1],memCONFIG[0]); PrintMessage2("0xF80002: FWDT = 0x%02X%02X\r\n",memCONFIG[5],memCONFIG[4]); PrintMessage2("0xF80004: FBORPOR = 0x%02X%02X\r\n",memCONFIG[9],memCONFIG[8]); PrintMessage2("0xF80006: FBS = 0x%02X%02X\r\n",memCONFIG[13],memCONFIG[12]); PrintMessage2("0xF80008: FSS = 0x%02X%02X\r\n",memCONFIG[17],memCONFIG[16]); PrintMessage2("0xF8000A: FGS = 0x%02X%02X\r\n",memCONFIG[21],memCONFIG[20]); PrintMessage2("0xF8000C: FICD = 0x%02X%02X\r\n",memCONFIG[25],memCONFIG[24]); } } else{ //last 2 program words PrintMessage2("CONFIG1: 0x%04X\r\nCONFIG2: 0x%04X\r\n",(memCODE[dim-3]<<8)+memCODE[dim-4]\ ,(memCODE[dim-7]<<8)+memCODE[dim-8]); if(config==1){ //last 3 program words PrintMessage1("CONFIG3: 0x%04X\r\n",(memCODE[dim-11]<<8)+memCODE[dim-12]); } if(config==2){ //last 4 program words PrintMessage1("CONFIG4: 0x%04X\r\n",(memCODE[dim-15]<<8)+memCODE[dim-16]); } } unsigned int start=GetTickCount(); bufferU[0]=0; j=1; bufferU[j++]=SET_PARAMETER; bufferU[j++]=SET_T3; bufferU[j++]=2000>>8; bufferU[j++]=2000&0xff; bufferU[j++]=EN_VPP_VCC; //enter program mode bufferU[j++]=0x0; bufferU[j++]=SET_CK_D; bufferU[j++]=0x0; bufferU[j++]=WAIT_T2; bufferU[j++]=EN_VPP_VCC; //VDD bufferU[j++]=0x1; bufferU[j++]=EN_VPP_VCC; //VDD + VPP bufferU[j++]=0x5; if((entry==0)||(entry==3)){ //LVP: pulse on MCLR bufferU[j++]=EN_VPP_VCC; //VDD bufferU[j++]=0x1; } else PrintMessage(strings[S_HVICSP]); //"High Voltage ICSP\r\n" bufferU[j++]=WAIT_T3; bufferU[j++]=TX16; bufferU[j++]=2; bufferU[j++]=0x4D; bufferU[j++]=0x43; bufferU[j++]=0x48; bufferU[j++]=0x51; bufferU[j++]=WAIT_T3; //min 1ms bufferU[j++]=EN_VPP_VCC; //VDD + VPP bufferU[j++]=0x5; bufferU[j++]=SET_PARAMETER; bufferU[j++]=SET_T3; bufferU[j++]=30000>>8; bufferU[j++]=30000&0xff; bufferU[j++]=WAIT_T3; //min 25ms if(entry==2){ //30Fx entry bufferU[j++]=ICSP_NOP; bufferU[j++]=ICSP_NOP; bufferU[j++]=ICSP_NOP; bufferU[j++]=ICSP_NOP; bufferU[j++]=EN_VPP_VCC; //VDD bufferU[j++]=0x1; bufferU[j++]=EN_VPP_VCC; //VDD + VPP bufferU[j++]=0x5; bufferU[j++]=ICSP_NOP; } else{ //Additional 5 clock cycles upon entering program mode bufferU[j++]=SET_CK_D; bufferU[j++]=0x0; //CK=0 bufferU[j++]=SET_CK_D; bufferU[j++]=0x4; //CK=1 bufferU[j++]=SET_CK_D; bufferU[j++]=0x0; //CK=0 bufferU[j++]=SET_CK_D; bufferU[j++]=0x4; //CK=1 bufferU[j++]=SET_CK_D; bufferU[j++]=0x0; //CK=0 bufferU[j++]=SET_CK_D; bufferU[j++]=0x4; //CK=1 bufferU[j++]=SET_CK_D; bufferU[j++]=0x0; //CK=0 bufferU[j++]=SET_CK_D; bufferU[j++]=0x4; //CK=1 bufferU[j++]=SET_CK_D; bufferU[j++]=0x0; //CK=0 bufferU[j++]=SET_CK_D; bufferU[j++]=0x4; //CK=1 bufferU[j++]=SET_CK_D; bufferU[j++]=0x0; //CK=0 } bufferU[j++]=ICSP_NOP; bufferU[j++]=SIX; //GOTO 0x200 bufferU[j++]=0x04; bufferU[j++]=0x02; bufferU[j++]=0x00; bufferU[j++]=ICSP_NOP; bufferU[j++]=FLUSH; for(;j>12)&0xF); //MOV XXXX,W6 bufferU[j++]=(appIDaddr>>4)&0xFF; bufferU[j++]=((appIDaddr<<4)&0xF0)+6; bufferU[j++]=0x20; //MOV #VISI,W7 bufferU[j++]=0x78; bufferU[j++]=0x47; bufferU[j++]=SIX_LONG; //TBLRDL [W6],[W7] bufferU[j++]=0xBA; bufferU[j++]=0x0B; bufferU[j++]=0x96; bufferU[j++]=REGOUT; bufferU[j++]=SIX_LONG; //GOTO 0x200 bufferU[j++]=0x04; bufferU[j++]=0x02; bufferU[j++]=0x00; bufferU[j++]=SET_PARAMETER; bufferU[j++]=SET_T3; bufferU[j++]=2000>>8; bufferU[j++]=2000&0xff; bufferU[j++]=FLUSH; for(;j>8; //bulk erase command bufferU[j++]=SIX_N; bufferU[j++]=4; bufferU[j++]=0x24; //MOV XXXX,W10 if(erase==0){ //0x4064 bufferU[j++]=0x06; bufferU[j++]=0x4A; } else if(erase==1){ //0x404F bufferU[j++]=0x04; bufferU[j++]=0xFA; } else if(erase>=2){ //0x407F bufferU[j++]=0x07; bufferU[j++]=0xFA; } bufferU[j++]=0x88; //MOV W10,NVMCON bufferU[j++]=0x3B; bufferU[j++]=0x0A; bufferU[j++]=0x20; //MOV XXXX,W0 bufferU[j++]=0x00; bufferU[j++]=0x00; bufferU[j++]=0x88; //MOV W0,TABLPAG if(newTABLPAG){ bufferU[j++]=0x02; bufferU[j++]=0xA0; } else{ bufferU[j++]=0x01; bufferU[j++]=0x90; } bufferU[j++]=ICSP_NOP; bufferU[j++]=SIX_LONG; //TBLWTL W0,[W0] (dummy write) bufferU[j++]=0xBB; bufferU[j++]=0x08; bufferU[j++]=0x00; if(erase>=2){ //30Fx, unlock and external timing bufferU[j++]=SIX_N; bufferU[j++]=4; bufferU[j++]=0x20; //MOV 0x55,W8 bufferU[j++]=0x05; bufferU[j++]=0x58; bufferU[j++]=0x88; //MOV W8,NVMKEY bufferU[j++]=0x3B; bufferU[j++]=0x38; bufferU[j++]=0x20; //MOV 0xAA,W8 bufferU[j++]=0x0A; bufferU[j++]=0xA8; bufferU[j++]=0x88; //MOV W8,NVMKEY bufferU[j++]=0x3B; bufferU[j++]=0x38; bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR bufferU[j++]=0xA8; bufferU[j++]=0xE7; bufferU[j++]=0x61; bufferU[j++]=WAIT_T3; if(erase==3){ //200 ms timing bufferU[j++]=FLUSH; for(;j0?0x1A:0x4A; //0x4001/0x4004 bufferU[j++]=0x88; //MOV W10,NVMCON bufferU[j++]=0x3B; bufferU[j++]=0x0A; bufferU[j++]=0x20; //MOV XXXX,W0 bufferU[j++]=0x00; bufferU[j++]=0x00; bufferU[j++]=0x88; //MOV W0,TABLPAG if(newTABLPAG){ bufferU[j++]=0x02; bufferU[j++]=0xA0; } else{ bufferU[j++]=0x01; bufferU[j++]=0x90; } bufferU[j++]=0x04; //GOTO 0x200 bufferU[j++]=0x02; bufferU[j++]=0x00; bufferU[j++]=ICSP_NOP; bufferU[j++]=FLUSH; for(;j=dim) break; } if((i>>17)!=High){ //advance page bufferU[j++]=SIX; //MOV XXXX,W0 bufferU[j++]=0x20; bufferU[j++]=(i>>21)&0xFF; bufferU[j++]=(i>>13)&0xF0; bufferU[j++]=SIX; //MOV W0,TABLPAG bufferU[j++]=0x88; if(newTABLPAG){ bufferU[j++]=0x02; bufferU[j++]=0xA0; } else{ bufferU[j++]=0x01; bufferU[j++]=0x90; } bufferU[j++]=SIX; //GOTO 0x200 bufferU[j++]=0x04; bufferU[j++]=0x02; bufferU[j++]=0x00; bufferU[j++]=ICSP_NOP; bufferU[j++]=FLUSH; for(;j>17; } bufferU[j++]=SIX_N; bufferU[j++]=8; bufferU[j++]=0x20+((i>>13)&0xF); //MOV i/2,W7 bufferU[j++]=(i>>5)&0xFF; bufferU[j++]=((i<<3)&0xF0)+7; bufferU[j++]=0x20+((memCODE[i+1]>>4)&0xF); //MOV LSW0,W0 bufferU[j++]=((memCODE[i+1]<<4)&0xF0)+((memCODE[i]>>4)&0xF); bufferU[j++]=(memCODE[i]<<4)&0xF0; bufferU[j++]=0x20+((memCODE[i+6]>>4)&0xF); //MOV MSB1:MSB0,W1 bufferU[j++]=((memCODE[i+6]<<4)&0xF0)+((memCODE[i+2]>>4)&0xF); bufferU[j++]=((memCODE[i+2]<<4)&0xF0)+1; bufferU[j++]=0x20+((memCODE[i+5]>>4)&0xF); //MOV LSW1,W2 bufferU[j++]=((memCODE[i+5]<<4)&0xF0)+((memCODE[i+4]>>4)&0xF); bufferU[j++]=((memCODE[i+4]<<4)&0xF0)+2; bufferU[j++]=0x20+((memCODE[i+9]>>4)&0xF); //MOV LSW2,W3 bufferU[j++]=((memCODE[i+9]<<4)&0xF0)+((memCODE[i+8]>>4)&0xF); bufferU[j++]=((memCODE[i+8]<<4)&0xF0)+3; bufferU[j++]=0x20+((memCODE[i+14]>>4)&0xF); //MOV MSB3:MSB2,W4 bufferU[j++]=((memCODE[i+14]<<4)&0xF0)+((memCODE[i+10]>>4)&0xF); bufferU[j++]=((memCODE[i+10]<<4)&0xF0)+4; bufferU[j++]=0x20+((memCODE[i+13]>>4)&0xF); //MOV LSW3,W5 bufferU[j++]=((memCODE[i+13]<<4)&0xF0)+((memCODE[i+12]>>4)&0xF); bufferU[j++]=((memCODE[i+12]<<4)&0xF0)+5; bufferU[j++]=0xEB; //CLR W6 bufferU[j++]=0x03; bufferU[j++]=0x00; bufferU[j++]=ICSP_NOP; bufferU[j++]=SIX_N; bufferU[j++]=0x88; //Append 2 NOP bufferU[j++]=0xBB; //TBLWTL [W6++],[W7] bufferU[j++]=0x0B; bufferU[j++]=0xB6; bufferU[j++]=0xBB; //TBLWTH.B [W6++],[W7++] bufferU[j++]=0xDB; bufferU[j++]=0xB6; bufferU[j++]=0xBB; //TBLWTH.B [W6++],[++W7] bufferU[j++]=0xEB; bufferU[j++]=0xB6; bufferU[j++]=0xBB; //TBLWTL [W6++],[W7++] bufferU[j++]=0x1B; bufferU[j++]=0xB6; bufferU[j++]=0xBB; //TBLWTL [W6++],[W7] bufferU[j++]=0x0B; bufferU[j++]=0xB6; bufferU[j++]=0xBB; //TBLWTH.B [W6++],[W7++] bufferU[j++]=0xDB; bufferU[j++]=0xB6; bufferU[j++]=0xBB; //TBLWTH.B [W6++],[++W7] bufferU[j++]=0xEB; bufferU[j++]=0xB6; bufferU[j++]=0xBB; //TBLWTL [W6++],[W7++] bufferU[j++]=0x1B; bufferU[j++]=0xB6; k++; if(k==rowSize/4){ //Write row if(erase>1){ //30Fx, unlock and external timing bufferU[j++]=FLUSH; for(;j0?0x1A:0x4A; //0x4001/0x4004 bufferU[j++]=0x88; //MOV W10,NVMCON bufferU[j++]=0x3B; bufferU[j++]=0x0A; bufferU[j++]=0x20; //MOV 0x55,W8 bufferU[j++]=0x05; bufferU[j++]=0x58; bufferU[j++]=0x88; //MOV W8,NVMKEY bufferU[j++]=0x3B; bufferU[j++]=0x38; bufferU[j++]=0x20; //MOV 0xAA,W8 bufferU[j++]=0x0A; bufferU[j++]=0xA8; bufferU[j++]=0x88; //MOV W8,NVMKEY bufferU[j++]=0x3B; bufferU[j++]=0x38; bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR bufferU[j++]=0xA8; bufferU[j++]=0xE7; bufferU[j++]=0x61; bufferU[j++]=ICSP_NOP; bufferU[j++]=ICSP_NOP; bufferU[j++]=WAIT_T3; bufferU[j++]=WAIT_T3; bufferU[j++]=ICSP_NOP; bufferU[j++]=ICSP_NOP; bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR bufferU[j++]=0xA9; bufferU[j++]=0xE7; bufferU[j++]=0x61; bufferU[j++]=SIX_LONG; //GOTO 0x200 bufferU[j++]=0x04; bufferU[j++]=0x02; bufferU[j++]=0x00; } else{ //internal timing bufferU[j++]=SIX_LONG; //GOTO 0x200 bufferU[j++]=0x04; bufferU[j++]=0x02; bufferU[j++]=0x00; bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR bufferU[j++]=0xA8; bufferU[j++]=0xE7; bufferU[j++]=0x61; } k=0; } bufferU[j++]=FLUSH; for(;j=dim) break; if((i>>17)!=High){ //advance page bufferU[j++]=SIX; //MOV XXXX,W0 bufferU[j++]=0x20; bufferU[j++]=(i>>21)&0xFF; bufferU[j++]=(i>>13)&0xF0; bufferU[j++]=SIX; //MOV W0,TABLPAG bufferU[j++]=0x88; if(newTABLPAG){ bufferU[j++]=0x02; bufferU[j++]=0xA0; } else{ bufferU[j++]=0x01; bufferU[j++]=0x90; } bufferU[j++]=SIX; //GOTO 0x200 bufferU[j++]=0x04; bufferU[j++]=0x02; bufferU[j++]=0x00; bufferU[j++]=ICSP_NOP; bufferU[j++]=FLUSH; for(;j>17; } bufferU[j++]=SIX; //MOV i/2,W6 bufferU[j++]=0x20+((i>>13)&0xF); bufferU[j++]=(i>>5)&0xFF; bufferU[j++]=((i<<3)&0xF0)+6; bufferU[j++]=SIX; //MOV #VISI,W7 bufferU[j++]=0x20; bufferU[j++]=0x78; bufferU[j++]=0x47; bufferU[j++]=ICSP_NOP; bufferU[j++]=SIX_LONG; //TBLRDL [W6],[W7] bufferU[j++]=0xBA; bufferU[j++]=0x0B; bufferU[j++]=0x96; bufferU[j++]=REGOUT; bufferU[j++]=SIX_LONG; //TBLRDH.B [W6++],[W7++] bufferU[j++]=0xBA; bufferU[j++]=0xDB; bufferU[j++]=0xB6; bufferU[j++]=SIX_LONG; //TBLRDH.B [++W6],[W7--] bufferU[j++]=0xBA; bufferU[j++]=0xD3; bufferU[j++]=0xD6; bufferU[j++]=REGOUT; bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] bufferU[j++]=0xBA; bufferU[j++]=0x0B; bufferU[j++]=0xB6; bufferU[j++]=REGOUT; bufferU[j++]=SIX_LONG; //TBLRDL [W6],[W7] bufferU[j++]=0xBA; bufferU[j++]=0x0B; bufferU[j++]=0x96; bufferU[j++]=REGOUT; bufferU[j++]=SIX_LONG; //TBLRDH.B [W6++],[W7++] bufferU[j++]=0xBA; bufferU[j++]=0xDB; bufferU[j++]=0xB6; bufferU[j++]=SIX_LONG; //TBLRDH.B [++W6],[W7--] bufferU[j++]=0xBA; bufferU[j++]=0xD3; bufferU[j++]=0xD6; bufferU[j++]=REGOUT; bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] bufferU[j++]=0xBA; bufferU[j++]=0x0B; bufferU[j++]=0xB6; bufferU[j++]=REGOUT; bufferU[j++]=SIX_LONG; //GOTO 0x200 bufferU[j++]=0x04; bufferU[j++]=0x02; bufferU[j++]=0x00; bufferU[j++]=FLUSH; for(;j=max_err) break; } PrintStatusEnd(); PrintMessage1(strings[S_ComplErr],err); //"completed: %d errors\r\n" if(err>=max_err){ PrintMessage1(strings[S_MaxErr],err); //"Exceeded maximum number of errors (%d), write interrupted\r\n" } //****************** erase, write and verify EEPROM ******************** if(dim2&&err>12; if(eewrite==0){ //24FxxKAxx bufferU[j++]=SIX; //MOV 0x4050,W10 bufferU[j++]=0x24; bufferU[j++]=0x05; bufferU[j++]=0x0A; bufferU[j++]=SIX; //MOV W10,NVMCON bufferU[j++]=0x88; bufferU[j++]=0x3B; bufferU[j++]=0x0A; bufferU[j++]=SIX; //MOV 0x7F,W0 bufferU[j++]=0x20; bufferU[j++]=0x07; bufferU[j++]=0xF0; bufferU[j++]=SIX; //MOV W0,TABLPAG bufferU[j++]=0x88; if(newTABLPAG){ bufferU[j++]=0x02; bufferU[j++]=0xA0; } else{ bufferU[j++]=0x01; bufferU[j++]=0x90; } bufferU[j++]=SIX; //MOV EEbaseAddr,W0 bufferU[j++]=0x2F; bufferU[j++]=EEbaseAddr>>4; bufferU[j++]=0x00; bufferU[j++]=ICSP_NOP; bufferU[j++]=SIX; //TBLWTL W0,[W0] bufferU[j++]=0xBB; bufferU[j++]=0x08; bufferU[j++]=0x00; bufferU[j++]=ICSP_NOP; bufferU[j++]=ICSP_NOP;/**/ /* //Erase EEPROM bufferU[j++]=SIX; //BSET NVMCON,#WR bufferU[j++]=0xA8; bufferU[j++]=0xE7; bufferU[j++]=0x61; bufferU[j++]=ICSP_NOP; bufferU[j++]=ICSP_NOP; bufferU[j++]=WAIT_T3; bufferU[j++]=WAIT_T3; bufferU[j++]=WAIT_T3; bufferU[j++]=SIX; //MOV 0x4004,W10 bufferU[j++]=0x24; bufferU[j++]=0x00; bufferU[j++]=0x4A; bufferU[j++]=SIX; //MOV W10,NVMCON bufferU[j++]=0x88; bufferU[j++]=0x3B; bufferU[j++]=0x0A; bufferU[j++]=SIX; //GOTO 0x200 bufferU[j++]=0x04; bufferU[j++]=0x02; bufferU[j++]=0x00; bufferU[j++]=ICSP_NOP; bufferU[j++]=FLUSH; for(;j>4; bufferU[j++]=((i<<4)&0xF0)+7; bufferU[j++]=SIX; //MOV XXXX,W0 bufferU[j++]=0x20+((memEE[i+1]>>4)&0xF); bufferU[j++]=((memEE[i+1]<<4)&0xF0)+((memEE[i]>>4)&0xF); bufferU[j++]=(memEE[i]<<4)&0xF0; bufferU[j++]=ICSP_NOP; bufferU[j++]=SIX_LONG; //TBLWTL W0,[W7++] bufferU[j++]=0xBB; bufferU[j++]=0x1B; bufferU[j++]=0x80; if(eewrite==0){ //24FxxKAxx bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR bufferU[j++]=0xA8; bufferU[j++]=0xE7; bufferU[j++]=0x61; } else if(eewrite==1){ //30Fxxxx bufferU[j++]=SIX_N; bufferU[j++]=6; bufferU[j++]=0x24; //MOV 0x4004,W10 bufferU[j++]=0x00; bufferU[j++]=0x4A; bufferU[j++]=0x88; //MOV W10,NVMCON bufferU[j++]=0x3B; bufferU[j++]=0x0A; bufferU[j++]=0x20; //MOV 0x55,W8 bufferU[j++]=0x05; bufferU[j++]=0x58; bufferU[j++]=0x88; //MOV W8,NVMKEY bufferU[j++]=0x3B; bufferU[j++]=0x38; bufferU[j++]=0x20; //MOV 0xAA,W8 bufferU[j++]=0x0A; bufferU[j++]=0xA8; bufferU[j++]=0x88; //MOV W8,NVMKEY bufferU[j++]=0x3B; bufferU[j++]=0x38; bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR bufferU[j++]=0xA8; bufferU[j++]=0xE7; bufferU[j++]=0x61; bufferU[j++]=WAIT_T3; bufferU[j++]=ICSP_NOP; bufferU[j++]=ICSP_NOP; bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR bufferU[j++]=0xA9; bufferU[j++]=0xE7; bufferU[j++]=0x61; } bufferU[j++]=FLUSH; for(;j>4; bufferU[j++]=0x06; bufferU[j++]=SIX; //MOV #VISI,W7 bufferU[j++]=0x20; bufferU[j++]=0x78; bufferU[j++]=0x47; bufferU[j++]=SIX; //GOTO 0x200 bufferU[j++]=0x04; bufferU[j++]=0x02; bufferU[j++]=0x00; bufferU[j++]=ICSP_NOP; int errE=0; for(i=k2=EEbaseAddr;iDIMBUF-7||i==dim2-4){ bufferU[j++]=FLUSH; for(;j2&&config<5&&err>16; bufferU[j++]=SIX_N; bufferU[j++]=6; bufferU[j++]=0x20; //MOV 0xF8,W0 bufferU[j++]=0x0F; bufferU[j++]=0x80; bufferU[j++]=0x88; //MOV W0,TABLPAG if(newTABLPAG){ bufferU[j++]=0x02; bufferU[j++]=0xA0; } else{ bufferU[j++]=0x01; bufferU[j++]=0x90; } bufferU[j++]=0x24; //MOV 0x400x,W10 bufferU[j++]=0x00; if(confword==0)bufferU[j++]=0x0A; //0x4000 else if(confword==1)bufferU[j++]=0x3A; //0x4003 else if(confword==2)bufferU[j++]=0x4A; //0x4004 else if(confword==3)bufferU[j++]=0x8A; //0x4008 bufferU[j++]=0x88; //MOV W10,NVMCON bufferU[j++]=0x3B; bufferU[j++]=0x0A; bufferU[j++]=0x20; //MOV 0,W7 bufferU[j++]=0x00; bufferU[j++]=0x07; bufferU[j++]=0x04; //GOTO 0x200 bufferU[j++]=0x02; bufferU[j++]=0x00; bufferU[j++]=ICSP_NOP; for(i=0;i<12;i++){ //Write CONFIG bufferU[j++]=SIX; //MOV XXXX,W0 bufferU[j++]=0x20; bufferU[j++]=(memCONFIG[i*4]>>4)&0xF; bufferU[j++]=(memCONFIG[i*4]<<4)&0xF0; bufferU[j++]=ICSP_NOP; bufferU[j++]=SIX_LONG; //TBLWTL W0,[W7++] bufferU[j++]=0xBB; bufferU[j++]=0x1B; bufferU[j++]=0x80; //if(memCONFIG[i*4]<0xFF){ //write if not empty bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR bufferU[j++]=0xA8; bufferU[j++]=0xE7; bufferU[j++]=0x61; bufferU[j++]=ICSP_NOP; bufferU[j++]=ICSP_NOP; //} bufferU[j++]=FLUSH; for(;j=5&&err>12); bufferU[j++]=(value>>4); bufferU[j++]=(value<<4); bufferU[j++]=ICSP_NOP; bufferU[j++]=SIX_LONG; //TBLWTL W0,[W7++] bufferU[j++]=0xBB; bufferU[j++]=0x1B; bufferU[j++]=0x80; if(value<0xFFFF){ //write if not empty bufferU[j++]=SIX_N; bufferU[j++]=6; bufferU[j++]=0x24; //MOV 0x400x,W10 bufferU[j++]=0x00; bufferU[j++]=0x8A; //0x4008 bufferU[j++]=0x88; //MOV W10,NVMCON bufferU[j++]=0x3B; bufferU[j++]=0x0A; bufferU[j++]=0x20; //MOV 0x55,W8 bufferU[j++]=0x05; bufferU[j++]=0x58; bufferU[j++]=0x88; //MOV W8,NVMKEY bufferU[j++]=0x3B; bufferU[j++]=0x38; bufferU[j++]=0x20; //MOV 0xAA,W8 bufferU[j++]=0x0A; bufferU[j++]=0xA8; bufferU[j++]=0x88; //MOV W8,NVMKEY bufferU[j++]=0x3B; bufferU[j++]=0x38; bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR bufferU[j++]=0xA8; bufferU[j++]=0xE7; bufferU[j++]=0x61; bufferU[j++]=WAIT_T3; bufferU[j++]=ICSP_NOP; bufferU[j++]=ICSP_NOP; bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR bufferU[j++]=0xA9; bufferU[j++]=0xE7; bufferU[j++]=0x61; } bufferU[j++]=FLUSH; for(;j