大家好:
您能告诉我以下答案吗?
1.如何在 DFLASH 中定义通信地址变量(ID);
2.如何将 RAM 通信地址变量(ID)保存到 DFLASH;
3.如何更新 DFLASH 中的通信地址变量(ID)到 RAM 调用。
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.
大家好:
您能告诉我以下答案吗?
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 位