主题中讨论的其他器件: MSP432E401Y、 UNIFLASH
硬件: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 );