1

我对带有 dspic33ep512mu810 的闪存有一些疑问。我知道应该如何完成:设置地址、锁存器等的所有寄存器。然后执行序列以启动写入过程或调用内置函数。

但我发现我所经历的与 DOC 中的内容之间存在一些细微差别。

  1. 在 WORD 模式下写入闪存时。在 DOC 中,它非常简单。以下是文档中的示例代码
int varWord1L = 0xXXXX;
int varWord1H = 0x00XX;
int varWord2L = 0xXXXX;
int varWord2H = 0x00XX;
int TargetWriteAddressL; // bits<15:0>
int TargetWriteAddressH; // bits<22:16>
NVMCON = 0x4001; // Set WREN and word program mode
TBLPAG = 0xFA; // write latch upper address
NVMADR = TargetWriteAddressL; // set target write address
NVMADRU = TargetWriteAddressH;
__builtin_tblwtl(0,varWord1L); // load write latches
__builtin_tblwth(0,varWord1H);
__builtin_tblwtl(0x2,varWord2L);
__builtin_tblwth(0x2,varWord2H);
__builtin_disi(5); // Disable interrupts for NVM unlock sequence
__builtin_write_NVM(); // initiate write
while(NVMCONbits.WR == 1);

但是根据我要写的地址,该代码不起作用。我找到了一个可以写一个 WORD 的解决方法,但我不能在我想要的地方写 2 个 WORD。我将所有内容都存储在辅助内存中,因此对我来说上位地址(NVMADRU)始终为 0x7F。NVMADR 是我可以更改的地址。我所看到的是,如果我要写入模 4 的地址不是 0,那么我必须将我的值放在最后 2 个锁存器中,否则我必须将值放在第一个锁存器中。

如果地址模 4 不为零,则它不像文档代码(上图)那样工作。该地址的值将是第二组锁存器中的值。我将其修复为一次只写一个单词,如下所示:

if(Address % 4)
{
    __builtin_tblwtl(0, 0xFFFF);
    __builtin_tblwth(0, 0x00FF);
                                                        
    __builtin_tblwtl(2, ValueL);
    __builtin_tblwth(2, ValueH);        
}
else
{
    __builtin_tblwtl(0, ValueL);
    __builtin_tblwth(0, ValueH);
    __builtin_tblwtl(2, 0xFFFF);
    __builtin_tblwth(2, 0x00FF);
}

我想知道为什么我会看到这种行为?

2)我也想写一整行。这似乎对我也不起作用,我不知道为什么,因为我正在做 DOC 中的内容。我尝试了一个简单的写行代码,最后我只是读回了我写的前 3 或 4 个元素,看看它是否有效:

NVMCON = 0x4002;                  //set for row programming
TBLPAG = 0x00FA;                  //set address for the write latches
NVMADRU = 0x007F;                 //upper address of the aux memory
NVMADR = 0xE7FA;
int latchoffset;
latchoffset = 0;
__builtin_tblwtl(latchoffset, 0);
__builtin_tblwth(latchoffset, 0);         //current = 0, available = 1
latchoffset+=2;
__builtin_tblwtl(latchoffset, 1);
__builtin_tblwth(latchoffset, 1);         //current = 0, available = 1
latchoffset+=2;
.
. all the way to 127(I know I could have done it in a loop)
.
__builtin_tblwtl(latchoffset, 127);
__builtin_tblwth(latchoffset, 127);
INTCON2bits.GIE = 0;  //stop interrupt
__builtin_write_NVM();
while(NVMCONbits.WR == 1);
INTCON2bits.GIE = 1;  //start interrupt
int testaddress;
testaddress = 0xE7FA;
status = NVMemReadIntH(testaddress);
status = NVMemReadIntL(testaddress);
testaddress += 2;
status = NVMemReadIntH(testaddress);
status = NVMemReadIntL(testaddress);
testaddress += 2;
status = NVMemReadIntH(testaddress);
status = NVMemReadIntL(testaddress);
testaddress += 2;
status = NVMemReadIntH(testaddress);
status = NVMemReadIntL(testaddress);

我看到的是存储在地址 0xE7FA 中的值是 125,在 0xE7FC 中是 126,在 0xE7FE 中是 127。其余的都是 0xFFFF。为什么只占用最后 3 个锁存器并将它们写入前 3 个地址?

提前感谢您的帮助。

4

0 回答 0