Компилятор XC8
Необходимо в контроллере хранить калибровочные поправки в возможностью изменения.
Чтение и стирание памяти сделать получилось, делал как описано в даташите
Код
uint16_t ReadWordFlash(uint16_t adr){
PMADR = adr;
CFGS = 0;
RD = 1;
NOP();
NOP();
return PMDAT;
}
void EraseRowFlash(uint16_t adr){
uint8_t StatusGIE = GIE;
GIE = 0;
PMADR = adr;
CFGS = 0;
FREE = 1;
WREN = 1;
//unlock sequense
PMCON2 = 0x55;
PMCON2 = 0xAA;
//start erase
WR = 1;
//wait
NOP();
NOP();
//wait ~2ms operation
WREN = 0;
GIE = StatusGIE;
}
PMADR = adr;
CFGS = 0;
RD = 1;
NOP();
NOP();
return PMDAT;
}
void EraseRowFlash(uint16_t adr){
uint8_t StatusGIE = GIE;
GIE = 0;
PMADR = adr;
CFGS = 0;
FREE = 1;
WREN = 1;
//unlock sequense
PMCON2 = 0x55;
PMCON2 = 0xAA;
//start erase
WR = 1;
//wait
NOP();
NOP();
//wait ~2ms operation
WREN = 0;
GIE = StatusGIE;
}
А вот с записью проблемы. Делал по тому же даташиту, но в результате в памяти никаких изменений. (код сократил до записи в память 1 слова)
Код
void WriteRowFlash(uint16_t adr){
uint8_t StatusGIE = GIE;
GIE = 0;
CFGS = 0;
PMADR = adr;
FREE = 0;
LWLO = 1;
WREN = 1;
PMDAT = 0xaaaa;
LWLO = 0;
//unlock sequense
PMCON2 = 0x55;
PMCON2 = 0xAA;
//wait
NOP();
NOP();
WREN = 0;
GIE = StatusGIE;
}
uint8_t StatusGIE = GIE;
GIE = 0;
CFGS = 0;
PMADR = adr;
FREE = 0;
LWLO = 1;
WREN = 1;
PMDAT = 0xaaaa;
LWLO = 0;
//unlock sequense
PMCON2 = 0x55;
PMCON2 = 0xAA;
//wait
NOP();
NOP();
WREN = 0;
GIE = StatusGIE;
}
Подскажите, что делаю не правильно