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:OSAL_SNV_WRITE ()失败?

Guru**** 2587365 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/597220/cc2640r2f-osal_snv_write-fail

器件型号:CC2640R2F

您好!

  我正在尝试使用 osal_SNV_write()写入标签名称,但未成功。 请参阅下面的。 我的 SNVID_TAG_NAME 为0x8A。 什么可能导致 osal_SNV_write()故障? 我的另一篇文章 https://e2e.ti.com/support/wireless_connectivity/bluetooth_low_energy/f/538/t/597088的情况是否相同,我是否需要发布和事件来唤醒应用程序才能使 osal_SNV_write()正常工作?

    

-克尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否在"BLE Stack 的"属性的预定义符号"中定义了 OSAL_SNV=1?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="YIKai Chen "]您是否在 BLE Stack 的"属性的预定义符号"中定义了 OSAL_SNV=1?

    是的。

    我的程序进入"测试模式"。 在"测试模式"下、未初始化 BLE 配置文件。 要执行写入标签名称、我在 Tera Term 中键入"tawr tagname"、然后按 Enter。 在"测试模式"的初始化阶段、我能够成功地在这个 C 函数中执行 osal_SNV_read ()。 我假设 osal_sv_write()也将在该阶段工作。  

    void Config__ReadNV (字节 nvID、字节 len、byte_data、byte* defData)
    {
    uint8_t status = 1;
    
    status = osal_SNV_read (nvID、len、data);
    如果(status =NV_OPER_FAILED)
    {
    while (1);
    }
    否则 if (status!=成功)
    {
    memcpy (data、defData、len);
    状态= osal_SNV_write (nvID、len、data);
    }
    其他
    {
    //成功
    }
    返回;
    } 

    在"测试模式"初始化之后、osal_SNV_read ()和 osal_SNV_write ()都不起作用。 键入 "tawr tagname"后、程序将转到下面的 C 函数。

    void Config_WriteTagID (byte* data)
    {
    uint8_t status;
    
    状态= osal_SNV_write (SNVID_TAG_NAME、XX_TAG_ID_LEN、DATA);
    if (status!=成功)
    {
    while (1);
    }
    
    }
    
    void TestApp_WriteTagID (byte* msg)
    {
    /*确保 msg 的有效长度不大于12 */
    if (strlen (msg)<= XX_TAG_ID_LEN)
    {
    CONFIG_WriteTagID ((BYTE*)&msg[0]);
    UartApp_WriteString ("写入标签 ID OK\r\n");
    }
    其他
    {
    UartApp_WriteString ("INV TAGID LEN\r\n");
    }
    
    返回;
    } 

    我认为,在我所分享的后接关系中,情况是一样的。 程序进入"待机模式"或"空闲模式"、影响 osal_SNV_read ()和 osal_SNV_write ()操作。

    -克尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可以在 simple_peripheral 应用中使用 osal_SNV_write/osal_SNV_read 而不会出现任何问题、但我在"测试模式"下没有使用体验。 如果您不在测试模式下使用 osal_SNV_write、它是否起作用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Yikai、

       我尝试了 CC2640R2 SDK 文档中的 osal_SNV_read ()和 osal_SNV_write ()示例代码、该代码在简单外设中工作。  

    静态空 SimpleBLEPeripheral_taskFxn (UARg a0、UARg A1)
    {
    //初始化应用
    SimpleBLEPeripheral_init ();
    
    #ifdef SNV_test
    
    uint8 status =成功;
    
    状态= osal_SNV_read (SNV_ID_APP、BUF_LEN、(uint8 *) buf);
    if (status!=成功)
    {
    Display_Print1 (dispHandle、0、0、"SNV 读取失败:%d"、状态);
    //首次写入以初始化 SNV ID
    OSAL_SNV_WRITE (SNV_ID_APP、BUF_LEN、(uint8 *) buf);
    }
    
    //递增数组的第一个元素并写入 SNV 闪存
    buf[0]++;
    状态= osal_SNV_write (SNV_ID_APP、BUF_LEN、(uint8 *) buf);
    if (status!=成功)
    {
    Display_Print1 (dispHandle、0、0、"SNV 写入失败:%d、状态);
    }
    其他
    {
    Display_Print1 (dispHandle、0、0、"Num of Resets:%d"、buf[0]);
    }
    
    #endif 

    -克尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我怀疑这与 UART 代码有关。 是否可以禁用 UART 并再次测试。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Yikai、

    我将禁用 UART 并查看会发生什么情况。

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

    您好、Yikai、

      此时在测试模式下禁用 UART 时遇到了一些其他问题。 但是、我已经确认了 osal_SNV_write()和 osal_SNV_write()无法正常工作的原因、这是因为主应用程序进入待机模式。 我在 Event_pend 后测试了 osal_SNV_write ()和 osal_SNV_read ()调用。 osal_sv_write()和 osal_sv_read()传送3倍。 但在第4次没有更多事件、它会进入待机模式。

    对于(;;)
    {
    uint32_t 事件;
    
    //等待与调用线程关联的事件被发布。
    //请注意,与线程关联的事件在时发布
    //消息在线程的消息接收队列中排队
    事件= Event_pend (syncEvent、Event_ID_none、SBP_All_Events、
    iCall_TIMEOUT_FOREVER);
    
    IF (事件)
    { 

    我所做的解决方案是发布队列消息以唤醒主应用程序、然后调用执行 osal_SNV_write ()和 osal_SNV_read ()的 C 函数。 该解决方案在下面的这篇文章中介绍。 但是 、我的解决方案似乎不好。 希望稍后我可以找到一种方法来禁用应用程序进入待机模式、因此我不必排队消息即可唤醒主应用程序。

    -克尔