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.

[参考译文] LMK61E2:在重新启动电路板时、保存 LMK61E2片上 EEPROM 上的时钟配置(寄存器内容)

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

https://e2e.ti.com/support/clock-timing-group/clock-and-timing/f/clock-timing-forum/748081/lmk61e2-save-the-clock-configuration-register-content-on-lmk61e2-on-chip-eeprom-over-restarts-of-the-board

器件型号:LMK61E2

您好!

我已经使用现有的板载 TI LMK61E2芯片对我的器件进行了编程、以支持各种时钟频率。 我按照数据表 http://www.ti.com/lit/ds/symlink/lmk61e2.pdf 中提到的步骤 对我的器件上的 TI 时钟进行编程、并成功生成了请求的时钟频率和流量。

现在、我们将尝试在 LMK61E2片上 EEPROM 中保存配置的时钟频率、以使其在重新启动时保持不变。 很明显、我按照数据表(第21页)中提到的步骤保存 EEPROM、但是我遵循的序列不会将配置保存在 EEPROM 中。 请找到要保存在 EEPROM 上的我的编程序列。

影子寄存器声明

/*为167.380 MHz 频率设置的寄存器*/
{"R0"、0x0010}、{"R1"、0x010B}、{"R2"、0x0233}、{"R8"、0x08B0}、{"R9"、0x0901}、 {"R16"、0x1000}、{"R17"、0x1180}、
{"R21"、0x1501}、{"R22"、0x1600}、{"R23"、0x1720}、{"R25"、0x1900}、{"R26"、0x1A35}、 {"R27"、0x1B00}、{"R28"、0x1C01}、
{"R29"、0x1D5F}、{"R30"、0x1E00}、{"R31"、0x1F02}、{"R32"、0x2071}、{"R33"、0x2103}、 {"R34"、0x2224}、{"R35"、0x2327}、
{"R36"、0x2414}、{"R37"、0x2502}、{"R38"、0x2600}、{"R39"、0x2707}、{"R47"、0x2F00}、 {"R48"、0x3000}、{"R49"、0x3110}、
{"R50"、0x3200}、{"R51"、0x3300}、{"R52"、0x3400}、{"R53"、0x3500}、{"R56"、0x3800}、 {"R72"、0x4802}

 然后 是用于寄存器写入的 WRITE_clockmode_frequency 数组(通过此步骤实现了频率)并保存配置。

/*保存到 TI 时钟的片上 EEPROM */
void bcm82251_WRITE_EEPROM_clockmode (uint8索引)

uint16_t reg49_val = OTU4_support[索引][27].Reg_value;
uint16_t reg56_val = OTU4_support[索引][32].Reg_value;

/*将1写入 R49.6,SRAM 设置*/
reg49_val =(reg49_val & 0xFFFF)|(0x0001 << 6);
OTU4_support[索引][27].Reg_value = reg49_val;
printf ("1.reg49_val %X、OTU4现在为%X\n"、reg49_val、OTU4_support[索引][27].ReG_value);

/* EEPROM 启动 R49.2 */
reg49_val =(reg49_val & 0xFFFF)|(0x0001 << 2);
OTU4_support[索引][27].Reg_value = reg49_val;
printf ("2.reg49_val %X、OTU4现在为%X\n"、reg49_val、OTU4_support[索引][27].ReG_value);

/*将0xBE 写入 R56 */
reg56_val =(reg56_val & 0xFFBE)|(0xBE);
OTU4_support[索引][32].Reg_value = reg56_val;
printf ("3.reg56_val %X、OTU4现在是%X\n"、reg56_val、OTU4_support[index][32].ReG_value);

/*将1写入 R49.0 */
reg49_val =(reg49_val & 0xFFFF)|(0x0001);
OTU4_support[索引][27].Reg_value = reg49_val;
printf ("4.reg49_val %X、OTU4现在为%X\n"、reg49_val、OTU4_support[索引][27].ReG_value);
_TIME_DELAY (1);

printf (" EEPROM 总周期包含%X\n"、OTU4_support[index][26].ReG_value);

/*将0x00写入 R56 */
OTU4_support[索引][32].Reg_value =(reg56_val 和0xFF00);
printf ("R56寄存器%X\n"、OTU4_support[index][32].Reg 值);

输出:

0000:00:54:13.999 EVB>时钟设置 EVB 2.
设置时钟频率= 167.380MHz

1.reg49_val 3155、OTU4现在为3155
2.reg49_val 3155、OTU4现在为3155
3.reg56_val 38BE、OTU4现在为38BE
4.reg49_val 3155、OTU4现在为3155
EEPROM 周期总数包含3000
R56寄存器3800

现在、我可以看到影子寄存器内容发生了变化、最终这些步骤必须引导 EEPROM 保存。 但 R48内容仍然显示为3000、这意味着该过程没有给出结果。

您能不能建议我出错的地方、还是我在数据表中遗漏了一些东西。 在重新启动后保存 EEPROM 内容时必须遵循的步骤是什么。

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

    您好!

    有人能不能帮助我了解基于上述详细信息的 EEPROM 保存。

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

    1.将寄存器写入所需的输出频率。
    2A。 将0x50写入 R49 -将 REGCOMMIT 位置位、以便在内部将寄存器设置传输到 SRAM。
    2b. 读取 R49 -应该读回0x10 (REGCOMMIT 应该在寄存器到 SRAM 的传输完成后自行清零)
    3.将0xBE 写入 R56 -请勿读回该值、因为步骤3和4必须是原子写入(即中间没有其他 I2C 总线事务)
    4A。 将0x13写入 R49 -设置 NVMERASE 和 NVMPROG 位。
    4B。 读取 R49 -应读回0x10 (在 NVM 擦除/编程完成后、NVMERASE 和 NVMPROG 应自行清除)。
    5.将0x00写入 R56。
    6.将0x18写入 R49 -置位 NVMCOMMIT 位以将 NVM 程序计数值更新为 R48 (从最新的 EEPROM 周期更新)。
    7、读取 R48 - NVMCNT 值应在步骤6之后递增(或在器件重启后递增)。

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

    谢谢、问题已得到解决