This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 如何在 UCD3138A64中写入数据闪存?

Guru**** 2331900 points
Other Parts Discussed in Thread: UCD3138A64
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/618357/how-to-write-to-data-flash-in-ucd3138a64

主题中讨论的其他器件:UCD3138A64

尊敬的 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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我怀疑您需要等待数据闪存擦除完成。  通常、我们只需使用软件中断进入特权模式、以便我们可以写入闪存控制寄存器。   在后台程序中、您需要轮询 dlasctrl 寄存器中的 BUSY 位。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ian、

    我确实等待 BUSY 位失效-这是"我的代码"中最后一条语句的目的、这也存在于"软件中断"例程中(来自培训实验):

    while (DecRegs.DFLASHCTRL.bit.BUSY!= 0)

    ;//在进行编程时不执行任何操作


    区别在于、"我的代码"在到达此处之前挂起、处于"DecRegs.MFBALR2.ALL = 0x8820;"、而来自"软件中断"的擦除例程能够结束其操作、而是写入例程挂起。

    我是否需要先设置特权模式? 文档似乎不要求这样做。

    此致、
    Adam
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、在写入 DEC 寄存器之前、您确实需要进入特权模式。  这就是我们调用软件中断的原因。  

    很抱歉 我花了这么长时间才回答-我在内布拉斯加州的岩壁上看了食-即使是在有细胞服务的地方,它也被淹没了。  然后是多云。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ian:

    由于您发布了有关设置 RONLY 位的文章、我能够猜测如何更正软件中断例程(更确切地说:开关中的"案例陈述")、现在可以正常工作。 我不记得确切的内容、但在设置字的高位字节(对于 UCD3138A64)方面也有一些不同。 我基本上最终从寄存器中复制了初始值。

    但是、它不需要将软件中断调用为"设置监控器模式"-软件中断函数是否以其他方式将程序置于特权(或任何特殊)模式? 此函数由 pragma 定义为中断、是这样吗?

    BTW、您是否曾遇到过与误差放大器或 EADC 在小输入电压下具有高(10mV)偏移的行为? 我们遇到了一个问题(具有电流调节功能的降压转换器)、即当 EADC 的基准设置为0时、高侧 PWM 不会停止、而是保持反馈电压所对应的占空比。 10mV (即误差放大器的输入为该值)、然后 EADC 报告的误差等于0 (因此滤波器中积分器的累积值不会改变、PWM 持续运行)。 是否有办法在环路的数字部分的某个位置校准此类偏移?

    此致、
    Adam