ESP32和ESP8266使用W5100和W5500以太网模块

本文分享了使用ESP8266结合W5500以太网模块实现有线以太网通讯的经验。详细介绍了程序编写、模块连线及调试过程,包括如何避免使用默认GPIO15作为片选信号,解决死机问题,以及ESP32与W5500的兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ESP8266使用W5100及W5500以太网模块

概述

实验项目,希望用一个以太网模块来实现以太网通讯,没有使用WiFi网络,而是用连线的以太网。
采用一个ESP8266模块做主处理器,采用Arduino IDE做开发环境。首先选择了一个W5500模块连接以太网。结果通过SPI连接W5500,不成功。程序跑不起来。也没有添加其他的库,感觉现在的Arduino不是很友好,下载程序非常慢。就上某宝又购买了一个W5100模块。(因为看Ethernet.h和Ethernet.cpp发现库与W5100模块兼容。这次实验,一切正常,在这里分享一下使用情况。

程序

/*
  A simple server that answer the ping message. 
  Using an ESP8266 .
*/

/* Circuit:
 *  Ethernet shield attached to pins : 
 *  D6: GPIO12 - MISO
 *  D7: GPIO13 - MOSI
 *  D8: GPIO15 - CS
 *  D5: GPIO14 - SCLK
 */

#include <SPI.h>
#include <Ethernet.h>

#define MACADDRESS 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xED
IPAddress ip(192,168,6,29);
IPAddress gateway(192, 168, 6, 1);
IPAddress subnet(255, 255, 255, 0);

// telnet defaults to port 23
EthernetServer server(23);

#define RST     4    //W5100 RST
void setup() 
{
  pinMode(BUILTIN_LED, OUTPUT);
  Ethernet.init(5);				// 初始化Ethernet板子
  pinMode(RST, OUTPUT);  
  digitalWrite(RST,HIGH);  //Reset this module
  delay(200); 
  digitalWrite(RST,LOW); 
  delay(200);
  digitalWrite(RST,HIGH);  
  delay(200);     

  Serial.begin(115200);
  Serial.println();

  byte mac[] = { MACADDRESS };

  Ethernet.begin(mac, ip, gateway, subnet);  

  // print your local IP address:
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());
  
  server.begin();
}

void loop()
{
}

连线

在这里插入图片描述
模块和ESP8266连线不要发生错误一次成功

W5100ESP8266
+5V
NSSSS
MOMOSI
GNDGND
RSTGPIO4
SCKSCLK
MIMISO

结果

在这里插入图片描述
实验成功,可以使用以太网和ESP8266通讯了。

经验

使用W5500不知道为啥总是死机。没有任何反应。看门狗都不起作用。用ESP32和W5500作了试验,ESP32无法作主机,原因是采用的库是C:\安装Arduino IDE\libraries\Ethernet目录下的头文件问题,不能使用EthernetServer myServer(23); 定义变量。编译不能通过。还有一个经验是当不清楚SPI的接线时可以用打印的方法获取SPI的端口。
这几天又试验了ESP32使用W5500的情况,ESP32可以作client,和server进行通讯,但不知道为啥还是不能作server。

后记

最近有网友讨论ESP8266和W5500的板子通讯的事,实验了一下。可以用ESP8266连接W5500实现以太网有线通讯,只要在初始化程序中增加Ethernet.init(5);这个命令选择GPIO5作为片选信号。还要注意:

  • 不能使用默认的GPIO15作为片选CS信号,如果用GPIO15的话会出现死机现象。可能和我们的板子GPIO15连接的一个10KΩ的接地电阻有关。
  • 片选信号选择其他的可以通讯并实现TCP等的传输。
  • 在初始化中添加Ethernet.Inti(5); 就可以,这个CS可以任意选

在这里插入图片描述

ESP32+W5500

关于ESP32+W5500的server不能运行解决了,可以使用ESP32和W5500实现有线以太网通讯。关键是库函数有问题,在编译时需要使用Server.h库。我的库的地址是在机器上的如下位置:
在这里插入图片描述
把这个头文件中改成如下形式就可以编译并使用W5500通讯了。

class Server: public Print
{
public:
    //virtual void begin(uint16_t port=0) =0;   modified by CAI at 2021-12-13
    virtual void begin() = 0;
};
### ESP32W5500以太网模块连接通信 #### 连接配置 为了使ESP32能够通过SPI接口与W5500以太网模块正常工作,需按照特定的方式进行硬件连线。具体来说: - **VCC** **GND**: 将W5500的电源引脚(VCC)连接至ESP32的3.3V供电端子;将接地(GND)相连。 - **CS (Chip Select)**: W5500的片选信号应接到ESP32的一个GPIO上,通常推荐使用GPIO15作为此目的[^1]。 - **MISO, MOSI, SCLK**: 这三个SPI总线上的数据传输引脚分别对应于ESP32内部SPI外设的标准管脚分配——即MOSI为GPIO23、MISO为GPIO19以及SCLK为GPIO18。 此外,还需注意重置(RST)引脚可以被拉高保持默认状态或根据实际需求连接到另一个可用的GPIO以便软件控制重启操作[^4]。 #### 示例代码 下面给出一段简单的Python代码片段用于初始化设置并测试TCP服务器功能,在Micropython环境下执行该程序可验证两者间的连通性。 ```python from machine import Pin, SPI import network import socket # 配置SPI参数 spi = SPI(1, baudrate=8000000, polarity=0, phase=0) cs = Pin(15) # 创建ethernet对象 nic = network.WIZNET5K(spi, cs) # 设置静态IP地址(可根据实际情况调整) ip_address = '192.168.1.10' subnet_mask = '255.255.255.0' gateway_ip = '192.168.1.1' if not nic.isconnected(): print('Connecting to network...') nic.ifconfig((ip_address, subnet_mask, gateway_ip)) while True: try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) addr = ('', 80) s.bind(addr) s.listen(1) conn, client_addr = s.accept() with conn: while True: data = conn.recv(1024).decode().strip() if not data: break response = f'HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>Hello from {client_addr}</h1>' conn.sendall(response.encode()) s.close() except Exception as e: print(f"Error occurred during connection handling: {e}") ``` 上述代码实现了基本的Web服务监听,并能在浏览器访问时返回简单页面响应。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值