Dany (24.03.2009 09:42, просмотров: 7075)
PIC24FJ256 запись во Flash /*==============================================================
Запись во внутреннюю Flash data word(16 bit)
Пишет только Low word(0xFFXXXX)
Вход: UINT32 addr - начальный адрес
UINT16* u16_word - массив данных для записи
UINT16 length - длина массива
Возвращаемое значение: Нет
===============================================================*/
void FlashWriteDataWord(UINT32 addr, UINT16* u16_word, UINT16 length)
{
UINT16 i;
DWORD_VAL _addr;
_addr.Val = addr;
NVMCON = 0x4003; //Perform WORD write next time WR gets set = 1.
for(i = 0; i < length; i++)
{
TBLPAG = _addr.word.HW;
__builtin_tblwtl(_addr.word.LW, u16_word[i]);//Write the low word to the latch
asm("DISI #16"); //Disable interrupts for next few instructions for unlock sequence
__builtin_write_NVM();
while(NVMCONbits.WR == 1);
_addr.Val += 2;
}
}
#define ADDR_START_DATA_FLASH 0x1ABF6L//0xABF6 //Отсюда начнем писать данные
int main(void)
{
UINT16 i;
UINT32 addr = ADDR_START_DATA_FLASH;
for(i = 0; i < 32768; i++)
{
FlashWriteDataWord(addr,(UINT16 *)&i, 1);
addr += 2;
}
while(1);
return(0);
}
Дело в том, что если пишем, начиная, с 0xABF6 адреса, то записывается 32768 значения, как и надо, а вот если с 0x1ABF6L то записывается только 32261. Возникло непонимание, почему так происходит. С Flash только знакомлюсь, подскажите где искать ответ.