使用带有 PIC32 的 WINC1500,扫描无法正常工作
Using WINC1500 with a PIC32, scan not working properly
我目前正在开发一个使用 PIC32 和 wifi 模块 ATWINC1500 的项目。我无法提供所有代码,但我正在使用可以共享的测试功能。
首先,这是我正在使用的一些设置和配置:
- 处理器:PIC32MZ1024EFE064
- IDE:MPLAB IDE5.45
- 和谐版本:2.06
- Wifi 模块:ATWINC1500
- 实时OS:FreeRTOS
我想做的是使用基础设施模式将 Wifi 模块连接到现有的接入点。我能够获取周围接入点的数量,但是当我尝试从这些接入点读取信息时,信息是空的、无效的或不正确的。
这是我的代码:
bool WIFI_Test_Infrastructure(void)
{
//Example: https://www.microchip.com/forums/m906568.aspx
//Wait for WINC1500 to be initialized
if(isWdrvExtReady() == false)
return false;
//Start a scan or wait for result
IWPRIV_PARAM_SCAN scanner;
IWPRIV_GET_PARAM param_scan = {
.scan = scanner
};
iwpriv_get(SCANSTATUS_GET, ¶m_scan);
IWPRIV_SCAN_STATUS status = param_scan.scan.scanStatus;
IWPRIV_EXECUTE_PARAM dummy_param;
//Process StateMachine while scanning
if(status == IWPRIV_SCAN_IDLE)
{
vTaskDelay(1000 / portTICK_PERIOD_MS);
//Disconnect wifi from everything
WDRV_Disconnect();
vTaskDelay(1000 / portTICK_PERIOD_MS);
while(WDRV_ConnectionState_Get() != WDRV_CONNECTION_STATE_NOT_CONNECTED)
vTaskDelay(10 / portTICK_PERIOD_MS);
vTaskDelay(1000 / portTICK_PERIOD_MS);
WDRV_EXT_CmdScanStart();
return false;
}
else if(status == IWPRIV_SCAN_IN_PROGRESS)
{
return false;
}
else if(status == IWPRIV_SCAN_NO_AP_FOUND)
{
iwpriv_execute(SCAN_START, &dummy_param);
return false;
}
else if(status == IWPRIV_SCAN_SUCCESSFUL)
{
vTaskDelay(1000 / portTICK_PERIOD_MS);
//Read liste of wifi access point
uint16_t wifi_number_AP;
wifi_number_AP = m2m_wifi_get_num_ap_found();
WDRV_SCAN_RESULT scanResult;
tstrM2mWifiscanResult result;
int i;
for(i=0; i<wifi_number_AP; i++)
{
m2m_wifi_req_scan_result(i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
winc1500_scan_result_read(&result); //ISSUE HAPPENED HERE
vTaskDelay(1000 / portTICK_PERIOD_MS);
memcpy((void *)scanResult.bssid, (void *)result.au8BSSID, sizeof(scanResult.bssid));
}
//SUCCESS
return true;
}
else
{
return false;
}
}
所以这里发生了什么:
- 首先,您需要知道此函数是由线程管理器调用的,这就是为什么它 returns 为假或为真。我正在检查扫描的状态。
- 我可以到达 SCAN_SUCCESSFUL 部分并且检测到的接入点数量是正确的。
- 我标记了发生问题的行。当我读取访问点的结果信息时,它是空的。这是我在调试会话中看到的(所有访问点的结果都相同):
我已经等了几个星期才问这个问题。希望有人可以提供帮助,或者至少给我一些提示,让我检查一下。
如果我遗漏了信息,请随时问我。
提前致谢!
阿德里安
解决方案只是一个堆栈的故事。我还有另外两个任务:SYS 和 TCP/IP。我需要增加他们堆栈的大小,因为他们正在管理几个关于扫描的功能。所以某处有一个压倒一切的东西。
我目前正在开发一个使用 PIC32 和 wifi 模块 ATWINC1500 的项目。我无法提供所有代码,但我正在使用可以共享的测试功能。 首先,这是我正在使用的一些设置和配置:
- 处理器:PIC32MZ1024EFE064
- IDE:MPLAB IDE5.45
- 和谐版本:2.06
- Wifi 模块:ATWINC1500
- 实时OS:FreeRTOS
我想做的是使用基础设施模式将 Wifi 模块连接到现有的接入点。我能够获取周围接入点的数量,但是当我尝试从这些接入点读取信息时,信息是空的、无效的或不正确的。 这是我的代码:
bool WIFI_Test_Infrastructure(void)
{
//Example: https://www.microchip.com/forums/m906568.aspx
//Wait for WINC1500 to be initialized
if(isWdrvExtReady() == false)
return false;
//Start a scan or wait for result
IWPRIV_PARAM_SCAN scanner;
IWPRIV_GET_PARAM param_scan = {
.scan = scanner
};
iwpriv_get(SCANSTATUS_GET, ¶m_scan);
IWPRIV_SCAN_STATUS status = param_scan.scan.scanStatus;
IWPRIV_EXECUTE_PARAM dummy_param;
//Process StateMachine while scanning
if(status == IWPRIV_SCAN_IDLE)
{
vTaskDelay(1000 / portTICK_PERIOD_MS);
//Disconnect wifi from everything
WDRV_Disconnect();
vTaskDelay(1000 / portTICK_PERIOD_MS);
while(WDRV_ConnectionState_Get() != WDRV_CONNECTION_STATE_NOT_CONNECTED)
vTaskDelay(10 / portTICK_PERIOD_MS);
vTaskDelay(1000 / portTICK_PERIOD_MS);
WDRV_EXT_CmdScanStart();
return false;
}
else if(status == IWPRIV_SCAN_IN_PROGRESS)
{
return false;
}
else if(status == IWPRIV_SCAN_NO_AP_FOUND)
{
iwpriv_execute(SCAN_START, &dummy_param);
return false;
}
else if(status == IWPRIV_SCAN_SUCCESSFUL)
{
vTaskDelay(1000 / portTICK_PERIOD_MS);
//Read liste of wifi access point
uint16_t wifi_number_AP;
wifi_number_AP = m2m_wifi_get_num_ap_found();
WDRV_SCAN_RESULT scanResult;
tstrM2mWifiscanResult result;
int i;
for(i=0; i<wifi_number_AP; i++)
{
m2m_wifi_req_scan_result(i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
winc1500_scan_result_read(&result); //ISSUE HAPPENED HERE
vTaskDelay(1000 / portTICK_PERIOD_MS);
memcpy((void *)scanResult.bssid, (void *)result.au8BSSID, sizeof(scanResult.bssid));
}
//SUCCESS
return true;
}
else
{
return false;
}
}
所以这里发生了什么:
- 首先,您需要知道此函数是由线程管理器调用的,这就是为什么它 returns 为假或为真。我正在检查扫描的状态。
- 我可以到达 SCAN_SUCCESSFUL 部分并且检测到的接入点数量是正确的。
- 我标记了发生问题的行。当我读取访问点的结果信息时,它是空的。这是我在调试会话中看到的(所有访问点的结果都相同):
我已经等了几个星期才问这个问题。希望有人可以提供帮助,或者至少给我一些提示,让我检查一下。 如果我遗漏了信息,请随时问我。
提前致谢!
阿德里安
解决方案只是一个堆栈的故事。我还有另外两个任务:SYS 和 TCP/IP。我需要增加他们堆栈的大小,因为他们正在管理几个关于扫描的功能。所以某处有一个压倒一切的东西。