尊敬的 TI:
我需要在数据闪存中存储一个字节。 由于该字节可在运行时进行修改、因此第一步是擦除数据闪存。 如手册所述、这应该很容易:
-将密钥写入 FLASHILOCK 寄存器、
-将页面设置为在 DFLASHCTRL 寄存器中擦除、
-等待同一寄存器中的 BUSY 标志置为无效。
我还找到了以下主题:
https://e2e.ti.com/support/power_management/digital_power/f/184/t/469002
RONLY 位、我复制了行以删除只读保护。
但是、这对我来说不起作用。
我编写了以下代码:
静态空 ERASE_dFLASH (空)
{
CONST UNION DFLASHCTRL_REG DCTRL ={.bit.PAGE_SEL = 0、.bit.PAGE_ERASE = 1};
send_str ("zz\n");
while (DecRegs.DFLASHCTRL.bit.BUSY);
send_str("u\n");
DecRegs.MFBALR2.ALL = 0x8820;
send_str ("v\n");
DecRegs.FLASHILOCK.ALL = DATA_FLASH_SHARNGE_KEY;
send_str ("yyy\n");
DecRegs.DFLASHCTRL.ALL = dctrl.all;
send_str ("xx\n");
while (DecRegs.DFLASHCTRL.bit.BUSY);
send_str ("w\n");
}
'send_str'是一个通过 UART 发送字符串的函数、运行正常。
调用此函数后、我可以看到终端中打印了"zz"和"uu"、但除此之外没有其他内容、并且在没有复位的情况下、PMBus 探针(HPA172)无法访问器件。 因此、这看起来器件在向 MFBALR2写入数据时挂起。 我已经尝试用相同的结果交换对 MFBALR2和 FLASHILOCK 的写入顺序。
可以帮我解决这个问题吗? 文档中是否没有提到任何内容? 也许我可以使用一段代码来实现这一点?
编辑:
我已经意识到有现成的"软件中断"例程可用于此目的、但这些例程对我也不起作用。
代码片段现在为:
send_str ("\n 新的 addr\n");
ERASE_DATA_FLASH_SEGMENT (0);
send_str ("\nerased\n");
WRITE_DATA_FLASH_WORD (DFLASH_START_ADDRESS、dfs.addr);
send_str ("\n 全部完成\n");
dfs.addr 为 uint8_t
我只能看到"new addr"和"erased"显示、写入操作会导致复位(我可以找到处于 ROM 模式的器件并使其再次运行程序)。 我确实尝试按照所引用的帖子中的建议,将按位分配给 MFBALR2的常规任务替换为"全部"。
此致、
Adam