Escrita na Flash

Eu estou usando um pic 24FJ256GB106 e uso a seguinte rotina para apagar e escrever na memoria:
cpp code
Em alguns momentos acontece de ficar travado no while (NVMCON & 0x8000); e nunca mais sai (esse bit é limpo por hardware). Eu preciso regravar o firmware e então ele consegue passar.
Estou desconfiado que ele pode estar escrevendo na memoria, reseta e tenta rodar a rotina de escrita novamente.
Alguém sabe dizer porque acontece?
Como eu limpo esse bit via firmware.
Obrigado a todos.
Obirgado
cpp code
void EraseFlash (long progAddr)
{
//-----------------------------------------------------------------------------------------------------------//
//Rotina de Apagar a Memória
NVMCON = 0x4042;
TBLPAG = 0;
asm("tblwtl %0,[%0]"::"r"(progAddr));
__builtin_write_NVM();
while (NVMCON & 0x8000);
//-----------------------------------------------------------------------------------------------------------//
}
void WriteBufferFlash(long progAddr, int LenBuffer)
{
unsigned int offset, i;
// Set up NVMCON for word programming
//-----------------------------------------------------------------------------------------------------------//
//Rotina de Escrita na Memória
TBLPAG = progAddr >> 16; // Initialize PM Page Boundary SFR
// Set up pointer to the first memory location to be written
TBLPAG = progAddr >> 16; // Initialize PM Page Boundary SFR
offset = progAddr & 0xFFFF; // Initialize lower word of address
// Perform TBLWT instructions to write latches
asm("DISI #5");
for(i=0; i < LenBuffer; i++)
{
__builtin_tblwtl(offset, progData[i++]); // Write to address low word
__builtin_tblwth(offset, progData[i]); // Write to upper byte
offset += 2;
}
NVMCON = 0x4001; // Initialize NVMCON
__builtin_write_NVM(); // C30 function to perform unlock
while (NVMCON & 0x8000);
//-----------------------------------------------------------------------------------------------------------//
}
Em alguns momentos acontece de ficar travado no while (NVMCON & 0x8000); e nunca mais sai (esse bit é limpo por hardware). Eu preciso regravar o firmware e então ele consegue passar.
Estou desconfiado que ele pode estar escrevendo na memoria, reseta e tenta rodar a rotina de escrita novamente.
Alguém sabe dizer porque acontece?
Como eu limpo esse bit via firmware.
Obrigado a todos.
Obirgado