ESP8266使用W5100及W5500以太网模块
- 概述
- 程序
- 连线
- 结果
- 经验
- 后记
- ESP32+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连线不要发生错误一次成功
W5100 | ESP8266 |
+5V | |
NSS | SS |
MO | MOSI |
GND | GND |
RST | GPIO4 |
SCK | SCLK |
MI | MISO |
结果
实验成功,可以使用以太网和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;
};