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.

[参考译文] CC2340R5-Q1:我们只能将数据写入 NVS 一次

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1520930/cc2340r5-q1-we-can-write-data-into-nvs-only-once

器件型号:CC2340R5-Q1
主题中讨论的其他器件:CC2340R5

工具/软件:

您好的团队、

目前、我正在处理 CC2340R5器件、因为我们使用 NVS 存储器从非易失性存储器中读取和写入数据、但我们可以将数据写入唯一一个存储器、之后我们尝试将数据写入 NVS、但 NVS 不接受多次数据。

WRITE_DATA[0]= 0x24; //示例  
nvs_write (nvsHandle、0、(void *)写入数据、1、nvs_write_post_verify); //将数据写入存储器  

对于读取数据、我们使用以下函数

nvs_read (nvsHandle、0、(void *) READ_DATA、size);

是否需要对多次将数据写入和读取到 NVS 存储器进行任何设置。

请建议任何方法来解决这个问题。

SDK: simplelink_lowpower_f3_SDK_8_40_00_61

CCS 版本:12.7.

谢谢、此致

Balaji Wankhede  

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

    您好:

    当写入失败时、您看到的行为是什么?  

    您在代码中的哪个位置发出这些读取/写入(BLE 栈线程?)?

    此致、

    Nima Behmanesh

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

    你好、Nima、

    我看到了第一次将数据成功写入存储器时写入存储器的行为、但同样、我想覆盖数据、但没有发生这种情况。

    写入时、我使用了以下函数:

    nvs_write (nvsHandle、17、(void *)写入数据、1、nvs_write_post_verify);//写入 MEMOEY

    我想写入0x4011存储器位置、因为我们连续写入的是一字节数据。

    谢谢、此致

    Balaji Wankhede

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

    您好:

    我相信你也必须删除你写之前,如果该部分已经写.  

    请尝试以下操作:

    NVS_write(nvsHandle,17, (void *) Write data, 1, NVS_WRITE_POST_VERIFY | NVS_WRITE_ERASE);

    我想写入0x4011内存位置、因为我们要连续写入一个字节的数据

    如果您持续将 数据写入非易失性闪存、我会有点担心、因为这会更快地磨损闪存、因此不建议这样做。

    此致、

    Nima Behmanesh

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

    你好、Nima、

    感谢您的答复。

    我已经尝试了建议的方法、但我遇到了一个问题。 当我使用此函数时、在写入数据之前会擦除整个扇区。 但是、我不想覆盖同一存储器中的现有数据—只更新特定字节而不影响扇区的其余部分。

    下面是我使用的函数:

    NVS_write(nvsHandle, 17, (void *)Write_data, 1, NVS_WRITE_POST_VERIFY | NVS_WRITE_ERASE);

    如上所示、我只写入1个字节的数据。 但是、同一扇区中之前写入的所有其他数据都会被擦除、这不是预期的行为。

    是否有办法更新单个字节而不擦除该扇区的其余部分?

    谢谢、此致

    Balaji Wankhede

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

    您好:

    写入非易失性闪存时、必须进行擦除、因为写入是 AND 操作(请注意、这不是 TI API 的限制、而是 闪存的限制)。 为了进行更新、您需要读取扇区(或仅读取存储在该扇区中的数据)、对该缓冲区进行任何更新、擦除该扇区、然后用所需的更新写回缓冲区。 或者、您可以将数据写入同一扇区、但每次写入(管理)的偏移量都会递增、直到该扇区已满。 扇区已满后、读出数据、擦除、复位偏移量并重新写入。  使用 NVS 驱动程序意味着自己管理此过程。

    但是、我们通常建议使用  osal_SNV  包装器 来执行此操作。  OSA_SNV  包装了 NV 函数(NVINTF、NVS 和 NVOCMP)、以简化对非易失性存储器的写入:

    NVINTF:

    NVINTF 是一个抽象层、它定义了一组通用的 API、用于使用 ID 系统与非易失性存储器进行交互。 这组通用的 API 允许在不更改堆栈和应用程序中的 API 调用的情况下实现新的 NV 存储方法。 ID 系统效率最高、因为它将存储的数据与其闪存中的地址进行解耦。 这是必要的、因为闪存存储体必须在再次写入之前擦除整个扇区(清除一个位除外)。 使用 ID 系统、当需要更新 NV 商品时、只需将其失效并重新存储在不同的地址即可。 NV 系统装满未使用的项目后、将发生压实。 压实是删除未使用的项目。

    对于在 NV 存储中添加或更新的每个 NV 项、该项都会写入活动闪存页面中的下一个最低可用存储器地址。 如果要更新 NV 商品、旧的 NV 商品将被标记为"未激活"。 当发生内存压缩时、不活动项目将从内存中删除。

    我建议阅读我在上面提供的全部文档。 请注意、频繁写入非易失性存储器区域将导致闪存磨损和其他 限制、尽管  osal_SNV  将导致擦除更少、但在发生压缩时可能会产生更多延迟(删除上面文档中介绍的非活动项)。

    此致、

    Nima Behmanesh