前言
DM9051NP芯片 SPI接口占用管脚数量比以太网PHY的RMII/MII少,PCBA版线布局可更精简。而DM9051NP驱动软件方面,由于源代码已集成在ESP IDF中,可见其可靠度以及网口性能得到乐鑫官方认可。 在ESP32既有SPI 时钟31.2MHz的条件下,DM9051NP能充分发挥网口资料送收性能,相关Iperf测试数据,请参考第5章节。
1.DM9051NP + ESP32模块介绍
此模块是基于安可信ESP-12K模块来设计,以DM9051NP SPI接口转以太网芯片为ESP-12K模块(核心模块为ESP32-S2)增加了有线网口功能,其中,DM9051NP只占用了4个GPIO,原本ESP32有线网口参考设计为以太网PHY,在RMII模式下,需佔用10个GPIO ; MII模式下,GPIO占用更多,为16个。
同样地,DM9051NP更适合用ESP32-WROOM32(核心模块为ESP32)的以太网口应用上,在有限GPIO接口的情况之下,使用DM9051NP SPI接口转以太网芯片,空出来的GPIO能让MCU更方便去扩展其他功能。
1-1.ESP 12K模组介绍
ESP32-S2 提供丰富的外设接口,包括SPI,I2S,UART,I2C,LED PWM,LCD 接口, Camera 接口,ADC,DAC,触摸传感器,温度传感器和多达43 个GPIO。
ESP-12K 是由安信可科技开发的Wi-Fi 模块,该模块核心处理器ESP32-S2 是一款 高集成度的低功耗Wi-Fi 系统级芯片(SoC),专为物联网(IoT)、移动设备、可穿戴电子 设备、智能家居等各种应用而设计。
1-2. DM9051NP网卡芯片介绍
DM9051NP SPI接口网卡芯片是为了方便物联网行业进行以太网通信而开发出的解决方案。DM9051NP芯片是带有行业标准串列外设接口(Serial Peripheral Interface,SPI)的独立以太网控制器。DM9051NP符合IEEE 802.3 规范,它还支持以DMA 模式來传输,以实现资料传送快速。DM9051NP通过1个中断引脚和SPI接口來进行与主控制器/MCU单片机的通信,资料传输规格为10/100 M。
•Package:32支接脚封装,QFN.
•IEEE 802.3az Energy Efficient Ethernet (EEE)
•远程唤醒 (WOL)
•Support 光口界面
•EMI (Class B) and HBM ESD Rating 8KV
• 工业温度规范: –40℃ to +85℃
2.实验环境
2-1.应用:访问网页
图2.1
DM9051 ESP32 12K模块利用HTTP协议,完成无线Wi-Fi转传有线以太网的透传功能,而两端数据包进行双向即时转发。
在透传功能演示时,将模块当作一个小网关(无线热点Wi Fi AP),让手机或平板等透过无线WIFI连上线,模块会要求输入密码,待登入后,此时DM9051NP会释放出ESP32 AP access point(eth2ap的功能),当手机连线模块后,由路由的DHCP Server进行DHCP 的动态IP分配,让DM9051NP取得IP ,接著ESP32-DM9051-eth2ap进行数据透传,成功连线并访问网页。
如果路由沒有DHCP server的话,使用者可对手机设置静态IP,也可访问网页。
此应用可用于IPC监控、家庭物联网网关搭建等。
3.硬件部分
3-1 .硬件环境
此DM9051 ESP 12K开发版规格如下:
图3.1
主要组件 |
功能描述 |
P1 |
DC5V电源插座 |
J28 J29 |
选择 USB (默认设置) or DC电源插座来供电 |
J28 ON: 5V 电源由 USB (J1)供应 J28 OFF: 5V电源由 DC插座 (P1)供应 |
|
J29 ON: 5V电源由 DC插座 (P1)供应 J29 OFF: 5V电源由 USB (J1)供应 |
|
J27 J30 |
选择 USB (默认设置) or DC电源插座来为DM9051 以及 ESP 12K (ESP32-S2)供电 |
J27 ON: 5V电源由 USB (J1)供电给DM9051 J27 OFF: 5V电源由 DC插座 (P1)供电给DM9051 |
|
J30 ON: 5V电源由 DC插座 (P1)供电给ESP 12K(ESP32-S2) J30 OFF: 5V电源由 USB (J1)供电给ESP32-S2 |
|
JP4 LED1 LED2 |
RJ45 网络接口插座为10M以及/100Mbps Ethernet,插座有LED1 与LED2灯号。 (LED 灯号模式1: 默认设置) |
LED1 :绿灯表示 (Link / Active) ON: 联机中 OFF: 不是联机中 Flash: 数据传送中 |
|
LED2 :黄灯(当联机中时,为网速灯号 ) ON: 100M Full duplex OFF: 10M Full duplex |
|
U3 |
DM9051 |
U2 |
ESP32-S2 Module : ESP-12K |
SW1 |
启动按键 |
SW2 |
重启按键 |
LED4 |
LED灯号自定义义(GPIO2) |
LED5 |
电源灯号 |
J3 |
ESP32-S2 I/O |
J2 |
ESP32-S2 I/O |
J1 |
MicroUSB 插座( USB5V供电 以及 通信) |
表1
ESP32 有线接入以太网方法:
DM9051NP通过SPI接口控制内部寄存器,并有中断输出接口。ESP 12K(ESP32-S2)通过SPI1和DM9051NP相连。具体接口如下:
DM9051NP |
ESP32 S2 |
|
SPI_CS |
Pin17 |
Pin13 |
SPI_CLK |
Pin18 |
Pin16 |
SPI_MOSI |
Pin19 |
Pin14 |
SPI_MISO |
Pin20 |
Pin15 |
SPI_INT |
Pin24 |
Pin18 |
*在ESP IDF的Ethernet example DM9051NP module:
在ESP32官方例程 examples/ethernet/中,介绍了DM9051NP SPI接口的接线方法,下面链结网址的说明文档README.md中,有说明接线方法。在這裡要提醒,DM9051NP以及ESP32模块,基于走线佈局考量,設計成如图3.2/图3.3的变更。
https://github.com/espressif/esp-idf/tree/1d7068e4be430edd92bb63f2d922036dcf5c3cc1/examples/ethernet
4.软件部分
4-1. ESP32 硬件开发的软件环境:ESP IDF
此实作使用 ESP-IDF (Espressif IoT Development Framework) 环境来开发以太网口通讯,配置相关菜单,编译、下载固件至 ESP32 12K模块。对于如何搭建ESP32 硬件开发的软件环境,请各位同学参考上海乐鑫官方搭建教学,这里写得很详细,会手把手带着同学完成开发环境:
快速入门 - ESP32 - — ESP-IDF 编程指南 latest 文档
4-2. HTTP
1.)HTTP简介
HTTP协议是Hyper Text Transfer Protocol超文本传输协议的缩写,基于TCP传输层协议进行通信,采用Client端与Server端架构,属于应用层协议。
ESP IDF有提供软件组件使用和设计文档,让同学们运用ESP-IDF的各项功能,本实作即是在ESP IDF范例(Example)中构建HTTP的应用程序。
2.)ESP IDF的HTTP接口:
ESP IDF自带的HTTP接口的使用, ESP HTTP模块提供了完整的API以支持HTTP的应用,其源代码,请同学参考IDF目录下的test_http_client.c,其路径esp-idf\components\esp_http_client\test
3.)HTTP请求
HTTP请求格式是Client端往Server端发送请求动作,告知Server自己的要求。
4.)HTTP报文
HTTP报文是HTTP应用程序之间传输的数据块,HTTP报文分为HTTP请求报文和HTTP响应报文。
对于HTTP请求与报文的详细内容,在这裡就先不谈了,已经有其他先进在各论坛做了详细介绍,有兴趣的同学可上网自行学习。
5.)ESP32的HTTP接口介绍
请同学直接参考ESP IDF的官方指南,那边介绍得更多更详细,相关网址如下:API 参考 - ESP32 - — ESP-IDF 编程指南 latest 文档
4-3.有线以太网转Wi-Fi的AP路由功能:ETH2AP
1.)介绍:
ESP32有提供官方例程,这个例程(ETH2AP)功能是以太网+Wi-Fi热点AP(access point),各位同学可在ESP IDF范例(esp-ide/examples/Ethernet)找到,链结网址如下:
esp-idf/examples/ethernet/eth2ap at 1d7068e4be430edd92bb63f2d922036dcf5c3cc1 · espressif/esp-idf · GitHub
2.)如何使用ETH2AP example
步骤1: 初始化有线以太网以及无线热点模式(Wi-Fi AP mode: Access point)
步骤2: 有线以太网接入路由/交换器/PCE,开启DHCP server功能
步骤3:开启 ESP32的Wi-Fi AP
步骤4: 无线设备(智能手机)连接 ESP32的Wi-Fi
详细内容,建议各位同学参考这位先进的文章:
ESP32 单片机学习笔记 - 06 - (以太网)Ethernet转Wifi_Lovely_him的博客-CSDN博客_esp32 以太网
4-4. DM9051NP驱动
DM9051NP驱动源代码参考如下:
static void emac_dm9051_task(void *arg)
{
emac_dm9051_t *emac = (emac_dm9051_t *)arg;
uint8_t status = 0;
uint8_t *buffer = NULL;
uint32_t length = 0;
while (1) {
// block indefinitely until some task notifies me
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
/* 清除中斷狀態 */
dm9051_register_read(emac, DM9051_ISR, &status);
dm9051_register_write(emac, DM9051_ISR, status);
/* 收到封包 */
if (status & ISR_PR) {
do {
length = ETH_MAX_PACKET_SIZE;
buffer = heap_caps_malloc(length, MALLOC_CAP_DMA);
if (!buffer) {
ESP_LOGE(TAG, "no mem for receive buffer");
} else if (emac->parent.receive(&emac->parent, buffer, &length) == ESP_OK) {
/*將緩衝buffter堆疊在TCP/IP層*/
if (length) {
emac->eth->stack_input(emac->eth, buffer, length);
} else {
free(buffer);
}
} else {
free(buffer);
}
} while (emac->packets_remain);
}
}
vTaskDelete(NULL);
}
*DM9051NP ESP32 完整驱动代码链结:
esp-idf/esp_eth_mac_dm9051.c at master · espressif/esp-idf · GitHub
4-5 其他笔记
有些同学反应,之前他们从Github论坛下载DM9051NP sample code,执行后会出现连上线后,有断线情况。经过分析试验后,其原因是原本ESP32轮询的间隔时间为50ms,要改成10ms。相关源代码修改建议如下:
1.)ESP32 轮询的间隔为改成10ms”, 将ulTaskNotifyTake(pdFALSE, pdMS_TO_TICKS(50));改成Line 257 vTaskDelay(pdMS_TO_TICKS(10));
2.)请删除原本example的这一行代码/components/esp_eth/src/esp_eth_mac_dm9051.c
3.)增加此行代码 "dm9051_register_write(emac, DM9051_ISR, 0xFF);"到 emac_dm9051_task() function的部分。
4.)增加此行代码 "dm9051_register_write(emac, DM9051_ISR, 0xFF);" 到emac_dm9051_receive() function. 的部分。
访问网页---路由---DM9051NP_ESP 12K模块 <<<--->>>手机
注:依照当时的网路环境,同学需要对路由的WAN口以及LAN口做DHCP server配置。
在图5.1中,手机经由模块,直接连线到左方的路由,此路由提供DHCP server。所以,手机向路由得到DHCP动态IP后,再经过路由连线到网际网路。
5-2 ) ETH2AP功能演示相关讯息:
以智能手机透过无线WiFi来连上模块,手机WiFi进行扫描后,可以找到模块的SSID 名称为“+++eth2ap_9051_s2_56_06”,表示模块的Wi-Fi已经准备好。点选后,输入Password : 12345678,成功连线后,手机可透过模块来上网。
我们可以在调适终端上看到ETH-to-AP运行后,相关的设置讯息:
模块上电后看到USB端口打印s2[e2ap]: Ethernet Link Up (如图5.2,ETH-to-AP’s message in the terminal)表示以太网路成功连线。模块的Wi-Fi AP配置了MAC地址:00:60:6e:90:56:06,模块的以太网也同样配置了MAC地址00:60:6e:90:56:06。这两个配置的MAC地址,在之前提到的透传功能中,于最底层硬件概念上,有它的意义,而且不会出现在数据包的收送内容中。接著,模块运行ETH2AP功能,进行收送数据包,从DM9051NP网口收到数据包,就原封不动地透过Wi-Fi口转送出去,从Wi-Fi口收到数据包也原封不动由网口转送出去,此为『透传』。
5-3内网测试(Intranet)
这裡以华硕路由器(产品型号:ASUS RX3041)来进行内网测试,图中手机经由模块直接连线左方的路由器,并且从路由的DHCP server得到DHCP动态IP。路由器在内网这一段区域,它本身是一个网络站点,而且是内网的IP支配者。所以,路由肯定有一个静态IP,由于它是内网的IP支配者(就是DHCP server),所以,会分配动态IP给DHCP客户端(手机)。经查看华硕路由器手册,找到预先配置的静态IP为192.168.6.1。
此内网测试,在手机成功取得动态IP后,手机会出Wi-Fi AP已连上的状态图案。此时,同学开启网页流览器(Browser)来访问前述的192.168.6.1,也就是路由器的web server首页,路由器会要求同学登入帐户与密码,查看路由器手册后,得知帐户是admin,密码也是admin。登入后,手机即可访问路由器的web server首页,完成ETH-to-AP内网测试。
5-4 Iperf测试:
以Iperf测试DM9051NP有线网口性能,在SPI clock 20MHz下,获得下面TCP传输数据:
TX |
10.34 mbps |
RX |
9.58 mbps |
完。