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.

[参考译文] CC3351:无线电功能(扫描/连接)don't 向主机发送事件

Guru**** 2553450 points
Other Parts Discussed in Thread: CC3351, BP-CC3351, SIMPLELINK-WIFI-TOOLBOX

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1565622/cc3351-radio-function-scan-connect-don-t-send-event-to-host

器件型号:CC3351


工具/软件:

您好:

我使用 BP-CC3351 电路板的 CC3351 和 MCU SDK R7.2。  

在使用 Wlan_Start 函数的引导序列之后、CC3351 已启动并运行。 但是、当请求需要使用无线电的操作(例如 Wlan_Scan) 时)时、主机 MCU 不会接收到任何事件。

以下是配置:

固件版本:1.7.7.310
PHY 版本:1.2.0.45.6.2.36.69

在 CC3351 初始化期间、我配置了以下各项:

-电源管理到  power_management_always_active_mode

- MAC 地址

-使用 Wlan_Role Up (STA) 函数的 国家/地区 代码“EU"</s>“

我已在这篇文章中附加了 CC3351 的相关日志、包括整个引导序列+ Wlan_Scan 请求。

谢谢。此致、  

e2e.ti.com/.../4578.stream.csv

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

    尊敬的 Gaetan:

    我看到的第一个错误是 FW 报告 WiFi6 已禁用。 您是否对 conf 进行了任何修改?  

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

    您好:

    当前、我使用 R7.2 中的配置文件、但没有对其进行修改。 我已将该文件附加到此消息(请删除文件名中的.txt 以将其打开,我已将其添加以便能够上载文件)。

    谢谢、

    e2e.ti.com/.../cc33xx_2D00_conf.bin.txt

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

    我已经使用 cc33xxconf 工具将.bin 配置文件转换为.ini。

    在随附的.ini 中、我们可以看到 WIFI6 ENABLE 是从 mac.he_enable = 0x01 启用的

    你有任何其他的暗示吗?

    谢谢、

    e2e.ti.com/.../3010.cc33xx_2D00_conf.txt

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

    您好:

    我进行了一些测试和与在 BeagleBoard 和 Linux 上运行的 BP-CC3351 的比较。 使用 Linux 设置、CC3351 能够启动并执行 WIFI 扫描、而我的 MCU 设置无法做到这一点。

    1) 从 Linux 分析接口初始化

    我已按照本指南 https://dev.ti.com/tirex/explore/content/CC33XX_LINUX_MPU_1_00_00_09__all/docs/linux/html/linux/driver-debug-guide.html 操作、以便在接口初始化期间启用来自 Linux 驱动程序的所有日志(请参阅随附的日志文件)。

    根据这个观察结果、我在接口初始化时在 MCU 侧执行此操作来模拟此序列:

    a) 使用与 Linux 相同的值配置 Mac 地址

    b) 启动 STA 接口、使用 RoleUp 方法并将国家域设置为“00I"</s>“

    c) 将电源管理设置为 POWER_MANUFACTURE_ALWAYS_ACTIVE_MODE、禁用节能模式

    这似乎对结果没有影响。 我仍然在记录器的 CC3351 日志中看到错误、因为 WiFi 6 已禁用

    2) 使用与 Linux 相同的 cc33xxconf.bin 文件

    我已从 Linux 中提取 cc33xxconf.bin、得益于 CC33Conf 工具、我能够将其转换为文本格式、然后转换为 MCU bin 格式。

    对 MCU 配置的更改主要包括:

    a) MIXED_MODE_support 已启用

    b) limit105c_params.enable_value 已禁用

    这对结果没有影响,我仍然不能做 wifi 扫描后,这一改变.

    3) 使用 Linux SDK 提供的 CC3351 固件

    我尝试使用 CC3351 wifi 固件、加载器和 Linux SDK 中的配置。

    该测试的结果是 CC3351 在初始化期间发生固件崩溃。 我想这些固件仅与 Linux SDK 兼容、而与 MCU SDK 不兼容?

    任何提示或提示都将受到欢迎、

    谢谢。此致

    e2e.ti.com/.../cc3351_5F00_interface_5F00_up.txt

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

    您好、Gaetan、

    我注意到的一点是、您的记录器输出中有相当多的日志缺失。 您能否仔细检查一下是否确实在使用 MCU+ SDK 中的 logger.bin 文件? 我们应该看到接收到的所有命令、但缺少许多打印输出。  

    Linux SDK 中的固件和二进制文件将不能转移到 MCU+驱动程序。 两个 SDK 之间的固件非常不同、因此您看到问题是有意义的。

    接下来、您能否介绍固件下载后的初始化流程? 例如、您是否会在固件下载完成后立即发送 wlan_start cmd?

      CtrlCmd Fw_Lock HostDriver()

      RET = ctrlCmdFw_WLSendCommand (WLAN_START&cmdsizeof (WLAN_START_cmd_t)、&complete、sizeof (WLAN_START_COMPLET_t);

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

    您好 Sabeeh,

    感谢您的回答。

    我无法使用 MCU SDK 中的 logger.bin、我打开了一个票证(请参阅 SIMPLELINK-WIFI-TOOLBOX:CC3351 MCU R7.2 崩溃中的 logger)  、因为当我不使用预定义的 logger.bin 时、simplelink 工具箱似乎会崩溃。

    感谢您介绍了使用 Linux SDK 切换固件时所见过的内容。

    以下是我执行的命令序列:

    // Driver initialization
    Wlan_Start
    
    
    // Interface set up
    // Configure MAC address
    Wlan_Set WLAN_SET_MACADDRESS
    
    // Start interface
    Wlan_RoleUp with WLAN_ROLE_STA value and country code "00I" (tried also "US" and "UE")
    
    // Disable power saving
    Wlan_Set WLAN_SET_POWER_MANAGEMENT with POWER_MANAGEMENT_ALWAYS_ACTIVE_MODE mode
    
    

    然后、Wlan_Start 函数负责将固件流式传输到芯片并将其启动。 这是该函数这一部分的代码片段、WLAN_START 在固件更新(由 InitHostDriver 函数执行)后立即设置。

        ret = InitHostDriver();
    
    
        if(ret != 0)
        {
            return ret;
        }
    
        ctrlCmdFw_LockHostDriver();
    
        ret = ctrlCmdFw_WLSendCommand(WLAN_START, &cmd, sizeof(wlan_start_cmd_t),&complete,sizeof(wlan_start_complete_t));
    
        ctrlCmdFw_UnlockHostDriver();

    谢谢、

    Gaetan

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

    获得正确的固件日志将是至关重要的,所以我将帮助调查前面提到的 Ubuntu 日志记录器的票证。

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

    在这段时间内,您是否有机会使用 windows 机器?

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

    您好:  

    我使用带有 Windows 的虚拟机来捕获日志。 我已将包含引导顺序和 WiFi 扫描请求的日志附加到此消息。

    根据我所见、扫描已完成、因为我可以在日志中看到 WiFi SSID。 但我没有在主机端收到结果。

    谢谢、

    Gaetan

    e2e.ti.com/.../1067.stream.csv

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

    尊敬的 Gaetan:

    感谢您收集日志。 是的、我可以看到扫描命令也已成功发出、也可以像您一样看到一些 SSID 日志。

    一些建议:

    1. CC33xx 器件附带一个烧录的 MAC 地址。 我建议使用它、而不是提供自定义 MAC 地址。 您可以在 SDK 的“wlan_if.c"中“中看到 wlan_start 函数。

    2.我相信您丢失的命令之一是 WLAN_set_power_save。 您能添加这个吗?

    3.是否可以尝试将 WLAN_SET_POWER_MANAGEMENT 改为 POWER_MANAGE_ELP_MODE? 请在执行 SET_POWER_SAVE 命令后执行此操作。 否则、您可能会遇到问题。 同样、参考 SDK 中 WLAN_IF.c 的 Wlan_Start 函数。  

    4、能否确认函数“ScanResultsSize"中“中的 Wlan_Scan 非零值传递到“ScanResultsSize"参数“参数?

    一般而言、我首先建议严格遵循 SDK 中的 WLAN_START、并根据 network_terminal 示例启动角色。 然后、我们可以准确找出导致问题的命令。  

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

    感谢您的建议。 以下是我尝试过的:

    1.使用保险丝 MAC 地址:(0xec、0x9a、0x34、0x06、0x66、 0xfa)

    2 和 3。 我从 SDK 中调用 WLAN_START 函数。 此函数已设置 WLAN_set_power_save 和 POWER_management_ELP_MODE。 我还尝试了禁用低功耗模式、如调用 WLAN_START 时的 NETWORK_ENTERMINATOR 示例中所做的那样。 除了 SPI 导线外、我还添加了具有生成的 32.768KHz 的 SLOW_CLOCK 引脚。

    4.我对 WLAN_SCAN 的调用如下:WLAN_SCAN (0、NULL、WLAN_MAX_SCAN_COUNT);其中 WLAN_MAX_SCAN_COUNT 为 20(该函数丢弃前两个参数)。

    5、我尝试连接到一个 wifi(“ Livebox-mallow “)网络并捕获日志(附加到这个消息)。 它具有相同的结果、找到 SSID、我没有看到明显的错误、但在主机端我根本没有任何事件、但这可能会从假设中排除扫描结果大小。  

    谢谢、

    e2e.ti.com/.../stream_5F00_connect.csv

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

    尊敬的 Gaetan:

    如何收集扫描结果? 我的理解是、Wlan_Scan 的第二个参数应该是指向收集结果的数组的指针。 我 认为使用 NULL 是一个错误。  

    请参阅此处的 network_terminal 示例:

    RET = Wlan_Scan (app_CB.role、
    app_CB.gDataBuffer.netEntries[ScanParams.index]、
    ScanParams.numOfentities);

    编辑:我看到前两个参数被丢弃的意思。 让我回顾一下到底发生了什么

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

    抱歉、请忽略最后一条评论。 我现在看到了问题的症结所在。

    我 现在明白,当你说你没有得到任何事件;无论是扫描或连接。 您能否分享您的事件处理程序? 您是否正确地将其传递到 Wlan_Start?

    此外、我想您提到必须手动操作 IRQ 才能使固件下载正常工作。 您能否在发出 Wlan_Scan 后检查 CC33xx 器件的中断引脚是否为高电平? 这也可能表示驱动程序未触发事件处理程序。

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

    以下是我的事件处理程序:

    static void cc33xxWlanEventHandler(WlanEvent_t *pWlanEvent)
    {
    	LOG_ERR("Event trigger %d", pWlanEvent->Id);
    	if (!pWlanEvent) {
    		return;
    	}
    
    	switch (pWlanEvent->Id) {
    
    	case WLAN_EVENT_CONNECT:
    		wifi_mgmt_raise_connect_result_event(cc33xx_data_ctx.iface,
    						     WIFI_STATUS_CONN_SUCCESS);
    		cc33xx_data_ctx.state = CC33XX_STA_CONNECTED;
    		break;
    
    	case WLAN_EVENT_DISCONNECT:
    		wifi_mgmt_raise_disconnect_result_event(cc33xx_data_ctx.iface,
    							WIFI_REASON_DISCONN_SUCCESS);
    		cc33xx_data_ctx.state = CC33XX_STA_STARTED;
    		break;
    
    	case WLAN_EVENT_SCAN_RESULT:
    		processScanResult(&pWlanEvent->Data.ScanResult);
    		break;
    
    	case WLAN_EVENT_CONNECTING:
    		cc33xx_data_ctx.state = CC33XX_STA_CONNECTING;
    		break;
    
    	case WLAN_EVENT_ERROR:
    		LOG_ERR("Received error 0x%X from CC33XX", pWlanEvent->Data.error.error_num);
    		break;
    
    	// Events discarded
    	case WLAN_EVENT_ADD_PEER:
    	case WLAN_EVENT_REMOVE_PEER:
    	case WLAN_EVENT_ACTION_FRAME_RX:
    	case WLAN_EVENT_ASSOCIATED:
    	case WLAN_EVENT_AP_EXT_WPS_SETTING_FAILED:
    	case WLAN_EVENT_BLE_ENABLED:
    	case WLAN_EVENT_CS_FINISH:
    	case WLAN_EVENT_ROC_DONE:
    	case WLAN_EVENT_CROC_DONE:
    	case WLAN_EVENT_SEND_ACTION_DONE:
    	case WLAN_EVENT_EXTENDED_SCAN_RESULT:
    	case WLAN_EVENT_P2P_GROUP_STARTED:
    	case WLAN_EVENT_P2P_GROUP_REMOVED:
    	case WLAN_EVENT_P2P_SCAN_COMPLETED:
    	case WLAN_EVENT_CONNECT_PERIODIC_SCAN_COMPLETE:
    	case WLAN_EVENT_FW_CRASH:
    	case WLAN_EVENT_BSS_TRANSITION_INITIATED:
    		LOG_DBG("Received event %d", pWlanEvent->Id);
    		break;
    
    	default:
    		LOG_ERR("Received unhandled event %d", pWlanEvent->Id);
    		break;
    	}
    }

    我通过执行以下操作将其传递到 WLAN_START:

    	ret = Wlan_Start(cc33xxWlanEventHandler);
    	if (ret != 0) {
    		LOG_ERR("Wlan_Start ret = %x", ret);
    	}

    此外、当我错过配置 SPI 时、我收到了事件 20 和 22 (ERROR 和 FW_CLARIRED)、因此我认为事件处理程序可以正常工作。

    我观察到、当我向 CC3351 发送 wifi 扫描命令等时、WLAN_IRQ 线路保持在逻辑高电平。 (主机侧等待上升沿)。

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

    尊敬的 Gaetan:

    如果 IRQ 保持高电平、那么听起来像问题所在。 驱动程序似乎没有检测到中断。 您能否比较一下 SDK 中是如何处理它的?

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

    我们侧的 WLAN IRQ 配置为低电平有效并接受双边沿。  

    从示例中、我看不到代码中使用了哪个边缘、但我看到了注释:

    /*!
        \brief initialize the input GPIO coming from the wifi part
        \param cb - gpio ISR called upon assertion
        \note
            - GPIO input should be triggered either -
              - Falling edge - no need to implement wlan_IRQEnableInt wlan_IRQDisableInt and wlan_IRQClearInt
              - Active low - must implement wlan_IRQEnableInt and wlan_IRQDisableInt
        \return
        \warning
    */

    这听起来不错。 此外、该 IRQ GPIO 用于引导和初始化序列期间、这意味着、在向 CC3351 发送固件时、也在接口配置(发送角色启动命令,设置 MAC 地址等)期间、此配置可正常工作。

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

    尊敬的 Gaetan:

    也许您可以澄清、但我觉得我收到了冲突信息。  

    WLAN_IRQ 线路保持在逻辑高电平。 (在主机端,我们正在等待上升沿)。
    我们端的 WLAN IRQ 配置为低电平有效并接受双边沿。  [/报价]

    您能描述一下您的硬件吗? 除非 WL_IRQ 引脚上有逆变器、否则我预计 WL_IRQ 引脚应为高电平有效。 上升沿也可以、但它会增加一些时序风险。 我还建议只使用一条边线、而不是两条边线。 这是因为在从驱动器侧执行 CORE_STATUS_READ 后、释放 IRQ 引脚、从而创建下降沿。 在 下降沿情况下、您的中断处理程序不应触发。

    此 IRQ GPIO 用于引导和初始化序列期间、这意味着在向 CC3351 发送固件时以及在接口配置(发送启动角色命令,设置 MAC 地址等)期间、此配置都可以正常工作。

    我记得您的固件下载缓慢问题、这让我相信 IRQ 在任何情况下都不起作用。 例如、我认为接口配置命令(Role up 等)不需要基于中断的处理程序事件。 它们是简单的命令。

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

    您好 Sabeeh,

    下面是关于我的设置的一些说明:

    -我现在在 2MHz 使用 SPI

    - WLAN IRQ 配置为低电平有效、并在上升沿触发对 FwEvent_IRQ_HANDLER 的调用。 我删除了这两个事件,只是为了测试。

    -我现在已经连接了没有 CTS/RTS 的 UART(因为它似乎在我们发送到 cc3351 的配置文件中被禁用)

    - 32k 时钟是由主机生成的

    1) 固件下载缓慢问题似乎在我们这边,实际上我们部分修复它。 至少我们确定了问题、原因是使用 Zephyr 进行了 SPI 处理。 在 2MHz 中添加 SPI FIFO 支持和 DMA 时、我们能够在 13 秒内发送固件。 因此、我认为我们可以将这个问题视为“已解决“、因为我们知道如何解决这个问题、而且它在我们这边。 感谢您对此的支持。

    2) 在固件启动时、我们成功将固件发送到 CC3351 芯片。 然后,我们通过设置 MAC 地址、roleup 等来配置接口 此时、如果我可以这样说、IRQ 线路正按预期工作。 然后、当我开始 WiFi 扫描时、我看到已发送命令、我还在 CC3351 日志中看到已执行扫描。 使用逻辑分析仪时、我看到 IRQ 线路保持高电平、是错误状态吗?

    a) 虽然这可能是我们固件中的问题、但 IRQ 线路在延迟后(初始化后)中断。 然后、我有测试仪在发送 wifi 扫描命令的同时从 CC3351 读取 MAC 地址。 结果是、我收到 MAC 地址、在 IRQ 线路上看到一些波形、然后保持高电平、WiFi 扫描没有结果。 我在 IRQ 线上的逻辑分析上附加了一个捕获、当发送 WiFi 扫描和读取 Mac 地址时。  

    谢谢、

    Gaetan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    然后、当我开始 WiFi 扫描时、我看到已发送命令、我还在 CC3351 日志中看到已执行扫描。 使用逻辑分析仪时、我看到 IRQ 行保持高电平、它是错误状态吗?

    我认为这不是错误状态。 CC33xx 将触发 IRQ 以在发生事件时通知主机。 在本例中、应为 WLAN_EVENT_SCAN_RESULT。

    正如一个思考实验:调用 WLAN_SCAN 后、可以手动触发中断处理程序、然后事件处理程序尝试读取 CORE_STATUS 寄存器。 读取此寄存器后、IRQ 将置为无效。 CORE_STATUS 寄存器保存 EVENT_SCAN_RESULT 的屏蔽。

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

    为了进行跟踪、我要粘贴通过电子邮件收到的回复:

    我已成功执行 WiFi 扫描/连接到 WiFi 网络。 问题是、当 CC3351 使用 IRQ 线路发送多个“事件“时、我们只读取一条消息。 要解决此问题、我至少现在需要在重新启用 IRQ 时手动调用事件处理程序。 通过这种方式、所有堆叠事件都将继续进行。