Page 1 of 1

I (2640) system_api: Base MAC address is not set

Posted: Thu Feb 24, 2022 1:35 pm
by beyound
我用的是ESP32 Lyrat 4.3的开发板,用idf标准的代码初始化wifi(station), 十次有7次会遇到下面的开机错误,找不到MAC地址,WiFi也无法正常使用。

Code: Select all

I (2640) system_api: Base MAC address is not set
I (2650) system_api: read default base MAC address from EFUSE
我必须在main的开头调用下面代码,再重启,才可以使网络正常,但是过一段时间,又会报上面的错误

Code: Select all

ESP_ERROR_CHECK(nvs_flash_erase()); //有的时候莫名其妙WiFi 、 mac地址都报废,用这个擦除nvs就好了
err = nvs_flash_init();

初始化wifi的代码如下, 不完整。

Code: Select all


void wifi_init_sta(void)
{
    /* 创建一个事件标志组 */
    wifi_event_group_handler = xEventGroupCreate();

    /* 初始化底层TCP/IP堆栈。在应用程序启动时,应该调用此函数一次。*/
    // ESP_ERROR_CHECK(esp_netif_init());

    /* 创建默认事件循环,*/
    if(esp_event_loop_create_default() != ESP_OK)
	{
		ESP_LOGE("wifi", "esp_event_loop_create_default failed");
		return;
	}


    /* 创建一个默认的WIFI-STA网络接口,如果初始化错误,此API将中止。*/
    // esp_netif_create_default_wifi_sta();		
	esp_netif_t *sta_netif;
	sta_netif = esp_netif_create_default_wifi_sta();
	// if(sta_netif)
	// {
	// 	printf("esp_netif_set_hostname(sta_netif, \"localname\");	\ntodo: invalid function...");
	// 	esp_err_t err = esp_netif_set_hostname(sta_netif, "localname");	
	// 	ESP_ERROR_CHECK(err);
	// }
// CONFIG_NETIF_HOSTNAME
			// esp_netif_get_hostname(,)

// esp_netif_t *esp_netif = NULL;
// esp_netif = esp_netif_next(esp_netif);
// esp_err_t err = esp_netif_set_hostname(esp_netif, "hoody");	
// ESP_ERROR_CHECK(err);						

    /* 使用WIFI_INIT_CONFIG_DEFAULT() 来获取一个默认的wifi配置参数结构体变量*/
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    /* 根据cfg参数初始化wifi连接所需要的资源 */
    if(esp_wifi_init(&cfg) != ESP_OK)
	{
		ESP_LOGE("wifi", "esp_wifi_init failed");
		return;
	}

	//vTaskDelay(100); 

	/* 将事件处理程序注册到系统默认事件循环,分别是WiFi事件、IP地址事件及smartconfig事件 */
    ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));
    ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));
    ESP_ERROR_CHECK(esp_event_handler_register(SC_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));

    /* 定义WiFi连接的ssid和password参数 */


	wifi_config_t wifi_config = {0};
    char ssid[32] = "ssid";      /**< SSID of target AP. */
    char password[64] = "88888888";  /**< Password of target AP. */
	size_t len1 = sizeof(ssid), len2 = sizeof(password);


	// nvs_flash_init_partition("wifi");

	nvs_handle_t hNVS;

	esp_err_t err = nvs_open(WIFI_TAG, NVS_READONLY, &hNVS);
	if(err == ESP_OK)
	{
		nvs_get_str(hNVS, "ssid", (char*)ssid, &len1);
		nvs_get_str(hNVS, "pswd", (char*)password, &len2);
		nvs_close(hNVS);
	}



    strncpy((char *)&wifi_config.sta.ssid, ssid,  sizeof(wifi_config.sta.ssid));
    strncpy((char *)&wifi_config.sta.password, password, sizeof(wifi_config.sta.password));

    /* 设置WiFi的工作模式为 STA */
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
    /* 设置WiFi连接的参数,主要是ssid和password */
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
    /* 启动WiFi连接 */
    ESP_ERROR_CHECK(esp_wifi_start());

    printf("wifi_init_sta finished. \n");

    /* 使用事件标志组等待连接建立(WIFI_CONNECTED_BIT)或连接失败(WIFI_FAIL_BIT)事件 */
    EventBits_t bits;  /* 定义一个事件位变量来接收事件标志组等待函数的返回值 */ 
    bits = xEventGroupWaitBits( wifi_event_group_handler,	        /* 需要等待的事件标志组的句柄 */
                                WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,	/* 需要等待的事件位 */
                                pdFALSE,    /* 为pdFALSE时,在退出此函数之前所设置的这些事件位不变,为pdFALSE则清零*/ 
                                pdFALSE,    /* 为pdFALSE时,设置的这些事件位任意一个置1就会返回,为pdFALSE则需全为1才返回 */
                                portMAX_DELAY);	                    /* 设置为最长阻塞等待时间,单位为时钟节拍 */

    /* 根据事件标志组等待函数的返回值获取WiFi连接状态 */
    if (bits & WIFI_CONNECTED_BIT)  /* WiFi连接成功事件 */
	{
        printf("connected to ap SSID:%s OK \n",MY_WIFI_SSID);
        vEventGroupDelete(wifi_event_group_handler);    /* 删除WiFi连接事件标志组,WiFi连接成功后不再需要 */
    } 
	else if (bits & WIFI_FAIL_BIT) /* WiFi连接失败事件 */
	{
        printf("Failed to connect to SSID:%s \n",MY_WIFI_SSID);
        smartconfig_init_start();   /* 开启智能配网 */
    } 
	else 
    {
        printf("UNEXPECTED EVENT \n");  /* 没有等待到事件 */
        smartconfig_init_start();   /* 开启智能配网 */
    }

    //ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler));
    //ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler));
}

Re: I (2640) system_api: Base MAC address is not set

Posted: Thu Mar 03, 2022 5:30 pm
by beyound
论坛活跃度很差啊。
这个问题我自己解决了,在init wifi的代码之前,Sleep了两秒,等开发板电压稳定。但是这个2秒很玄学,到底等多久合适呢,难道量产的产品也要这样设定吗?

Re: I (2640) system_api: Base MAC address is not set

Posted: Wed Mar 22, 2023 9:20 am
by ccg_nj
这个产品真的不行,我也遇到你这个问题了

Re: I (2640) system_api: Base MAC address is not set

Posted: Wed Mar 29, 2023 12:19 am
by yake827
Hi , "I (2640) system_api: Base MAC address is not set" 这句并不是报错信息,只是正常的log,你在IDF下搜索可以看到很多示例开机都会打印这个信息。而且我从代码也没看到 NVS 与这个MAC之间有什么联系。
请问你们使用的是 IDF 那个版本,有使用 tag 分支测试吗?尽量不要使用 master 分支,区别在这里:https://docs.espressif.com/projects/esp ... sions.html
看你的代码,感觉就是station demo进行的更改,如果使用 tag 分支依然测试有问题,请把问题代码打包和版本信息一起给到我们,我们进行确认