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