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.

[参考译文] MSP430F4250:EEPROM 读取错误数据

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/957607/msp430f4250-eeprom-reading-wrong-data

器件型号:MSP430F4250

我们在温度数据记录产品中一直使用 MSP430f4250、该产品在过去15年的市场中取得了成功。 它一直在与 STM 24C64RP_K 配合使用。 最近、我们已将 STM24C64RP_K (OLD)更改为 STM24C64RP_T (NEW)、并观察到 MSP 正在错误地从 EEPROM 读取数据。 在乞讨时、我们认为问题是 EEPROM 造成的、因为这是唯一发生的变化。 我们与 ST 进行了交谈、并仔细检查了新的 EEPROM 是否正常工作、我们在内部对其进行了测试、并确保了 ST 审核。 我们有点困惑、为什么 MSP 从新 EEPROM 错误读取数据、而过去15年来 MSP 从旧 EEPROM 正确读取数据。 我们使用的新 EEPROM 与旧 EEPROM 使用的电路和固件相同。  我们观察到的一个明显现象是写周期工作正常,而读周期不工作。 解决此问题的任何建议。   

注意: MSP430f4250是高度使用的闪存:89%和 RAM 76%(只剩下0.1KB)。 我们怀疑 RAM 溢出会发生。

STM24C64RP_T (新)研究报告: 1drv.ms/.../s!ArCbXDYx3yjAgQ_7dKTv5eoTe4Wx

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

    虽然没有解决方案、但我们在上一次几乎完全无法提供帮助。 是否有新信息?

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

    我完全测试了 EEPROM。 我已经改进了 I2C 启动/停止/TxACK 的功能、最后一个代码没有 NACK 的做法、所以我现在介绍了这一点。

    当我只使用 EEPROM (T-chip/new)和 MSP430F4250进行读取和写入操作时、一切都正常。 但仍然使用旧代码、没有任何变化。  

    我们正在努力缩小 MSP 覆盖 RAM 的范围、但我不确定。

    我已确保 EEPROM 工作正常、Comms 工作正常。 数据写入工作正常。

    更加精确:

    如果您看到代码、则有一个名为"Start_the Logger"的函数、其中 MSP 从 EEPROM 读取设置字节0x38 (0011 1000、根据设置字节、如果0、MSB 负责 C/F、则启动记录器、如果1、则作为 C 启动记录器、作为 F) 因此、在本例中、记录器应以 C 开头、但以 F 开头

    用于 MSP430的 CrossWorks 用于编译代码。 在调试/发布模型上运行时、MSP 的 EEPROM 读取行为不同。

    在中、对字节的读数 也进行了错误解释、在调试中、对所有一个字节的读操作都进行了正确解释。 但是、当读取大量数据时 、实际情况会再次开始。(如果读取的字节少于500字节、则会错误地解释、如果读取的 字节大于500字节、则会正确读取所有字节。 实际上、这一点是写入工作的验证。 (它正在正确存储数据)

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

    你好 Sivashankar、

    我通读了这篇文章和上一篇文章、以了解该问题。

    我的第一个想法是、由于您能够正确读取/写入更大数量的值(500)、因此我将排除 MSP430器件。

    您的代码中可能有一些内容。

    接下来、由于新 EEPROM 出现问题、我怀疑这不是时序问题、而是 EEPROM 内部寻址中的问题。

    让我浏览一下数据表、看看是否有被忽视的东西。

    您可以尝试的方法是、将代码减至可能的绝对最小值、但仍能证明问题。  在此过程中、您可能会发现问题、另外您还可以发布供我查看。  但请注意、这必须是证明问题所需的绝对最小代码量。  我所说的线路不超过100条。

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

    你好 Sivashankar、

    我似乎找不到旧版_K 器件的数据表、因此我不知道与_T 相比、芯片的时序是否有任何可能的变化

    您是否在最终取得了任何进展?

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

    尊敬的 Dennis:

    非常高兴。 我正在开发一个简短的100行代码以演示问题。  

    关于旧数据表、我甚至不确定、但我有一份来自 ST 的报告、用于比较这两者。 PFA

    C -单击"C"进行下载

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

    我不得不重新挖掘时间、找到与您的代码相似的东西。 我至少看到了位拆裂代码读取 一个字节时出现问题的可能性。

    您将时钟输出设置为高电平、然后读取数据。 由于下一行中的表达式复杂、这里的延迟有点模糊、但很难超过 EEPROM 的数据保持时间规格。

    您可以实现的最小值大约为两个时钟周期(使用寄存器中已有的地址进行读取)、在8MHz 时、超过规格、因此数据可能已经消失。 您可能需要检查编译器生成的代码以查看实际的延迟。

    您还需要担心访问时间。 从您将时钟设置为低电平到采样数据需要多长时间?

    我不太清楚地记得通过位拆裂来执行一些 I2C、主要是为了确保我满足所有要求的时序限制。

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

    暂挂数据保持问题。 自从我深入到 I2C 并混淆了边缘以来、已经过了太长的时间。 但您确实需要担心访问时间。

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

    尊敬的 Dennis 和 David

    在我开发100行代码的过程中、我发现 EEPROM 状态中有一个错误、该错误从 SET_TO_READ 条件变为 STOP 条件、并且没有获得任何数据。 在对停止条件进行评论后、似乎可以正常工作。

    因此、实际上我的问题已经解决了。  

    但仍然有疑问、它如何与 EEPROM 配合使用-类型为"K"、而不是与 EEPROM-类型 为"T"配合使用

    我想对每一位在路上跳进并帮助我们的人表示非常感谢。 每一点都有不同的层面、对我个人来说、这是一次很棒的学习。  

    现在、我的内部问题是  EEPROM-类型"K"(旧)如何能够在错误的 EEPROM 状态下工作、而新  的 EEPROM-类型"T"(新)对该 EEPROM 状态非常敏感。

    此致、  

    Sivashankar

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

    https://1drv.ms/t/s!ArCbXDYx3yjAgRDGcSp2i2ygU6Ov (代码)

    更改后

    行号:2339:--- >"   Stop_EEPROM ();//终止数据字节/字节,读取"

    更改为:---- >" if (full!= 0) Stop_EEPROM ();//终止数据字节/字节、读取"

    错误已修复

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

    由于这是一个巨大的 blob、因此很难部分遵循您的代码。 我已利用单独编译将代码拆分为独立的部分了很长时间。 这使得维护工作变得容易得多、我可以确保在一个地方进行的更改不会意外地影响其他东西。 它还使更改后的编译速度大幅加快、因为不必处理太多代码。 我的代码驻留在软盘上的时间不像现在那么大。

    例如、我拆了我的旧位拆裂的 I2C 代码、该代码位于 i2c.c 文件中 它用于处理传感器的 lsm303.c。 (在 i2c.c 中、我使用预处理器定义符号来操作时钟和数据线、因此我不必记住使用了哪个端口和引脚、并使更改变得简单得多。)

    我注意到的几件事是、您似乎不会 NACK 接收到的数据的最终字节、而是只做一个停止、并且您不支持时钟扩展。 您现在可能会放弃它。

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

    你好 Sivashankar、

    我很高兴您找到了问题。  我让您将代码缩小到尽可能小的大小、同时仍然证明问题的部分原因是、我发现50%的客户在"清理"代码的过程中发现自己的问题。  现在、让您的问题得到解决后、您的效率达到51%。

    我看到 David 仍在帮助您进行其他一些可能的改进。  一切正常后、继续并将此主题设置为"已解决"。