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:片上 EEPROM 回读、以从电路板获取当前(运行)时钟频率

Guru**** 2589245 points
Other Parts Discussed in Thread: LMK61E2

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

https://e2e.ti.com/support/clock-timing-group/clock-and-timing/f/clock-timing-forum/751511/lmk61e2-on-chip-eeprom-read-back-to-get-the-current-running-clock-frequency-from-the-board

器件型号:LMK61E2

您好!

在您的帮助和支持下、我能够对电路板上的 LMK61E2时钟芯片进行编程、以支持多个频率、并将时钟配置保存到 EEPROM。 现在、我正在尝试从电路板读取 EEPROM 内容、以便每当电路板上电时、我的算法应该显示电路板上当前的运行频率。

为了完成此任务、我选择了一种简单的方法来读取 EEPROM 字节22、23、其中包含 PLL_NDIV 值、并将它们与器件寄存器 R25、R26中的值进行比较、然后显示频率。 我已经按照数据表(pg-22)中提到的步骤来读取 EEPROM。 如前所述、我在 R51中写入 EEPROM 地址字节(22)、然后在同一 I2C 事务中读取 R52。 但是、我从 EEPROM 字节中获得一个过时的值。 请查看我执行此任务的以下编程序列。

//i2c_write_read_immediate (1、2、0x51、0x22、Rx_data、 2); /*为函数调用提供的值
/*------------------ *
静态 bool i2c_write_read_immediate (uint8_t BCM_no、size_t TX_size、uint8_t reg_no、uint8_t reg_val、uint8_t * reg_data、 size_t rx_size)

int32_t bytes_written = 0;
int32_t bytes_read = 0;
int32_t 结果;
uint32_t 参数;  
size_t rx_size_remaining = rx_size;//变量添加了 la

/*在此处写入 EEPROM 寄存器地址,您打算读取内容,data[1]包含值*/
context.data[0]= reg_no;
context.data[1]= reg_val;

if (context.initialized){
if (MQX_OK =_lwsem_wait (context.sem)){

/*通过 i2c 驱动程序写入 EEPROM 地址*/
bytes_write=_io_write (context.i2c_fd [bbcm 否]、context.data、TX_size);
fflush (context.i2c_fd [BCM_no]);
ioctl (context.i2c_fd [BCM_no]、IO_IOCTL_flush_output、&param);

/*读取同一 i2c 总线中实际数据的下一个地址(reg_no+1)*/

context.data[0]= reg_no +1;/*R52*/
if (bytes_written = TX_size){
ioctl (context.i2c_fd [BCM_no]、IO_IOCTL_I2C_REPEATE_START、NULL);
param = rx_size;//应为要读取 LA 的字节总数
ioctl (context.i2c_fd [BCM_no]、IO_IOCTL_I2C_SET_RX_request、&param);

bytes_read = 0;
执行{
结果=_io_read (context.i2c_fd [BCM_no]、Registered_data[bytes_read]、rx_size_remaining);
如果(结果> 0){
bytes_read +=结果;
RX_SIZE = RESULT;//行添加了 LA

} while ((bytes_read < rx_size)&&(结果>= 0));


ioctl (context.i2c_fd [BCM_no]、IO_IOCTL_I2C_STOP、NULL);//读取操作结束时的停止缺少 LA
_lwsem_post (& context.sem);


返回((rx_size)=bytes_read);  

通过 I2C 设备驱动程序的控制命令(IO_IOCTL_I2C_REPEATE_START),我尝试使用相同的 i2c 总线来读取同一事务中的值。 但是、我的输出始终是 reg_data 中的过时值。 请您仔细研究我的方法、并建议我一种解决此问题的方法吗? 或任何其他方法从电路板获取运行中的现有片上 LMK61E2频率。 我确定可以读取寄存器内容、因为我在保存 EEPROM 时使用了读取操作、但不确定在同一事务中进行写入和读取操作时出错了什么。

 

非常感谢您的任何建议/帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以读取寄存器25和26、因为它们在下电上电后从 EEPROM 加载。 尝试此操作、看看您是否观察到预期值。

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

    哇、它运行得很好。 我编写了一个简单的命令来读取寄存器并显示输出。

    请参阅以下输出:

    0000:00:00:17.120 EVB>时钟集 CFP2 2.
    设置时钟频率= 167.380MHz

    保存 EEPROM (Y/N):是

    完成:

    0000:00:01:41.186 EVB>时钟恢复 CFP2  
    Reg17 80
    Reg25 0
    第26号条例35.
    完成:

    我想、我可以使用读取输出完成我的任务。 谢谢你。

    但是,为什么我要按照数据表中的说明在 R51中写入地址,然后在同一 I2C 事务中读取 R52,从而获得过时的值? 请您简要解释一下。

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

    确切地了解发生这种情况的原因需要进一步调查。
    将设置保存到 EEPROM 和下电上电后、是否测量输出端所需的频率(167.380MHz)? 过期设置对应的频率是多少?

    此致、
    通道

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

    在 EEPROM 保存后、示波器的输出频率显示为167.38MHz (电路板的下电上电周期显示为167.38MHz)、并在此处连接示波器输出。  

    现在来看我遇到的过期值是0x22、0x23、这只是我在 R51步骤中写入的 EEPROM 地址中写入的 EEPROM 字节值。 如果我尝试在两个单独的 i2c 事务中进行写入和读取、我会得到一些随机值、例如7A、7B (尽管这不应该由两个单独的事务来完成)。

    此外、您还可以在上面的同一个线程中找到我遵循的步骤/程序序列。