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.

[参考译文] CC3235S:从接收模式切换到 WIFI 模式后出现未记录错误-14339

Guru**** 2539500 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1023002/cc3235s-undocumented-error--14339-after-switching-from-transceive-mode-to-wifi-mode

器件型号:CC3235S

在 CC3235上、我们暂时使用接收模式来执行一些测试。 基本流程为:

  1. 引导
  2. 连接到 Wifi
  3. (笑声) 执行一些操作...
  4. 断开与 Wifi 的连接(通过  sl_WlanDisconnect​)
  5. 在 收发模式下执行测试
    1. 调用 sl_Socket 以打开原始套接字
    2. 使用 sl_Send 发送 CW 信号
    3. 使用 sl_Send 停止发送 CW 信号
    4. sl_close 原始套接字
  6. 重新连接至 wifi

有时 、步骤6 (对  sl_WlanConnect 的调用)会失败、并显示未记录的错误代码-14339。  对 sl_WlanConnect 的后续调用可能返回0、但不会完成与 Wifi 的连接:SimpleLinkNetAppEventHandler 永远不会触发。
  有关此错误代码的唯一信息是 Sarah 所说的 e2e.ti.com/.../cc3220sf-3220sf-sl_wlanpolicyset-returns-code--14339

主机驱动程序中当前未记录-14339错误、但这意味着您在收发器模式下无法完成此命令。

 

我已经将我们的实现方案与 Simplelink SDK 示例 radio_tool.c 进行了比较、我很确定我们离开了收发器模式(在大多数情况下、它运行正常)。 但是:radio_tool.h 将 STOP 信号定义为  

#define CW_STOP                    (128) 

但是,文档(SimpleLinkTM Wi-FiRegisteredCC3x20、CC3x3x 网络处理器用户指南、SWRU455M)第13.5章规定:

CW 持续传输、直至停止。 通过触发另一个标志=–128 (十进制)的 sl_Send API 来停止 CW 传输。

我的问题是:

  1. 哪一个是停止 CW 信号的正确值? 128还是-128? 我已经尝试了这两种方法、没有任何区别。
  2. 我们如何首先防止-14339错误?

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

    您好 Johann、

    您可以在无线电工具中使用定义、因为这已经过测试。 sl_close 实际上是结束收发器模式的原因。

    您使用的是哪种主机驱动程序/SDK 版本和服务包版本?

    此致、

    Sarah

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

    您好、Sarah、

    我们将 SimpleLink SDK 5.10.00.02与 MAC 31.3.7.0.1、PHY 3.1.0.26、NWP 4.10.0.1、ROM 8738、主机3.0.1.71搭配使用。

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

    此问题也会在 Launchpad 上发生、甚至更频繁。

    下面是一些简化的测试代码:

    static bool disconnect_from_wifi(void) {
        sem_wait(&network_connected);
    
        UART_PRINT("Disconnecting from Wifi\n");
        int ret = sl_WlanDisconnect();
        if (ret != 0 && ret != SL_ERROR_WLAN_WIFI_ALREADY_DISCONNECTED) {
            UART_PRINT("sl_WlanDisconnect failed: %d", ret);
            return false;
        }
    
        return true;
    }
    
    static bool connect_to_wifi(void) {
    
        SlWlanSecParams_t secParams = {0};
        secParams.Key = (signed char*)SECURITY_KEY;
        secParams.KeyLen = strlen(SECURITY_KEY);
        secParams.Type = SECURITY_TYPE;
    
        UART_PRINT("Connecting to Wifi\n");
        short retval = sl_WlanConnect((signed char *) SSID_NAME, strlen(SSID_NAME), 0, &secParams, 0);
    
        if (retval == 0) {
            return true;
        }
    
        if (retval == -14339) {
            UART_PRINT("sl_WlanConnect failed with %d. Retrying\n", retval);
            usleep(500000);
            // This recovers the issue *sometimes*. Other times, while it returns 0, the
            // SimpleLinkNetAppEventHandler will never be called with the SL_NETAPP_EVENT_*_ACQUIRED.
            retval = sl_WlanConnect((signed char *) SSID_NAME, strlen(SSID_NAME), 0, &secParams, 0);
            return retval == 0;
        }
    
        UART_PRINT("sl_WlanConnect failed with %d\n", retval);
        return false;
    }
    
    static void cw(void) {
        short socket = sl_Socket(SL_AF_RF, SL_SOCK_RAW, 6);
    
        if(socket < 0) {
            UART_PRINT("Error creating raw socket: %d\n", socket);
            return;
        }
        UART_PRINT("raw socket: %d, sending CW\n", socket);
    
        long send_result = sl_Send(socket, NULL, 0, 0);
        if (send_result < 0) {
            UART_PRINT("sl_Send returned %ld\n", send_result);
            return;
        }
    
        sleep(3);
    
        UART_PRINT("Sending CW STOP\n", socket);
        send_result = sl_Send(socket, NULL, 0, 128);
        if (send_result < 0) {
            UART_PRINT("Failed to send CW_STOP: %ld\n", send_result);
            sl_Close(socket);
            return;
        }
    
        short close_result = sl_Close(socket);
        if (close_result != 0) {
            UART_PRINT("Failed to close socket: %d\n", close_result);
        }
    }
    
    
    void test_error14339(void) {
        sem_init(&network_connected, 0, 0);
    
        connect_to_wifi();
        wait_for_network();
    
        while (1) {
            if (!disconnect_from_wifi()) {
                UART_PRINT("Failed to disconnect from wifi");
                while (1) {}
            }
    
            cw();
    
            if (connect_to_wifi()) {
                wait_for_network();
            } else {
                UART_PRINT("Failed to connect to wifi");
                while (1) {}
            }
        }
    }

    注意:我匆忙移植了信标相关代码、因此可能不是100%正确。 但总体结构应明确。

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

    您好 Johann、

    您能否在 LaunchPad 设置上收集 NWP 日志? NWP 编程人员指南的调试部分中提供了相关说明

    此致、

    Sarah

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

    您好、Sarah、

    遗憾的是、这对于我们的定制板来说并不容易。
    同时、我们与 Roger 联系:

    我可以重现此问题,但这可能是由于套接字的异步关闭导致的,这意味着即使 sl_close()已返回应用程序,收发器模式也没有真正停止。

     

    sl_close()之后的睡眠对我来说似乎是可以的,但我欣赏这不是一个非常优雅的解决方案。  另一种选择、也不是理想的、但我认为更好的选择是再次调用 sl_close (socket)、直到它返回-1。

     

    即 ret = sl_close()

          if (ret = error)-> handle error。

          执行{

              RET = sl_close ()

          } while (ret =0);//或专门检查-1

     

    最终关闭将返回-1、 并且收发器模式应完全终止。

    虽然这不是一个好的解决方案、但它现在必须有效。

    感谢您的支持。