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.

[参考译文] CC3135MOD:当更改为 Role_AP、然后更改为 Role_STA、再返回到 Role_AP 时、模块砖型

Guru**** 649970 points
Other Parts Discussed in Thread: CC3135MOD, MSP432E401Y, UNIFLASH
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1130788/cc3135mod-module-bricks-when-changing-to-role_ap-then-role_sta-then-back-to-role_ap

器件型号:CC3135MOD
主题中讨论的其他器件: MSP432E401YUNIFLASH

硬件:MSP432E401Y (时钟120MHz)+定制 PCB 上的 CC3135MOD

软件: CCSv12 + TI-RTOS + Simplelink WiFi 插件 v4.20

编译器版本:TIv20.2.6.LTS

 

当我更改 SL_WlanSetMode (Role_AP)-> SL_WlanSetMode (Role_STA)->然后返回-> SL_WlanSetMode (Role_AP)时、CC3135MOD 停止响应。

sl_Start (0、0、0);长时间挂起、然后最终每次返回 SL_API_ABLETED (-2005)。 即使在 nRESET 或下电上电后也是如此。

恢复的唯一方法是使用 UNIFLASH 对映像进行重新编程。

我的应用程序需要进入 AP 模式、以便从器件托管本地网页、以便用户更改网页上的设置。 然后、在应用程序中的其他时间、它需要进入站点模式。 但是、当它尝试返回到 AP 模式时、模块就会变砖。

Simplelink 网络处理器文档(SWRU455L)说明每次更改角色时都要重新启动模块。 请查看以下代码并帮助我确定问题所在。

此时我需要进入 AP 模式:


pthread_t     HTTP_Wifi_Thread = (pthread_t)NULL;

        pthread_attr_init(&WiFi.pAttrs_spawn);
        priParam.sched_priority = PRIORITY_TOP;
        ret = pthread_attr_setschedparam (&WiFi.pAttrs_spawn, &priParam );
        ret |= pthread_attr_setstacksize (&WiFi.pAttrs_spawn, 0x2000 );
        ret = pthread_create (&HTTP_Wifi_Thread,  &WiFi.pAttrs_spawn,  sl_Task,  NULL );


        Printn("        === Starting Access Point ===");
        ret = sl_Stop(50);
        ret = sl_Start(0, 0, 0);
        Printn("sl_Start: %i", ret);
        
        ret = sl_WlanSetMode(ROLE_AP);  /* Set the Device Mode */
        
        ret = sl_Stop(SL_STOP_TIMEOUT);
        Printn("sl_Stop: %i", ret);
        Task_sleep(200)

        ret = sl_Start(0, 0, 0);
        if( ret >= 0 )
        {
            // TODO: Load this from settings
            // Configure AP Settings
            Printn("Configuring the Access Point");
            WifiApConf_t    wifiConf;

            NVM_Get_AP_Name_Password_from_NVM_DriverLib();
            NVM_Get_APN_and_Server_Address_From_NVM_DriverLib();

            strcpy((char*) wifiConf.ssid,       Management.Device_Name );
            strcpy((char*) wifiConf.password,   Management.Device_Password );

            wifiConf.security            = SL_WLAN_SEC_TYPE_WPA_WPA2;
            wifiConf.channel             = 1;
            wifiConf.hidden              = FALSE;
            wifiConf.txPow               = 0;
            wifiConf.staMax              = MAX_CONNECTED_STA;

            wifiConf.ipMode                  = SL_NETCFG_IPV4_AP_ADDR_MODE;
            wifiConf.ipConfig                = SL_NETCFG_ADDR_STATIC;
            wifiConf.ipOpts.Ip               = (_u32)SL_IPV4_VAL(10,0,0,1);
            wifiConf.ipOpts.IpMask           = (_u32)SL_IPV4_VAL(255,255,255,0);
            wifiConf.ipOpts.IpGateway        = (_u32)SL_IPV4_VAL(10,0,0,1);
            wifiConf.ipOpts.IpDnsServer      = (_u32)SL_IPV4_VAL(10,0,0,1);

            wifiConf.dhcpServer                  = TRUE;
            wifiConf.dhcpOpts.lease_time         = 86400;
            wifiConf.dhcpOpts.ipv4_addr_start    = (_u32)SL_IPV4_VAL(10,0,0,3);
            wifiConf.dhcpOpts.ipv4_addr_last     = (_u32)SL_IPV4_VAL(10,0,0,253);

            /* Configure IPv4 */
            ret = sl_NetCfgSet(SL_NETCFG_IPV4_AP_ADDR_MODE,
                               SL_NETCFG_ADDR_STATIC,
                               sizeof(SlNetCfgIpV4Args_t),
                               (_u8*)&wifiConf.ipOpts);
            Printn("SL_NETCFGSET: %i", ret);

            /* set SSID name */
            ret = sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_SSID,
                           strlen((const char*)(wifiConf.ssid)),
                           (unsigned char*)(wifiConf.ssid));
            Printn("SL_SSIDNAME: %i", ret);

            /* Set security type */
            Printn("SL_SECURITY: %i", ret);
            ret = sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_SECURITY_TYPE, 1,
                           (unsigned char*)(&wifiConf.security));

            /* Set password */
            Printn("SL_PASSWORD: %i", ret);
            ret = sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_PASSWORD,
                             strlen((const char*) wifiConf.password),
                             (unsigned char*)(wifiConf.password));

            /* Set hidden status */
            Printn("SL_HIDDEN: %i", ret);
            ret = sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_HIDDEN_SSID,
                             sizeof(wifiConf.hidden),
                             (unsigned char *)(&wifiConf.hidden));

            /* Set TX power */
            Printn("SL_TX_POWER: %i", ret);
            ret = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID,
                           SL_WLAN_GENERAL_PARAM_OPT_AP_TX_POWER, 1,
                           (unsigned char*)(&wifiConf.txPow));

            /* Restart the NWP for changes to take effect */
            ret = sl_Stop(SL_STOP_TIMEOUT);
            Printn("SL_STOP: %i", ret);
            Task_sleep(200);
            ret = sl_Start(0, 0, 0);
            if (ret != ROLE_AP)
            {
                Print_DeBug("\r\n[%i] Unable to start device in AP mode", ret);
            }
            else
            {
                //nw_StartHttpServer();

                /* DHCP Server Configuration */
                if ( (wifiConf.dhcpServer) && (ret == ROLE_AP) )
                {
                    sl_NetAppStop(SL_NETAPP_DHCP_SERVER_ID | SL_NETAPP_DNS_SERVER_ID | SL_NETAPP_HTTP_SERVER_ID);
                    ret = sl_NetAppSet(SL_NETAPP_DHCP_SERVER_ID,
                                       SL_NETAPP_DHCP_SRV_BASIC_OPT,
                                       sizeof(SlNetAppDhcpServerBasicOpt_t),
                                       (_u8*)&wifiConf.dhcpOpts);

                    ret = sl_NetAppStart(SL_NETAPP_DHCP_SERVER_ID | SL_NETAPP_DNS_SERVER_ID | SL_NETAPP_HTTP_SERVER_ID);

                }
                uint8_t *gateIp, *ipAddr;
                gateIp = (uint8_t*)&wifiConf.ipOpts.IpGateway;
                ipAddr = (uint8_t*)&wifiConf.ipOpts.Ip;

                Printn("Network AP Setup Complete!");
                Printn("Ip Address : %d.%d.%d.%d", ipAddr[3], ipAddr[2], ipAddr[1], ipAddr[0]);
                Printn("Gateway    : %d.%d.%d.%d", gateIp[3], gateIp[2], gateIp[1], gateIp[0]);

                /***************************************
                *  WAIT FOR WEBPAGE TO BE FINISHED     *
                ***************************************/
                while( WiFi.End_Thread_flg == 0 )
                {
                    // Check if WebServer requested custom API routes
                    if (API_Flags) {
                        if (API_Flags & API_GET_ACCESS_POINTS) {
                            getAccessPoints(API_Handle[0]);
                            API_Flags &= ~(API_GET_ACCESS_POINTS);
                        }

                        if (API_Flags & API_RECV_ACCESS_POINTS) {
                            recvAccessPoints(API_Handle[1]);
                            API_Flags &= ~(API_RECV_ACCESS_POINTS);
                        }
                    }

                    Task_sleep(500);
                }

                nw_StopHttpServer();

                Print_DeBug( "\r\nGOAL COMPLETE: WiFi Webpage.\r\n\r\n" );
            }

        }


        /***************************************
        *  SHUTDOWN WIFI MODULE                *
        ***************************************/
        Task_sleep(100);
        sl_Stop(SL_STOP_TIMEOUT);
        Task_sleep(100);


        /***************************************
        *  DELETE WiFi DRIVER TASK             *
        ***************************************/
        pthread_cancel( HTTP_Wifi_Thread );

此时我需要进入站点模式:

    GPIO_write( CC3135_nHIB,    1 );
    Task_sleep(50);
    
    pthread_attr_init ( &WiFi.pAttrs_spawn );
    priParam.sched_priority = PRIORITY_TOP;
    Result = pthread_attr_setschedparam ( &WiFi.pAttrs_spawn, &priParam );
    Result |= pthread_attr_setstacksize ( &WiFi.pAttrs_spawn, 0x2000 );                               WiFi.Heatbeat_ctr++;
    Result = pthread_create ( &WiFi_Driver_thread,  &WiFi.pAttrs_spawn,  sl_Task,  NULL );
    
    sl_Stop(200);
    Task_sleep(100);
    sl_Start(0, 0, 0);
    Result = sl_WlanPolicySet( SL_WLAN_POLICY_CONNECTION, SL_WLAN_CONNECTION_POLICY(0,0,0,0), NULL, 0);
    if( Result != 0 )
        Print_DeBug("ERROR - Connection Policy Failed.\n");
    sl_WlanDisconnect();
    sl_WlanSetMode(ROLE_STA);
    sl_Stop(200);
    Task_sleep(100);
    
    sl_Start(0, 0, 0);
    if( 0 == WiFi_Setup_Raw_Socket  (  0,  10000,   0,  1 ) )
    {
        // Receive some dummy data
        sl_Recv( WiFi.sockHandle,  &Rx_Buff,  10,  0 );
        Task_sleep(100);
        // Close Socket
        sl_Close( WiFi.sockHandle );
    }
    sl_Stop(50);     
    pthread_cancel( WiFi_Driver_thread );

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

    您是否在 simplelink_sdk_wifi 插件_4_20_00_10中测试了 NetworkTerminal 示例?

    应用程序以工作站模式启动。 然后、您可以使用命令行进入 AP 模式、当您停止 AP 模式时、它将返回基站。

    请验证这是否适合您、然后比较代码。

    请注意、AP 参数一致性只能设置一次(不能在每次输入 AP 时设置一次)。  

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

    我在燃烧了好几个小时之后才想到了。 它是以下代码行。

    结果= sl_WlanSet (sl_WLAN_CFG_General_Param_ID、sl_WLAN_General_Param_opt_country_code、2、"00");

    "00"应该是"US"。

    出于某种原因、上述代码行会产生灾难性的后果。  

    此问题可以解决。