Radio sam sve sto mi je palo na pamet ali PIC24FJ256GB106 nece da upise sadrzaj u interni flash preko adrese 0x200F8.
Dakle, do nje sve radi OK, upise i u nju ali vec u 0x200FA nece da mu das cokoloadu.
Evo slike kako izgledaju memorijske lokacije nakon upisa.
Evo i najglupljeg moguceg koda kojim sam testirao. Ima li neko ideju?
Dakle, kod treba da upise: "PIC24FJ" a vidi se samo "PIC24"
'F' treba da bude na lokaciji 0x200FA a 'J' na lokaciji 0x200FC
Dakle, do nje sve radi OK, upise i u nju ali vec u 0x200FA nece da mu das cokoloadu.
Evo slike kako izgledaju memorijske lokacije nakon upisa.
Evo i najglupljeg moguceg koda kojim sam testirao. Ima li neko ideju?
Code:
#include <p24Fxxxx.h>
#include "GenericTypeDefs.h"
_CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & FWDTEN_OFF & ICS_PGx2)
_CONFIG2( PLL_96MHZ_ON & IESO_OFF & FCKSM_CSDCMD & OSCIOFNC_ON & POSCMOD_HS & FNOSC_PRIPLL & PLLDIV_DIV3 & IOL1WAY_ON)
_CONFIG3( WPDIS_WPDIS )
void WriteLatch(WORD page, WORD addrLo, WORD dataHi, WORD dataLo);
void WriteFlash(DWORD_VAL addr, unsigned char data);
int main(void)
{
//init LED's
LATG &= 0xFC3F; TRISG &= 0xFC3F; LATF &= 0xFFCF; TRISF &= 0xFFCF; //G6,7,8,9 and F4,5
TRISF |= 0x0030;
TRISG |= 0x0300;
TRISG &= 0x00C0;
unsigned char data;
DWORD_VAL sourceAddr;
data = 'P';
sourceAddr.Val = 0x200F0;
WriteFlash(sourceAddr, data);
data = 'I';
sourceAddr.Val = 0x200F2;
WriteFlash(sourceAddr, data);
data = 'C';
sourceAddr.Val = 0x200F4;
WriteFlash(sourceAddr, data);
data = '2';
sourceAddr.Val = 0x200F6;
WriteFlash(sourceAddr, data);
data = '4';
sourceAddr.Val = 0x200F8;
WriteFlash(sourceAddr, data);
data = 'F';
sourceAddr.Val = 0x200FA;
WriteFlash(sourceAddr, data);
data = 'J';
sourceAddr.Val = 0x200FC;
WriteFlash(sourceAddr, data);
TRISF ^= 0x0030;
while(1)
{
}
return 0;
}
void WriteLatch(WORD page, WORD addrLo, WORD dataHi, WORD dataLo)
{
TBLPAG = page;
__builtin_tblwtl(addrLo, dataLo);
__builtin_tblwth(addrLo, dataHi);
}
void WriteFlash(DWORD_VAL addr, unsigned char data)
{
unsigned char i = 0;
DWORD_VAL tmp;
NVMCON = 0x4003;
asm("clrwdt");
tmp.v[0] = data;
tmp.v[1] = 0;
tmp.v[2] = 0;
tmp.v[3] = 0;
//write data into latches
WriteLatch(addr.word.HW, addr.word.LW, tmp.word.HW, tmp.word.LW);
//execute write sequence
__builtin_disi(5);
__builtin_write_NVM();
while(NVMCONbits.WR == 1);
NVMCONbits.WREN = 0;
}
'F' treba da bude na lokaciji 0x200FA a 'J' na lokaciji 0x200FC