前回のエントリーでプログラムフラッシュメモリーの消去シーケンスについて書いた。
書き込みシーケンスについてもワークアラウンドが出来たので記載。

PMADR = Addr;
PMCON1bits.CFGS = 0;
PMCON1bits.FREE = 0; // Enable Program Flash Erase Enable
PMCON1bits.LWLO = 1; // Enable Load Write Latches Only bit
PMCON1bits.WREN = 1; // Enable Program/Erase Enable bit

unsigned int dat;
for(ii=0; ii<FLASH_PAGE_SIZE; ii++) {
PMDATL = data[ii];
PMDATH = 0x34; // Disable hi byte

if(ii == FLASH_PAGE_SIZE-1) {
PMCON1bits.LWLO = 0; // Last word then write the page
OSCCON = 0b11101100; // Switch to 1MHz x 3PLL
UnlockAndActivate();
OSCCON = 0xFC; // Go back to 16Mhz x 3PLL
}
else 
{
UnlockAndActivate();
}
PMADR++;
} // end of for

void UnlockAndActivate()
{
ClrWdt();

PMCON1bits.WREN = 1; // Enable Program/Erase Enable bit
PMCON2 = 0x55; // Unlock and erase sequence
PMCON2 = 0xAA;
PMCON1bits.WR = 1; // Write Control bit
       _nop(); _nop(); // need 2 nops
PMCON1bits.WREN = 0; // Disable Program/Erase Enable bit 
}


書き込みは32ワード(32個の14ビットデータ)毎に書き込む。
image
あ、画像間違えた。
無題

31ワードまではラッチに書き込み、32ワード目で LWLO(Load Write Latches Only bit)を倒して実際にフラッシュに書き込む。
この最後の1回だけ、クロックを落とすのがポイントで、面倒臭がって32回全部クロックを落とすとUSBが反応しなくなる。
何とかなりました。

この情報って英語で書いた方が良いんだろうね。結構迷ってる人多いみたいだから。
タイトルだけでも英語にしときます。