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.
您好!
我将编写一个内核驱动器、以通过 i2c 对 LMK03318时钟芯片进行编程。
这些寄存器我可以写入、它们会使芯片的实时输出发生相应变化。
出于完整性考虑、我使用 i2c_master_send 发送单个 字节、并使用 i2c_master_recv 接收单个字节(尚未进入突发模式)。
我的 I2C 时钟在总线上为400kHz。
我可以写入任何单独的寄存器并读回、以确认正确的写入操作。
我还可以使用 Excel 文档(3857.LMK033x8_EEPROM_programming_v1)直接写入 SRAM、作为地址值与 TICS 生成的 EEPROM 文件对的生成器。
我可以通过回读这些值并将它们与原始值进行比较来确认正确的 SRAM。
当我尝试将 SRAM 设置到 EEPROM 时、就会出现这个问题。
我们处于软引脚模式、GPIO 2/3都设置为接地。
我已经尝试了按照 PDF 的10.5.4写入 SRAM 部分进行操作。
我尝试了第一种方法、方法是写入我需要设置的所有寄存器并确认实时操作。
然后将0x00写入 R145以设置页0。
然后向 R137.6写入1、以将实时寄存器复制到 SRAM。
然后、我按照第10.5.5节"写入 EEPROM "进行操作。
将0xEA 写入 R144可解锁 EEPROM
向 R137.0写入1以开始传输。
在等待400ms 后、我确实再次锁定了 EEPROM、但现在我没有重新锁定、因为我不确定它是否会导致写入失败。
我还尝试了第二种首先写入 SRAM 的方法、我可以确认值采用了我可以读回的方法。
然后、按照 上述说明执行第10.5.5节"写入 EEPROM "。
发生的情况是、在 I 下电上电之前、R137永远不会将其保持为0x01。
这是之前的图像、圈出了 EEPROM 计数器、NVMCTL 和 NVMUNLK 寄存器。
该芯片在嵌入系统之前就被 TICS 程序编程过一次。
完成上述 EEPROM 写入步骤之后、将进入待机模式。
7.
您可以看到 NVMCTL 寄存器卡在0x01处、计数器仍在0x01处、解锁当前在0xEA 处"解锁"。
对不起,这是一个很长的帖子,我只是想涵盖我能想到的一切。
希望有人能帮忙。
谢谢
安东
和一些有趣的事情。
使用逻辑分析仪进行探测时、TIC 通过评估板输出芯片、我发现它不是按照文档中描述的方式对芯片进行编程。 写入大量保留地址、并在 EEPROM 程序中执行以下操作;
因此、它会写入以将实时寄存器和自动对 CRC 存储到寄存器0x89、然后它会立即将值清除回仅自动对 CRC、这样它就不会等待自清除。
然后解锁 EEPROM。
然后、它使用0x13开始 EEPROM 编程、这是自动计算 CRC、一个保留位没有描述0x2、并且0x1编程 EEPROM 位。
然后它仅在30ms 的延迟(测量时间)后锁定 EEPROM
最后、就像它强制0x89寄存器清零的方式一样、也会强制 EEPROM 写入位清零、而不会等待它自动清零。
TICS 似乎与文档顺序不同。
尊敬的 Anton:
让我向团队核实这一点。
此致、
Jennifer 女士
Anton、
如果 TICS Pro 有用、您可以按照这些步骤操作。
我可以执行以下操作-请尝试在 TICS Pro 的"Raw Registers"窗口中执行该过程,并告诉我得到的结果是什么。
我想注意的一点是(无论是对于您还是此线程的未来读者)、如果您要对多个页面进行编程、则必须对每个 SRAM 页面重复步骤1至3。 如果未执行此操作、则之前可能已存储在其他页面中的任何其他 EEPROM 配置 怎样的 内容。
谢谢。
Kadeem
感谢你的评分
我明天会尝试你的建议。
最终、我需要能够在不使用 EVAL 板的情况下对 EEPROMS 进行编程、但它是首先尝试您的方法的好地方。
我可以看到的主要情况与我尝试的方式不同、是在步骤5对0x51进行编程、在该步骤中、如果我要启用自动 CRC、我可以对0x1或0x11进行正常编程。
我知道你是怎么知道的。
Anton、
好的-如果此方法不适合您、请告诉我。
谢谢。
Kadeem
因此评估套件工作正常。 有时它会有点镰刀、在编程之后、它在"Outputs"选项卡上看起来不是很正确。 因此我必须选择对所有寄存器编程两次、然后继续执行您的步骤、这似乎仍然适用。
接下来将其移到不使用评估板的产品中、以允许我对 EEPROM 进行编程...
在评估(在我们的产品之外)和产品内部的两种环境中、我将逻辑分析仪连接到芯片。 我确实注意到、在等待 EEPROM 编程时总线上存在 I2C 流量。 没有任何命令直接与 LMK 通信、但总线可能在230ms 等待期间处于运行状态。
在对 EEPROM 步骤进行编程时、i2c 端口必须完全静默有多重要?
我得到它列为原子写入、这很好、我可以保证、除了我的驱动程序、没有任何东西在与芯片通信、并且在设置0xEA、设置0x51的步骤之间、我没有在300毫秒内与芯片通信(我添加了一个时间缓冲器)、 设置0x00序列。 但我在此论坛的另一个线程中看到、技术上的回应是在启动 EEPROM 写入后端口上不应出现流量。 这真的是端口必须完全安静所有 i2c 流量的情况吗?
如果是、我可能需要查看在此期间的某种总线锁定以停止 i2c 总线上的任何通信。
再次感谢您的观看。
Anton、
这是正确的-在此期间、总线上不应有任何流量。
谢谢。
Kadeem
这里只是一个跟进,为任何人稍后阅读这.
根本原因是由于 LMK 芯片位于多路复用器之后、Linux 内核 i2c 驱动程序的默认状态是在任何传输之间关闭和打开多路复用器。 这种打开和关闭对于除 EEPROM 写入命令之外的所有 LMK 操作均可接受、因为这要求 I2C 总线完全静默230ms。
因此、您需要在读取或写入序列期间锁定 i2c 多路复用器、以便编写 PROGRAM 命令、然后等待230ms 将总线保持在锁定状态。
执行此操作后、我能够使用写入活动寄存器然后复制到 SRAM 以及在保存到 EEPROM 之前使用直接 SRAM 写入来对时钟进行编程。
这允许我继续为 lmk03318运行内核驱动程序。 我是在 GPL 许可证下创建的、因此可能会 在内核源下加入 lmk04832。
我接受您的回应 Kadeem。 感谢您的帮助。