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.

[参考译文] MSP430FR6047:如何在 msp430fr6047中使用 SPI 闪存(w25q40)进行 R/W 处理

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1387739/msp430fr6047-how-to-r-w-with-spi-flash-w25q40-in-msp430fr6047

器件型号:MSP430FR6047
主题中讨论的其他器件: UNIFLASH

工具与软件:

你好
我们正在研究一个使用 msp430fr6047开发水表的项目。
我正在尝试使用 SPI 闪存(w25q40)来输入用户定义的变量。
用于开发的代码为 UltrasonicWaterFR604x_02_40_00_00。 是否有与代码匹配的任何示例或参考?
SPI 闪存连接端口如下所示。

我需要帮助。
谢谢你

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

    抱歉、我们没有这样的代码。 我认为简单的 方法是查找基于  w25q40 +其他 MCU 的代码。 并根据 SPI 代码示例将其迁移到 MSP430。

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

    感谢您的答复。


    如果您不使用外部 SPI 闪存(如 w25q)、那么​​除了用于操作的区域之外、msp430fr6047的非易失性存储器空间中是否还有大约128字节的区域可以存储用户定义的环境变量?
    如果是、我想为该区域找到一种读取/写入方法。

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

    可以、FRAM 可以擦除和写入字节。 您可以参考代码示例并选择任何地址作为 EEPROM。 建议范围是最后128个字节。 对于可用范围、您可以参考.cmd 文件。

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

    感谢您的答复。

    我很想知道可以在哪里找到您提到的 FRAM 访问示例。

    为方便您参考、我想将其用于输入自定义信息、例如超声波计的设备标识号、但我想知道是否可以使用 UNIFLASH 等 FW 编程器擦除该区域。
    我存放自定义信息的区域是否会被擦除?
    即使使用固件编程器更新了固件、也不应将其擦除。 这是可行的吗?

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

    下面是代码示例:

    e2e.ti.com/.../msp430fr60x7_5F00_framwrite.c

    对于 Uniflash、可以尝试以下设置:

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

    感谢您的答复。

    我很好奇上面的代码中连接到的 FRAM_WRITE 位置到底是哪个地址。
    另外、我还有一个问题、所以我想进一步询问。
    检查 lnk_msp430fr6047.cmd 后、JTAGSIGNATURE、BSLSIGNATURE 和 IPESIGNATURE 已设置、但我找不到它们在代码中的使用位置。

    我可以用你回答的代码把对应于 JTAGSIGNATURE、BSLSIGNATURE 和 IPESIGNATURE 的位置更改成自己使用吗?
    我想问一下,因为我对 JTAGSIGNATURE、BSLSIGNATURE 和 IPESIGNATURE 的用途很好奇。

    谢谢你

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

    写入 SPI 存储器器件并不特别困难。 有关详细信息、请参阅相关器件的数据表。 幸运的是、您可以在互联网上打开您可以调整的代码。

    至于使用 FRAM...

    签名值用于锁定这些类型的访问、不可用作常规存储。 除非你知道自己在做什么,否则他们最好是独自留下来。

    即使您设置了选项指示 Uniflash 不擦除所有内容、也只会一次错误地擦除所有内容。 还是代码中存在错误的指针。 对于必须通过固件更新持续存在的关键数据、请使用 SPI 存储器。

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

    感谢您的回答。

    我们的开发项目是根据 EVM430FR6047开发新的超声波计量表。
    因此、我将使用基本代码 UltrasonicWaterFR604x_02_40_00_00。 此外、新创建的超声波计量表省略了 ezFET 部分、其结构在固件编程期间可通过外部 JTAG 进行操作。
    您计划制造的超声波仪表具有固定连接到它的15mm 测量管。 此外、必须在每个超声波计量表中输入唯一的4字节序列号、以识别超声波计量表。

    我们问过是否需要通过 FRAM 或 SPI 闪存读取和写入产品编号。


    其中、由于检查代码、我找不到源代码(UltrasonicWaterFR604x_02_40_00_00)或任何提及的 JTAGSIGNATURE、BSLSIGNATURE 和 IPESIGNATURE 都包含在 FRAM 区域中、因此我向其提问。

    产品编号只需要4个字节。

    如果 IPE 签名是显示管道信息的区域、或者 BSL 签名被显示 EVM430Fr6047电路板信息。

    只要在 UNIFLASH 或 USS GUI 中未使用它、它似乎就可以使用。

    我想再次询问是否有任何这方面的信息。

    使用内存浏览器进行检查的结果是、JTAGSIGNATURE、BSLSIGNATURE 和 IPESIGNATURE 区域都用0xFF 填充、如下所示。


    但是、我找不到任何与 SPI 闪存相关的示例...

    谢谢你

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

    我不建议您触摸签名部分。 有关说明、可在 UG 中找到。

    关于如何使 SPI 闪存工作、它超出了我们的支持范围。  在 FRAM 中保存数据时是否存在任何问题?

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

    感谢您的答复。

    在原始代码中、版本使用了8个字节、但已经过修改。

    目前修改为版本仅使用4字节、ID_NUM 使用4字节。

    我在未使用#progma persistent 的情况下检查了 Write_IDNUM ()/ READ_IDNUM ()、但当我再次关闭电源并在 CCS 调试模式下运行时、该值复位为0。

    目前、我正在尝试使用 ID_Num 区域保存它、但未保存、因此我将再次编辑它。

    添加#progma persistent 后、将出现如下错误。
    "../main.c"、第113行(第9列):错误#1521:变量"ID_Num"不能是持久的、也具有 DATA_SECTION pragma。 如果没有 DATA_SECTION pragma、"ID_Num"将位于.TI.persistent:ID_Num 段中。 仅使用 DATA_SECTION pragma、您必须在链接器 cmd 文件中将该段标记为持久性。
    "../main.c"、第113行(第9列):警告#1519-D:变量"ID_Num"被声明为持久的、并且应该被显式初始化

    测试在 CCS 的调试模式下进行、为了检查 ID_Num 保存的值、电源会关闭然后再次打开、并且在进入调试模式后检查存储器。

    如何修改它、以便即使关闭电源后又重新打开、也能读取先前保存的值?

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

    按如下所示进行修改后、如果通过关闭和打开 EVM430fr6047的电源进行检查、则最初尝试的 READ_IDNUM ()值将返回到0。

    即使在写入 FRAM 后关闭和打开电源、也应该怎么做才能保持保存的值?

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

    1)每次下载新代码时、Persistent (除 NOINIT 以外的所有内容)变量都将重新初始化。 (注意 CCS 下载/擦除选项。)

    2) 2)我对您的测试顺序有点不清楚、但一般而言、如果您对目标(MCU)进行下电上电、则调试器断开连接、并且在(重新)连接调试器时、代码会再次下载。 (可以在不重新加载代码的情况下重新连接调试器、但我记得(已经有几年了)这是一个很复杂的过程、我没有看到您正在执行此操作的指示。)

    3)我不确定编译器/链接器如何将 persistent 和 location 组合在一起、因为 persistent 相当于 data_section (".TI.persistent")、并且该段会在0x4000处下降。 我猜是忽略了其中一个(或两个)。 您的调试/ .map 文件应该会告诉您一些信息。 您收到了任何警告吗?

    4) 4) ID_Num 的位置是否重要? MPU (支持写入 FRAM)具有1KB 的粒度(这就是 RW 部分为 PALIGN (0x400)的原因)、因此您将启用所有 ID_Num 的相邻值进行写入。 还可以(临时)完全关闭/打开 MPU、这会带来危害、但我记得相当简单/快速。

    5) 5)您计划如何更新 ID_Num? (a)在您的申请中? 或 (b)使用外部工具? 我模糊地回忆 Elprotronics 的软件有一个可能被投入使用的序列编号方案。

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

    如果需要器件唯一的数字、则可能需要查看 TLV 数据。 其中一些对于每个器件是唯一的。

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

    感谢您的答复。

    在 CCS 调试模式下重新连接时、我不希望初始化存储器。

    当我们正在进行的超声波仪表开发接近完成时、我们计划通过一个单独的调试 UART、用一条命令来保存每个仪表的 ID。
    换句话说、您可以通过使用超声波计量器 FW 的调试 UART 将其视为输入和存储。


    此外、由于超声波仪表由电池供电、即使电源关闭后又再次打开、仍会继续读取存储的单个仪表 ID、从而可以识别仪表。

    ID_Num (每个仪表的 ID)的位置并不重要。
    我接着进行了此演示、因为如果它位于 FRAM 上的固定位置、则更容易识别和调试。

    目前尚没有新创建的超声波仪表板、因此我们只使用 EVM640fr6047检查 FRAM 存储和读取情况。

    在 FRAM 中保存包含4个字节的 ID_Num 后、我想检查能够读取保存的 ID_Num 的代码、即使在复位和断电/打开时也是如此。


    在 CCS 调试模式下、是否可以在不进行初始化的情况下将存储在 FRAM 中的 ID_Num 读取为之前输入的值?

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

    我明白你说的。
    我从 cmd 文件的以下部分得到了提示。


    谢谢你

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

    听起来您想要:

    1) 1)几乎从不更新;其他时间应受写保护

    2) 2)使用您自己的代码更新

    3)如果它不移动将是非常好的

    信息 FRAM 是为此类产品量身定制的、但 FR60xx 系列没有。

    我所看到的解决方案(复杂性增加):

    a)返回到 data_section (".id_num")解决方案、但删除 persistent 规范。 然后在 Write 函数中、将赋值括起来类似于[我没有 FR6047来尝试、但我非常确信可以用]:

    MPUCTL0 = MPUPW | (0*MPUENA);  // Turn off the MPU -> no write protection (anywhere)
    ID_Num = new_value;  // (loop elided for brevity)
    MPUCTL0 = MPUPW | (1*MPUENA);  // Turn on the MPU

    b)选项(a)将(仍然)在每次加载新代码时重新加载初始值。 为了防止出现这种情况、在显示">ID_NUM"的链接器.cmd 行中、附加"type = NoLoad"["type=NOINIT"也可能适用]。 然后在"Project->Properties->Debug->MSP430 Flash Settings->Erase Options"中选择"Erase and download necessary segments Only"。

    这里的危险是,在(第一个)代码下载后,你不知道在那里什么。 校验和可能很有用。 (或者、也许您不关心这个问题。)

    C)一般而言、我实际上同意 David Schultz 的观点:最不危险的方法是外部 EEPROM/FLASH/FRAM、但是的、它需要额外的"成本"、并且(A)或(B)就足够了。