前回のエントリーでプログラムフラッシュメモリーの消去シーケンスについて書いた。
書き込みシーケンスについてもワークアラウンドが出来たので記載。
書き込みシーケンスについてもワークアラウンドが出来たので記載。
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()
{
}
書き込みは32ワード(32個の14ビットデータ)毎に書き込む。
あ、画像間違えた。
31ワードまではラッチに書き込み、32ワード目で LWLO(Load Write Latches Only bit)を倒して実際にフラッシュに書き込む。
この最後の1回だけ、クロックを落とすのがポイントで、面倒臭がって32回全部クロックを落とすとUSBが反応しなくなる。
何とかなりました。
この情報って英語で書いた方が良いんだろうね。結構迷ってる人多いみたいだから。
タイトルだけでも英語にしときます。
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ビットデータ)毎に書き込む。
あ、画像間違えた。
31ワードまではラッチに書き込み、32ワード目で LWLO(Load Write Latches Only bit)を倒して実際にフラッシュに書き込む。
この最後の1回だけ、クロックを落とすのがポイントで、面倒臭がって32回全部クロックを落とすとUSBが反応しなくなる。
何とかなりました。
この情報って英語で書いた方が良いんだろうね。結構迷ってる人多いみたいだから。
タイトルだけでも英語にしときます。
コメント