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.

[参考译文] UCD3138:如何在 DFLASH 中定义通信地址变量(ID)

Guru**** 2587365 points
Other Parts Discussed in Thread: UCD3138, UCD3138HSFBEVM-029

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/841445/ucd3138-how-to-define-the-communication-address-variable-id-in-dflash

器件型号:UCD3138

大家好:

        您能告诉我以下答案吗?

     1.如何在 DFLASH 中定义通信地址变量(ID);
     2.如何将 RAM 通信地址变量(ID)保存到 DFLASH;
     3.如何更新 DFLASH 中的通信地址变量(ID)到 RAM 调用。

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

    我不确定您提到的变量、因为有多个 ID、所以我将提供一般准则。

    您需要执行以下几个步骤:

    1.定义用于存储数据的数据闪存区域

    2.定义用于存储数据的 RAM 变量

    3. 发出 PMBus 命令将数据写入 RAM

    4. 生成或修改 PMBus 命令以读取数据

    5. 实施或修改 PMBus 命令以将 RAM 数据复制到 dFLASH 中

    6.实施或修改 PMBus 命令,将 dflash 数据复制到 RAM 中,也可在启动时调用

    我不认为我们的任何 EVM 代码都支持向数据闪存写入任何文本值、但它们都支持写入大量滤波器和系统设置。

    您可以查看所有这些代码、了解如何处理整个过程的示例。

    例如、让我们在 http://www.ti.com/tool/UCD3138FW_LLC 上获取 LLC EVM 代码

    对于步骤1、您需要查看 cyclone.cmd 文件。  您可以在 CCS 中的项目资源管理器的 Devices /UCD3138/Linker 下找到它。

    请注意如下所示的段声明:

    .config:{}>(DFLASH align(32)
    CONFIG_B:{}>(DFLASH align (32))

     这些命令告诉链接器在数据闪存中制作段以用于存储内容。  对齐32是为了确保它使用完整的32字节页。  数据闪存在一个 tlime 上擦除32个字节。  我们创建2个段、以便始终具有有效的段。  当我们更改数据时、我们将其写入空版本、然后再擦除旧版本。   

    接下来、转到 constants.c、它位于项目浏览器的主文件夹中。

    有很多这样的陈述:

    #pragma DATA_SECTION (filter0_PMBus_regs_constants、".config")
    volatile const filter_PMBus_regs filter0_PMBus_regs_constants = default_filter_0_PMBus_regs;

    #pragma DATA_SECTION (filter0_PMBus_regs_constants_b、".config_B")
    volatile const filter_PMBus_regs filter0_PMBus_regs_constants_b;

    这些值在编译时为数据闪存分配值-默认值(如果愿意)。  它们对易失性常量的描述显然是相互冲突的、因为这正是它们真正的描述。  如果我们不在其中放置易失性标签、有时编译器会完全优化数据闪存访问。

    如果使用搜索工具、您将发现结构和常量是在 PMBus_topology.h 中定义的

    在上述所有步骤中、您将定义一个数据闪存区域并将数据放入其中。  我要做多个回复、以便在遇到中断或崩溃时不会受到太大的影响。   

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

     

    我忘记在 该文件中提到 pmbus_constants.h、常量被定义为 extern。  除常量.c 外、它需要包含在所有使用数据闪存中存储的内容的文件中、其中常量实际上是初始化的。  请注意、这里也定义了很多 ID 字符串、但是所有这些、包括器件 ID 字符串、实际上都在程序闪存中。  器件 ID 字符串位于特定的程序闪存位置、但这是一个历史遗迹、实际上不必在那里。  您可以根据需要将其移动到数据闪存。   

    第2步是定义用于存储数据的 RAM 变量。 这在 PMBus_topology.h 中完成  例如、此处:

    extern PMBus_DCDC_CONFIG PMBus_DCDC_CONFIG[DCDC_PAGE_nums];
    extern PMBus_DCDC_CONFIG PMBus_DCDC_CONFIG_ENMODE[DCDC_PAGE_nums];
    extern PMBus_DCDC_CAL PMBus_DCDC_cal[DCDC_PAGE_nums];

    extern PMBus_DCDC_CONFIG_NONPAGED PMBus_DCDC_CONFIG_NONPGED;
    extern PMBus_DCDC_CONFIG_NONPAGED PMBus_DCDC_CONFIG_NONPaged_translated;
    extern PMBus_DCDC_CAL_NONPAGED PMBus_DCDC_cal_non分 页;
    extern UINT16 DCDC_TEMP_1、DCDC_TEMP_2、DCDC_TEMP_3、DCDC_TEMP_4;


    如果您搜索外部、您也会找到其他人。  数据闪存中存储的每个结构和变量都有一个变量定义。   

    第3步、有很多 PMBus 命令可将数据存储到 RAM 中。  PMBus_topology.c 中提供了一个非常简单的示例:

    内联 UINT8 PMBus_WRITE_TON_RISE (void)

    PMBus_DCDC_CONFIG[0].TON_RISE = PMBus_buffer[1]+(PMBus_buffer[2]<< 8);
    CONFIG_VOUT_时序();

    返回 PMBus_SUCCESS;

    您可以看到该值刚刚复制到 RAM 中。  您只需要对 RAM 中的字符串执行同样的操作。  如果字符串太长、可能需要进行一些溢出检查。  有一个变量- PMBus_Number_for_bytes、它将为您提供 PMBus 缓冲区中的字节数量。  第一个字节将是命令、第二个字节将是块中的字节数、这将是字符串、最后一个字节将是校验和。  因此、您应该使用第二个字节作为字符串中的字节数。  PMBus_buffer[1]。

    您显然不需要像 CONFIG_VOUT_时序 这样的东西、因为该字符串对系统设置没有影响。   

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

    步骤4很简单、因为有很多命令可读取字符串-例如、如果您查看 drivers 文件夹并打开 PMBus_common.c、您将找到以下内容:

    内联 UINT8 PMBus_read_mfr_id (void)

    send_string (mfr_id、(uint8) mfr_ID_length);
    返回 PMBus_SUCCESS;

    我们也使用字符串长度、因为我们没有麻烦地使用 C 无疑放置在字符串末尾的空字符。  我想这意味着您需要将字符串与长度信息一起存储-另一个变量存储在数据闪存中。  也可以使用空字符方法。

    您只需将 mfr_id 设置为 RAM 变量、而不是现在的闪存常量。  并使长度也成为 RAM 变量。

    我还应该提到如何生成 PMBus 命令。  对于 LLC 中使用的 PMBus 固件版本、您需要进行一些#define。

    查看 read_mfr_id 周围的代码。  请注意、读/写函数如何使用参数来决定是调用读取函数还是写入函数。  因此、您需要创建一个读取/写入函数、然后让它调用一个特殊函数、或者像现在写入对该函数有效一样、这是一个无效函数。   

    因此、如果您希望对 mfr_id 进行写入、则可以定义函数并从读取写入 mfr_id 函数调用它。   

    要查看添加新函数需要执行的操作、请对读取/写入函数的名称进行全局文件搜索。  您将在 PMBus_topology.h 中看到这一点:

    uint8 PMBus_read_write_mfr_id (uint8 PMBus_read);
    #define PMBus_CMD_99_function_pointer PMBus_read_write_mfr_id
    #define PMBus_CMD_99_query (query_command_supported + query_read_supported + query_non_numeric)

    有一些使用#defines 的奇特表生成固件、这告诉它要调用什么函数以及如何响应查询。  如果您查看查询常量的定义以及 PMBus 手册中的查询命令文档、就会发现这一点。   

    您还需要添加一个新命令。  如果您在同一个文件中搜索99、您还会发现:

    #define PMBus_CMD_96_ENABLE (0)
    #define PMBus_CMD_97_ENABLE (0)
    #define PMBus_CMD_98_ENABLE (1)//完成
    #define PMBus_CMD_99_ENABLE (1)
    #define PMBus_CMD_9A_ENABLE (1)

    启用已设置为1、因为此命令已启用。  如果要创建当前未使用的新命令、则需要在此表中将 enable 更改为1。   

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

    数字5是最有趣的一个-将数据写入数据闪存。   

    这真的很复杂、因为它涉及确定两个数据闪存区域中的哪一个被擦除、将数据写入数据闪存、在末尾完成校验和、然后从另一个闪存区域开始擦除旧数据。   

    您可以从 PMBus_write_store_default_all PMBus 命令中看到大部分内容。   

    在重新启动时的初始化中、有一个检查数据闪存擦除是否完成的小调用、在主代码中调用了一个数据闪存擦除状态机来完成擦除。

    您可以使用此代码并将所需的 ID 字符串添加到此处处理的代码中、或者如果您需要专门用于存储 ID 的其他命令、则可以复制此代码。

    第6点比较简单、因为它不涉及写作、而是阅读。  您可以在 PMBus_write_restore_default_all 命令中看到它。  当然、您不需要为 ID 字符串的寄存器进行所有这些花式转换和复制。  只需复制到 RAM、就可以完成了。  请注意、RESTORE_DEFAULT_ALL 也会在重新启动时的初始化中调用。   

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

    高 LAN 割草机;

             仍然无法写入闪存;IC 为 UCD3138RHAR;

    1 μ A、  ;PMBus_DCDC_CONFIG_NONPGED.VIN_ov_FAULT_LIMIT、但调用 PMBus_write_store_default_all ();仍然无法写入闪存;我采用的程序是 ucd3138hsfbevm-029版本:e1

     

    2、通过以下程序写入 DFLAASH、芯片锁定:

      WRITE_ADDRESS (0x00018954、rs485id);

     

    void write_address (int * rs485address、int data)

     

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

        {

          ;//擦除 DFlash 时不执行任何操作

        }

      DecRegs.MFBALR1.bit.RONLY = 0;

      DecRegs.FLASHILOCK.ALL = 0x42DC157E;

     

      * rs485address = data;

     

      DecRegs.MFBALR1.bit.RONLY = 1;

     

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

        {

          ;//等待

        }

     

     

    3、当下载 x0文件后出现以下警告时、 如何更正:

    2019/9/29 14:11:24正在查找程序模式下的设备...

    2019/9/29 14:11:25 DEVICE_ID 'UCD3100ISO1|0.0.11.0105|141009'无效;映射到 UCD3100ISO1

    2019/9/29 14:11:25 DEVICE_ID 'UCD3100ISO1|0.0.11.0105|141009'无效;映射到 UCD3100ISO1

    2019/9/29 14:11:25在 程序模式下找到 DC-DC 固件 v0.0.11.105 @地址88d

     


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

    高 LAN 割草机;

             仍然无法写入闪存;IC 为 UCD3138RHAR;

    1 μ A、   ;PMBus_DCDC_CONFIG_NONPGED.VIN_ov_FAULT_LIMIT、但调用 PMBus_write_store_default_all ();仍然无法写入闪存;我采用的程序是 ucd3138hsfbevm-029版本:e1

     

    2、通过以下程序写入 DFLAASH、芯片锁定:

      WRITE_ADDRESS (0x00018954、rs485id);

     

    void write_address (int * rs485address、int data)

     

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

        {

          ;//擦除 DFlash 时不执行任何操作

        }

      DecRegs.MFBALR1.bit.RONLY = 0;

      DecRegs.FLASHILOCK.ALL = 0x42DC157E;

     

      * rs485address = data;

     

      DecRegs.MFBALR1.bit.RONLY = 1;

     

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

        {

          ;//等待

        }

     

     

    3、当下载 x0文件后出现以下警告时、 如何更正:

    2019/9/29 14:11:24正在查找程序模式下的设备...

    2019/9/29 14:11:25 DEVICE_ID 'UCD3100ISO1|0.0.11.0105|141009'无效;映射到 UCD3100ISO1

    2019/9/29 14:11:25 DEVICE_ID 'UCD3100ISO1|0.0.11.0105|141009'无效;映射到 UCD3100ISO1

    2019/9/29 14:11:25在 程序模式下找到 DC-DC 固件 v0.0.11.105 @地址88d

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

    我无法对其中的一些内容进行评论、因为我不知道0x18954处的内容。  我注意到您没有设置任何擦除。   

    如果它位于配置块的中间、您将得到不正确的校验和、这可能会解释一些问题。

    您需要在软件中断中使用数据闪存写入函数。  您不能只编写自己的函数并调用它、因为主程序是在用户模式下设置的、用户模式没有写入闪存控制寄存器的权限。   

    您要更改 MFBALR1中的 Ronly、即程序闪存的存储器精细基址寄存器、您需要使用 MFBALR2、它用于数据闪存。

    有时、根据版本和设置、编译器会尝试以字节或半字的形式访问 DecRegs、这会导致问题。  最好执行以下操作:   

    DecRegs.MFBALR2.ALL &=~(1<<1);//清除 RONLY 位

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

    很抱歉、我回复的很慢、上周我在度假。