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.

[参考译文] CC2650:Project Zero osal_SNV_write/read 和 bcomdef.h

Guru**** 2562120 points
Other Parts Discussed in Thread: CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/569099/cc2650-project-zero-osal_snv_write-read-and-bcomdef-h

器件型号:CC2650

我在  TI 云 IDE 的 CC2650 Project Zero 中使用 osal_SNV_write 和 osal_SNV_read。

我在尝试写入大量数据时遇到了一些问题:

默认 BLE_NVID_CUST_START 和 BLE_NVID_CUST_END 似乎为0x80和0x8F。 这意味着当我需要使用超过16字节的存储时、我需要更改这些值。 但是、我在 projectZero 文件中找不到 bcomdef.h。 此外、云 IDE 中 Project Zero 中包含的头文件似乎是 Internet 上的某个位置、我无法修改它们。 有人能告诉我如何查找 bcomdef.h 并更改这些值吗?

2.当我使用这些默认的16字节进行测试时,当我写入/读取1字节时,写入/读取总是成功。 当我尝试一次读取/写入8个字节时、它通常会失败。 我发现"在向 SNV 读取或写入大量数据时、TI 建议将读取/写入数据放置在静态(链接器)分配的数组或堆分配的缓冲区中。 将大量数据放置在本地数组中可能会导致任务堆栈溢出"、位于 swru393d.pdf。 但我认为8个字节不是那么大。 有什么建议吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BLE_NVID_CUST_START 和 BLE_NVID_CUST_END 表示为应用程序使用保留的 NV ID、不表示应用程序可以使用的字节。 实际上、可以写入/读取的最大字节为256。
    2您能向我展示您是如何读取/写入 NV 的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yikai、感谢您的回复。

    1。

    这是否意味着我可以在不更改这些值的情况下使用超过16个字节?

    我使用了一个字节来存储光的状态。 如果我将其设置为0x80、它可以在重启后恢复状态。 而如果我存储到0x92、则无法执行该操作。

    2.  

    #define STORE_ADDR 0x80
    #include "osal_SNV.h"

    起初、我使用的是
      OSAL_SNV_WRITE (STORE_ADDR + 5、12、Received_string);
    进行写入。

    重启后、在 ProjectZero_init 函数中
       字符 c;
       OSAL_SNV_read (STORE_ADDR + 5 + 8、1、&c);
       if (c!=(char) 0xFF){
         char temp[20];
         OSAL_SNV_read (STORE_ADDR + 5、12、temp);
         log_info1 ("读取结果:%s \n"、
                   (IArg)(uint8_t*) temp);
         PIN_setOutputValue (ledPinHandle、Board_LED1、1);
       }

    但是、它不起作用。 重新启动后指示灯无法亮起。

    稍后、我一次写入一个字节。
       int k;
       对于(k = 8;k < 12;k = k + 1){
         OSAL_SNV_WRITE (STORE_ADDR + 5 + k、1、Received_string + k);
       }
       对于(k = 0;k < 8;k = k + 1){
         OSAL_SNV_WRITE (STORE_ADDR + 5 + k、1、Received_string + k);
       }

    现在重新引导后指示灯可以亮起、但日志信息不正确。
    哎呀、我发现在我将读取更改为循环时有一些错误。
    我将在星期二纠正它并尝试、并告诉您结果。
    (因为我只能在周二和周四使用电路板。)

    哦、我发现我在开始时使用的字节超过16个。 我还将尝试在默认的16个字节内进行读取/写入、并更新结果。

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

    如果您在应用中使用以下代码、您是否可以看到 TxBuf 被完全读出为 RxBuf 的内容?

    UINT8 RxBuf[16];
    UINT8 TxBuf[16];

    RxBuf[0]=0x12;
    RxBuf[1]=0x34;
    RxBuf[2]= 0x56;
    RxBuf[3]=0x12;
    RxBuf[4]=0x34;
    RxBuf[5]= 0x56;
    OSAL_SNV_WRITE (0x81、6、RxBuf);
    OSAL_SNV_READ (0x81、6、TxBuf);

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

    对于如何使用超过16个字节、是否有任何建议?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以扩展缓冲区大小并像以下伪代码那样填充要读取或写入的长度

    uint8 RxBuf[32];
    UINT8 TxBuf[32];

    RxBuf[0]=0x12;
    RxBuf[1]=0x34;
    RxBuf[2]= 0x56;
    RxBuf[3]=0x12;
    RxBuf[4]=0x34;
    RxBuf[5]= 0x56;
    (笑声)
    RxBuf[31]=0x78;

    OSAL_SNV_WRITE (0x81、32、RxBuf);
    OSAL_SNV_READ (0x81、32、TxBuf);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是说我不需要担心 BLE_NVID_CUST_START 和 BLE_NVID_CUST_END?
    好的、我将在周二尝试、并在此处更新结果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、您无需担心 BLE_NVID_CUST_START 和 BLE_NVID_CUST_END。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我今天试过。 对于0x80-0x8F、osal_SNV_read 和 write 正常。  

    如果我将起始地址更改为0x90、则不会成功、返回状态为0x02。 (如果更改为0x80、则再次正常工作)

    我正在为 CC2650开发示例项目(Project Zero)。

     是否有可能其它设备已经使用了0x9*上的内容?

    我还尝试将起始地址设置为0xA0。 返回状态为0x02时失败。 此外、即使我将起始地址改回0x80、它也会在0x02时失败。 它返回正常状态、直到我将 ProjectZeroStack 重新加载到电路板。

    这里还有一些其他奇怪的东西。



    #define STORE_ADDR 0x80
    
    uint8 SNV_STATUS;
    char temp[20];
    SNV_STATUS = osal_SNV_read (STORE_addr + 5、11、temp);
    TEMP[11]='\0';
    log_info1 ("读取温度11字节状态:%c"、
    (IArg) SNV_STATUS +"0");
    
    char c = 0xFF;
    SNV_STATUS = osal_SNV_read (STORE_addr + 5 + 4、1、&c);
    log_info1 ("读取 c 状态:%c"、
    (IArg)(SNV_STATUS +'0');
    C = temp[4];
    log_info1 ("cccccc:%c \n"、
    (IArg)(char) c);
    
    if (c!=(char) 0xFF){
    //根据已读取
    的内容进行初始化} 

    LOG_INFO 都表示读取状态为0。 但是、如果我删除 c 行= temp[4]、c 为0xFF。

    另一件奇怪的事情是、如果我删除 osal_SNV_read 11个字节以进行温度处理的行、UART 日志将不起作用。  

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、您只能使用0x80至0x8F 范围内的 NV ID。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我应该怎么做才能将更多字节存储到闪存?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以在每个 NV ID 中存储256个字节。 还不够吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哦、我明白了。 0x80是一个地址为256字节的 ID、而不是一个字节的地址。 我误解了它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、就是这样。