您好!
我正在尝试使用 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()正常工作?
-克尔
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.
您好!
我正在尝试使用 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()正常工作?
-克尔
[引用 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 ()操作。
-克尔
您好、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
-克尔
您好、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 函数。 该解决方案在下面的这篇文章中介绍。 但是 、我的解决方案似乎不好。 希望稍后我可以找到一种方法来禁用应用程序进入待机模式、因此我不必排队消息即可唤醒主应用程序。
-克尔