主题中讨论的其他器件: UNIFLASH
工具与软件:
你好
我们正在研究一个使用 msp430fr6047开发水表的项目。
我正在尝试使用 SPI 闪存(w25q40)来输入用户定义的变量。
用于开发的代码为 UltrasonicWaterFR604x_02_40_00_00。 是否有与代码匹配的任何示例或参考?
SPI 闪存连接端口如下所示。
我需要帮助。
谢谢你
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开发水表的项目。
我正在尝试使用 SPI 闪存(w25q40)来输入用户定义的变量。
用于开发的代码为 UltrasonicWaterFR604x_02_40_00_00。 是否有与代码匹配的任何示例或参考?
SPI 闪存连接端口如下所示。
我需要帮助。
谢谢你
下面是代码示例:
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 闪存相关的示例...
谢谢你
感谢您的答复。
在原始代码中、版本使用了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 保存的值、电源会关闭然后再次打开、并且在进入调试模式后检查存储器。
如何修改它、以便即使关闭电源后又重新打开、也能读取先前保存的值?
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 读取为之前输入的值?
听起来您想要:
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)就足够了。