/********************************************************************* * 書き込み. ********************************************************************* */ void WriteFlash(int adr,uchar *buf,int len) { int i; uchar *t=buf; PACK_data pd; setup_addr24write(adr>>1,0x4001); for(i=0;i<len;i+=8,t+=8) { pack3word(t,(char *)&pd); sendData24(0xEB0300); // CLR W6 sendData24(0x200000| (pd.word[0]<<4) ); // MOV #w0, W0 sendData24(0x200001| (pd.word[1]<<4) ); // MOV #w1, W1 sendData24(0x200002| (pd.word[2]<<4) ); // MOV #w2, W2 sendData24(0xBB0BB6); // TBLWTL [W6++], [W7] sendData24(0x000000); // NOP sendData24(0x000000); // NOP sendData24(0xBBDBB6); // TBLWTH.B [W6++], [W7++] sendData24(0x000000); // NOP sendData24(0x000000); // NOP sendData24(0xBBEBB6); // TBLWTH.B [W6++], [++W7] sendData24(0x000000); // NOP sendData24(0x000000); // NOP sendData24(0xBB1BB6); // TBLWTL [W6++], [W7++] sendData24(0x000000); // NOP sendData24(0x000000); // NOP } WaitComplete(); sendData24(0x040200); // GOTO 0x200 sendData24(0x000000); // NOP }
/******************************************************************** * PIC24F:Flash書き込み ******************************************************************** */ void pic_write24f(void) { uchar i; uchar cmd4=PacketFromPC.piccmd4; // 0=address setupする. 1=継続書き込み 2=complete処理あり. uchar len =PacketFromPC.size; // ループ回数. =データbyte数 / 6 と同じ. // ushort *wordp=(ushort *)PacketFromPC.picdata; uchar *wordp = PacketFromPC.picdata; if(cmd4==0) { setup_addr24write(); //(adr>>1,0x4001); } for(i=0; i<len; i++) { sendData24(0xEB0300); // CLR W6 sendData24(0x200000| (getword(wordp+0)<<4) ); // MOV #w0, W0 sendData24(0x200001| (getword(wordp+2)<<4) ); // MOV #w1, W1 sendData24(0x200002| (getword(wordp+4)<<4) ); // MOV #w2, W2 sendData24(0xBB0BB6); // TBLWTL [W6++], [W7] send_nop2(); sendData24(0xBBDBB6); // TBLWTH.B [W6++], [W7++] send_nop2(); sendData24(0xBBEBB6); // TBLWTH.B [W6++], [++W7] send_nop2(); sendData24(0xBB1BB6); // TBLWTL [W6++], [W7++] send_nop2(); // wordp+=3; wordp+=3*2; } if(cmd4==2) { WaitComplete(); send_goto200(); } }
/********************************************************************* * チップ消去コマンドの発行. ********************************************************************* */ void EraseCmd(int devtype) { sendData24(0x000000); // NOP sendData24(0x040200); // GOTO 0x200 sendData24(0x000000); // NOP sendData24(0x200800); // MOV #0x80, W0 sendData24(0x880190); // MOV W0, TBLPAG sendData24(0x207FE1); // MOV #0x7FE, W1 sendData24(0x2000C2); // MOV #12, W2 sendData24(0x000000); // NOP sendData24(0xBA1931); // TBLRDL [W1++], [W2++] sendData24(0x000000); // NOP sendData24(0x000000); // NOP sendData24(0x2404F0); // MOV #0x404F, W0 sendData24(0x883B00); // MOV W0, NVMCON sendData24(0x200000); // MOV #0, W0 sendData24(0x200801); // MOV #0x80 sendData24(0x880191); // MOV W1, TBLPAG sendData24(0xBB0800); // TBLWTL W0, [W0] WaitComplete(); sendData24(0x240031); // MOV #0x4003, W1 sendData24(0x883B01); // MOV W1, NVMCON sendData24(0x200800); // MOV #0x80, W0 sendData24(0x880190); // MOV W0, TBLPAG sendData24(0x207FE1); // MOV #0x7FE, W1 sendData24(0x2000C2); // MOV #12, W2 sendData24(0x000000); // NOP sendData24(0xBB18B2); // TBLWTL [W2++], [W1++] WaitComplete(); sendData24(0x040200); // GOTO 0x200 sendData24(0x000000); // NOP }
/********************************************************************* * 書き込みテスト. ********************************************************************* */ void WriteFuse(int adr,uchar *buf) { int i,cfg; setup_addr24write(adr>>1,0x4003); for (i = 0; i < 8; i += 4) { /* ---- Repeat for two cfg words ---- */ cfg=buf[i]|(buf[i+1]<<8); sendData24(0x200006| (cfg<<4) ); // MOV #cfg, W6 sendData24(0x000000); // NOP sendData24(0xBB1B86); // TBLWTL W6, [W7++] WaitComplete(); } sendData24(0x040200); // GOTO 0x200 sendData24(0x000000); // NOP }
void RealtimeProcess::VOnFail(void) { WaitComplete(); }
void RealtimeProcess::VOnSuccess(void) { WaitComplete(); }
void RealtimeProcess::VOnAbort(void) { WaitComplete(); }