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.

CC2640R2F NV 操作的问题

Other Parts Discussed in Thread: CC2640R2F

HI TI JRs:

     CC2640R2F  请教 一个关于 NV 读写的问题。

  

     我在 Spec 上看到如下这段:
No prior initialization of a NV item ID is required; the OSAL SNV manager initializes the NV ID when first accessed by a successful osal_snv_write() call.

   

     也就是说:

1. 如果我想往 BLE_NVID_CUST_START 写几个数据,写操作是没有问题;

2. 等到我后续开机时,我再想去读 BLE_NVID_CUST_START 里的数据,我必须先要往 BLE_NVID_CUST_START 里执行写操作,成功写值后才能执行读操作;

请问是吗?

谢谢

  • 不用,之前写过就可以读
  • Hi ViKi:

    我现在的问题是这样的。

    1. 我希望能够修改 advertData 数组里的 Major、Minor 值,不同的 Minor + Major 用来区分是哪个 Beacon 设备;
    2. 我现在认知是没有现成的工具或者方法可以直接修改 Minor + Major 值;
    3. 我自己修改了代码,先编译软件版本,下载这个版本后 Beacon 会一直循环等在 UART 程序里,等着接收到数据后存入到 BLE_NVID_CUST_START 位置处;
    4. Beacon 机器重新下载出货版本,在开机时去读 BLE_NVID_CUST_START 位置的数值,根据数值来重新 advertData 数组里的 Major、Minor 值;


    以上是我的修改逻辑,我的问题是在第 4 步,开机时如果不 先往 BLE_NVID_CUST_START 位置处写数值,就一直读不成功,那这样我该怎么解决呢?

    谢谢
  • Beacon 机器重新下载出货版本,在开机时去读 BLE_NVID_CUST_START 位置的数值,根据数值来重新 advertData 数组里的 Major、Minor 值-------重新下载了那是需要写了才能读
  • Hi ViKi:

    重新下载了那是需要写了才能读 =====》那不就会覆盖之前写的值了吗?

    从我的测试结果来看确实是会覆盖。
  • 写了会覆盖。按照之前帖子里你的描述
    “也就是通过 UART 连接手机,PC 端通过串口工具把值写到 Beacon 设备,Beacon 设备通过 osal_snv_write 函数来写入值,请问是这样吗?

    这样看起来蛮复杂的,因为 Beacon 里需要跑串口监听程序,我现在用的 SDK 版本是 simplelink_cc2640r2_sdk_4_20_00_04,请问这哥版本里有现成的接口函数吗?”

    是程序跑起来以后通过串口把值写进SNV,再读出来。现在看你的描述是程序重新下载一遍,然后去读值。重新下载程序后,flash都改变了
  • Hi ViKi:

    1. “也就是通过 UART 连接手机,PC 端通过串口工具把值写到 Beacon 设备,Beacon 设备通过 osal_snv_write 函数来写入值,请问是这样吗? ====================》 是的;

    2. 我现在用的 SDK 版本是 simplelink_cc2640r2_sdk_4_20_00_04,请问这哥版本里有现成的接口函数吗? =====》 没有,这个接口函数 是我自己写的;

    3. 现在看你的描述是程序重新下载一遍,然后去读值。重新下载程序后,flash都改变了=======》 是的,在重新下载软件后 NV 里的值已经没了;


    这个和我理解的 NV 含义不一样。

    看来我这段时间白忙了。
  • Hi ViKi:

    NV 的作用,应该是只要不擦除,里面的值就一直保存这,否者也不叫 NV 了。

    而我在用 Flash Programmmer 2 下载软件时,Erase 栏里选的是 Pages in Image(字面意思应该是保存 Image 的 page);

    难道这里的 NV 和 Image 区域是在一起的?
  • NV 只能掉电保存,重新烧录程序的话会丢失
  • Hi ViKi:

    可能是我之前关于 NV 的认知和这里的 NV 有差异。







    那现在又回到我的原始问题了:按照协议,Minor 和 Major 值是在 UUID 相同的前提下区分 Beacon 设备的,那就是说每台 Beacon 设备的 Minor 和 Major 值应该是不一样的才行,既然如此,理应有个简单有效的方法给每台 Beacon 设备写入 Minor + Major 了。

    请问你们有什么经验可以分享吗?其它家做 Beacon 设备的厂商用的是什么方法呢?

    谢谢
  • Hi ViKi:

    因为我们的项目需求,这个案子 Beacon 的出货量可能是 KK 级的,如果没有办法能区分 Beacon 设备,那项目需求就满足不了客户了。

    此外,我还想到的是通过 Mac Addr 来区分,不过我们的测试来看,IOS 上没办法获取到 Mac Addr。

    IOS 上获取 Mac Addr 的问题,我刚刚新提了一个 Case:e2echina.ti.com/.../595292
  • 方法其实已经提供过了:
    1、一个一个写,不太符合大批量需求
    2、像Eddystone™ Beacon 一样,有可配置模式,连接主机进行数据更新
    3、本文所说的硬编码方式,即把值写入SNV再进行读取。这个方式因为你要重新烧录程序而无法实现
  • Hi ViKi:

    谢谢~~

    1/3 方法排除,不再讨论了。

    对于方法 2 ,我们内部也讨论过,感觉也不太好,因为:
    1. 可配置模式,应该是 simple_peripheral 模式吧?我们现在用的是 simple_broadcaster 模式;
    2. 我司 HW 实际量测,simple_peripheral 模式的信号强度没有 simple_broadcaster 的好;
    3. 对每台 simple_peripheral 模式的 Beacon 进行手动配置,这样做效率很低,例如在产线那么多 Beacon 设备容易搞混;