ESP8266 常见问题

本页面收集esp8266常见问题

概述

本文档主要介绍开发者在ESP8266开发中常见的一些问题。 这些问题主要包括以下几大类:

  • 基本概念相关
  • ESP8266 相关
  • AiCloud 相关
  • 固件编译调试相关
  • 文档资料相关

以下是各分类的具体问题和解答。

基本概念相关

  • ESP8266是什么?

  ESP8266 是高性能无线 SOC,在较小尺寸封装中集成了业界领先的 Tensilica L106 超低功耗 32 位微型 MCU,带有 16 位精简模式,主频支持 80 MHz 和 160 MHz,支持 RTOS,集成 Wi-Fi MAC/ BB/RF/PA/LNA,板载天线。支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈。

  • ESP01, ESP02是什么?

  ESP01~ESP14是由深圳安信可科技研发生产的ESP8266系列模组,在ESP8266芯片的基础上,完善了外围器件布局和优化天线。

  • AiCloud是什么?

  AiCloud 是安信可提供给广大客户的免费服务器,数据全裸,UDP 传输,简单稳定,且含有诸多例程和 PC 端上位机调试工具。

  • 乐鑫与安信可的关系

  乐鑫是ESP8266的芯片厂商,安信可是依据ESP8266生产模组,并提供一系列开发方案的厂家。

  • ESP8266必须要借助服务器才能开发吗?

  这个根据您的需求来定,若您只需要局域网就可以满足产品需求,那么无需服务器,同样可以使用ESP8266进行开发。

  • 如何基于安信可云开发产品?

  您可以使用AT指令,外挂MCU,或者直接使用SDK进行开发,可参考入门示例SDK开发示例

  • 如何购买ESP8266模组和测试板?

  安信可官方淘宝店铺:http://shop.ai-thinker.com/

  • 我该选择哪个型号的ESP8266模组?

  模组硬件之间的差异主要是封装区别,以及flash大小的区分,您可以查看ESP8266选型列表,若有疑问,可联系我们的销售人员。

  • 我该选择AT开发还是SDK开发?

    SDK方法:
    优势:让系统成本最少 体积最小
    劣势:新手需要一个礼拜到半个月的时间去熟悉代码的研读

    AT方法:
    优势:只需要知道几条AT指令即可用外部单片机实现网络通讯!开发速度快。
    劣势:增加了外置CPU成本

  您可以自已依此评估自己适合哪种方案

  • 我该选择FreeRTOS还是NONOS?

  因为FreeRTOS是后面才开放的,所以一般常用的是NONOS
  若是您之前有开发过FreeRTOS,那么您可以直接使用FreeRTOS方案的SDK,且该方法有利于您之后使用ESP32系列

  • 开发中,遇到问题如何寻求帮助?

  若您是企业用户,我们会专门委派一名工程师负责贵司的对接;
  若您是个人用户,您可以在论坛发帖,或发邮件到support@aithinker.com,我们也会有专门的工程师去处理。

ESP8266 相关

* 为什么透传会丢包?

因为没有设置硬件流控。如果需要避免丢包,请设置硬件流控。透传功能使用的是TCP协议,每包数据是1460(取决于协议栈),只要网络良好,buffer空间没有被消耗完,就可以不停地传输数据。对于透传。串口接收的数据间隔超过20ms,就会认为 接受结束,将已经接受的数据传输至网络。如果网络不好,就可能会丢失一些数据,因此,为了避免这种情况,可以将串口设置为流控模式。

* ESP8266可以同时使用AP+STA吗?

ESP8266没有中继和放大功能,即不可以同时使用AP+STA。

* ESP8266可以进行低功耗吗?

ESP8266可以进行低功耗。AT指令进行低功耗说明:

 设置睡眠模式,sleep只在单STA模式下生效,默认工作在modem-sleep模式。
 AT+SLEEP=0   0为禁止休眠模式
              1为light-sleep模式  功耗0.9mA
              2为modem-sleep模式  功耗15mA

* 将建立的TCP Server 连接通过AT 指令保存到flash?

* 如何让ESP8266上电后快速连接AP?

外设

*SDIO 是否支持 SD 卡?

  ESP8266 是 SDIO Slave ,不支持 SD 卡。

*ESP8266 有几个 UART?

  ESP8266 有两个 UART,其中 UARTO 有 TX、RX,可做数据传输;UART1 由于 RX 脚被 SPI-Flash 占用,只能使用 TX,可以做串口调试信息打印。

*GPIO 可以直接连 5V 吗?

  不可以。GPIO 只能承受 3.6V。需要通过降压电路,否则会造成 GPIO 损坏。

硬件

*ESP8266 电压电流需求?

  ESP8266 的数字部分的电压范围是 1.8V ~ 3.3V,模拟部分的工作电压是 3.0V ~ 3.6V,最低 2.7V。

模拟电源峰值 350 mA,数字电源峰值 200 mA。

注意:选择的 SPI Flash 工作电压也需要与 GPIO 的电压匹配。CHIP_EN 还是工作在 3.0 - 3.6V,使用1.8V GPIO 控制时需要注意电平转换。

*设计 ESP8266 的供电时,需要注意哪些问题?

  请注意如下几点:1.如果是使用 LDO 变压,请确保输入电压和输出电压要足够大。2.电源轨去耦电容器必须接近 ESP8266 摆放,等效电阻要足够低。3.ESP8266 不能直连 5V 电压。4.如果是通过 DC-DC 给 ESP8266 供电,必要时要加上 LC 滤波电路。

*ESP8266 上电时电流很大,是什么原因?

  ESP8266 的 RF 和数字电路具有极高的集成度。上电后,RF 自校准会需要大电流。模拟部分电路最大的极限电路可能达到 500 mA;数字电路部分最大电流 达到 200 mA。一般的操作,平均电流在 100 mA 左右。因此,ESP8266 需要供电能达到 500 mA,能够保证不会有瞬间压降。

*可以使用锂电池或者 2 节 AA 纽扣电池直接给 ESP8266 供电吗?

  2 节 AA 纽扣电池可以给 ESP8266 供电。锂电池放电时压降比较大,不适合直接给 ESP8266 供电。ESP8266 的 RF 电路会受温度及电压浮动影响。不推荐不加任何校准的电源直接给 ESP8266 供电。推荐使用 DC-DC 或者 LDO 给 ESP8266 供电。

*ESP8266 的 RAM 的使用结构是怎么的?

ESP8266 的 RAM 总共 160 KB。

IRAM 空间为 64 KB: 前 32 KB 用作 IRAM,用来存放没有加 ICACHE_FLASH_ATTR 的代码,即 .text 段,会通过 ROM code 或二级 boot 从 SPI Flash 中的 BIN 中加载到 IRAM。 后 32 KB 被映射作为 iCache,放在 SPI Flash 中的,加了 ICACHE_FLASH_ATTR 的代码会被从 SPI Flash 自动动态加载到 iCache。

DRAM 空间为 96 KB: 对于 Non-OS_SDK,前 80 KB 用来存放 .data/.bss/.rodata/heap,heap 区的大小取决于 .data/.bss/.rodata 的大小;还有 16 KB 给 ROM code 使用。 对于 RTOS_SDK,96 KB 用来存放 .data/.bss/.rodata/heap,heap 区的大小取决于 .data/.bss/.rodata 的大小。

WiFi相关

*路由配置是正确的,但是发生找不到路由,连接失败,为什么?

如果 SSID 和密码配置是正确的,可能的原因有 2 个。

1.推荐使用英文字符,不要使用中文。

2.需要注意 bssid_set 的设置,如果不需要指定路由的 MAC 地址,那么需配置 stationConf.bssid_set = 0。

* ESP8266 SoftAP + Station 模式下网络断开或丢包的情况?

虽然 ESP8266 支持 SoftAP + Station 共存模式,但是 ESP8266 实际只有一个硬件信道。因此在 SoftAP + Station 模式时,ESP8266 SoftAP 会动态调整信道值与 ESP8266 Station 一致。这个限制会导致 ESP8266 SoftAP + Station 模式时一些行为上的不便,用户请注意。例如:

情况一 如果 ESP8266 Station 连接到一个路由 (假设路由信道号为 6); 通过接口 wifi_softap_set_config 设置 ESP8266 SoftAP; 若设置值合法有效,该 API 将返回 true ,但信道号仍然会自动调节成与 ESP8266 Station 接口一致,在这个例子里也就是信道号为 6。

情况二 调用接口 wifi_softap_set_config 设置 ESP8266 SoftAP (例如信道号为 5); 其他 Station 连接到 ESP8266 SoftAP; 将 ESP8266 Station 连接到路由( 假设路由信道号为 6) ; ESP8266 SoftAP 将自动调整信道号与 ESP8266 Station 一致(信道 6); 由于信道改变,之前连接到 ESP8266 SoftAP 的 Station 的 Wi-Fi 连接断开。

情况三 其他 Station 与 ESP8266 SoftAP 建立连接; 如果 ESP8266 Station 一直尝试扫描或连接某路由,可能导致 ESP8266 SoftAP 端的连接断开,或者 UDP 丢包,ping 丢包等情况。因为 ESP8266 Station 会遍历各个信道查找目标路由,意味着 ESP8266 其实在不停切换信道,ESP8266 SoftAP 的信道也因此在不停更改。这可能导致 ESP8266 SoftAP 端的原有连接断开,或者 UDP 丢包,ping 丢包等情况。

这种情况,用户可以通过设置定时器,超时后调用 wifi_station_disconnect 停止 ESP8266 Station 不断连接路由的尝试;或者在初始配置时,调用 wifi_station_set_reconnect_policy 和 wifi_station_set_auto_connect 禁止 ESP8266 Station 尝试重连路由。

*Wi-Fi 信道是什么?可以自行选择信道吗?

信道指的是 Wi-Fi 使用的指定频段中特定频率的波段。不同国家地区使用的信道数目是不同的。您可以参考ESP8266 Wi-Fi 信道选择指南

应用

*为什么云端升级需要2个 “bin” 文件?“user1.bin” 和 “user2.bin” 有什么区别?

  user1.bin 和 user2.bin 是 2 个不同的 BIN 文件。生成 user1.bin 和 user2.bin 时,必须使用相同的 Flash 和 boot 设置,以保证 OTA 升级成功。2个 BIN 文件是互补的,运行 user1.bin 的时候,升级是下载 user2.bin;运行 user2.bin 的时候,升级是下载 user1.bin。这样可以保证升级过程中,如果有掉线的情况发生,设备还是可以正常运行。

固件编译调试相关

* 导入工程注意事项

  工程文件的导入的注意不要有空格和中文字符,例如:C:\Users\Administrator\Desktop\sdk\esp_iot_sdk_v1.3.0

* esp8266模组LED灯为什么上电闪一下就灭了?

  a,因为esp8266模组的LED接在GPIO2,而此IO与UART1_TX共用,此时模组上电会输出一下打印信息,所以LED会闪直到打印信息输出完毕,LED就灭了。

  b,若想查看启动信息的内容,请选择串口调试助手74880的波特率,硬件上把rst拉低再拉高,可以查看启动信息。

  c,若想通过串口调试助手发送AT指令,请切换波特率到115200,即可。

* ESP8266启动信息说明?

* 模组发送AT指令无响应?

a,请选择74880的波特率,看下启动日志,把RST复位引脚拉低再拉高,可使用安信可串口调试助手进行查看,aithinker_serial_tool_v1.2.3.7z

b,是否进入flash启动模式,GPIO15下拉,GPIO0,GPIO2上拉?

c,是否烧录了固件?烧录配置flash size大小是否跟WiFi模组的flash一致?

* 如何屏蔽上电打印?

U0TXD默认上电有系统打印,对此敏感应用可通过UART的内部引脚交换功能,在初始化的时候,调用system_uart_swap函数。将 U0TXD、U0RXD 分别于U0RTS(MTDO/GPIO15)、U0CTS (MTCK/GPIO13)交换来屏蔽该上电的系统打印。 交换后,硬件上的下载管脚还是使用U0TXD + U0RXD,通信时需要将MTDO对应接到MCU的RXD,MTCK对应加到MCU的TXD。

* 使用UART1打印日志,如何配置?

UART1只有TX功能,可以在UART0用于通讯时做打印log用。 参考代码如下:

           void ICACHE_FLASH_ATTR uart_init_new(void)
           {
          // Wait for FIFOs to be emptied
            UART_WaitTxFifoEmpty(UART0);
            UART_WaitTxFifoEmpty(UART1);
            // Configure UART settings
            UART_ConfigTypeDef uart_config;
            uart_config.baud_rate  = BIT_RATE_74880;
            uart_config.data_bits   = UART_WordLength_8b;
            uart_config.parity     = USART_Parity_None;
            uart_config.stop_bits   = USART_StopBits_1
            uart_config.flow_ctrl   = USART_HardwareFlowControl_None;
            uart_config.UART_RxFlowThresh = 120;
            uart_config.UART_InverseMask = UART_None_Inverse;
            UART_ParamConfig(UART0, &uart_config);
            UART_IntrConfTypeDef uart_intr;
            uart_intr.UART_IntrEnMask = UART_RXFIFO_TOUT_INT_ENA | UART_FRM_ERR_INT_ENA | UART_RXFIFO_FULL_INT_ENA;
            uart_intr.UART_RX_FifoFullIntrThresh = 100;
            uart_intr.UART_RX_TimeOutIntrThresh = 2;
            uart_intr.UART_TX_FifoEmptyIntrThresh = 20;
            UART_IntrConfig(UART0, &uart_intr);
            // Set UART1 for printing
            UART_SetPrintPort(UART1);
            // Register interrupt handler
            UART_intr_handler_register(uart0_rx_intr_handler);
            ETS_UART_INTR_ENABLE();
           }

* 上电为什么输出乱码?

上电输出乱码是正常的,因为外部晶振选择是26M,请选择74880的波特率,按下复位键或把RST引脚拉低再拉高,可以看到启动信息。可使用安信可串口调试助手进行查看,aithinker_serial_tool_v1.2.3.7z

* 为什么编译sdk的时候会发生irom0_0_seg错误?

文档资料相关