ESP32P4使用RMII驱动CH182D
我们使用的是sergeykharenko/ch182 • v0.0.1 • ESP Component Registry 这个组件库首先感谢作者的开源提供该组件库感谢乐鑫及沁恒官方提供的技术支持。下面是原理图部分该芯片数据手册CH182D -PDF数据手册-参考资料-立创商城下面是软件驱动部分首先我们创建一个空项目我这里以ESP32-P4为例。打开控制台输入idf.py add-dependency sergeykharenko/ch182^0.0.1运行后可以发现自动新建了一个idf_component.yml文件并且发现这个组件已经加入下面我们编译一下可以看到这个组件已经被我们引入进来。编写main.c文件/* * CH182D以太网驱动主程序 * 基于用户引脚配置的ETH_2 (RMII接口) * CH182D 输出 REFCLK 到 ESP32-P4 */ #include stdio.h #include string.h #include freertos/FreeRTOS.h #include freertos/task.h #include esp_netif.h #include esp_eth.h #include esp_eth_phy_ch182.h #include esp_event.h #include esp_log.h #include driver/gpio.h #include sdkconfig.h // ETH_2 配置 (RMII, 使用CH182D PHY) #define ETH0_RMII_RXD1_GPIO 47 #define ETH0_RMII_RXD0_GPIO 46 #define ETH0_RMII_CRS_DV_GPIO 45 #define ETH0_RMII_CLK_GPIO 44 #define ETH0_RMII_TXD1_GPIO 42 #define ETH0_RMII_TXD0_GPIO 41 #define ETH0_RMII_TX_EN_GPIO 40 #define ETH0_MDIO_GPIO 22 #define ETH0_MDC_GPIO 23 #define ETH0_RST_GPIO 33 #define ETH0_PHY_ADDR 1 static const char *TAG eth_main; // 以太网句柄 static esp_eth_handle_t s_eth_handle NULL; // 获取IP地址事件处理 static void got_ip_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { ip_event_got_ip_t *event (ip_event_got_ip_t *) event_data; const esp_netif_ip_info_t *ip_info event-ip_info; ESP_LOGI(TAG, ); ESP_LOGI(TAG, Ethernet Got IP Address); ESP_LOGI(TAG, ~~~~~~~~~~~); ESP_LOGI(TAG, IP: IPSTR, IP2STR(ip_info-ip)); ESP_LOGI(TAG, MASK: IPSTR, IP2STR(ip_info-netmask)); ESP_LOGI(TAG, GATEWAY: IPSTR, IP2STR(ip_info-gw)); ESP_LOGI(TAG, ~~~~~~~~~~~); ESP_LOGI(TAG, ); } /** * brief 初始化以太网接口 */ static esp_err_t eth0_init(esp_eth_handle_t *eth_handle) { esp_err_t ret ESP_OK; // 配置RMII引脚 (ESP32-P4) eth_esp32_emac_config_t esp32_emac_config ETH_ESP32_EMAC_DEFAULT_CONFIG(); // 设置SMI (MDIO/MDC) 引脚 esp32_emac_config.smi_gpio.mdc_num ETH0_MDC_GPIO; esp32_emac_config.smi_gpio.mdio_num ETH0_MDIO_GPIO; // 设置RMII数据引脚 esp32_emac_config.emac_dataif_gpio.rmii.tx_en_num ETH0_RMII_TX_EN_GPIO; esp32_emac_config.emac_dataif_gpio.rmii.txd0_num ETH0_RMII_TXD0_GPIO; esp32_emac_config.emac_dataif_gpio.rmii.txd1_num ETH0_RMII_TXD1_GPIO; esp32_emac_config.emac_dataif_gpio.rmii.crs_dv_num ETH0_RMII_CRS_DV_GPIO; esp32_emac_config.emac_dataif_gpio.rmii.rxd0_num ETH0_RMII_RXD0_GPIO; esp32_emac_config.emac_dataif_gpio.rmii.rxd1_num ETH0_RMII_RXD1_GPIO; // 设置RMII时钟配置 - CH182D 输出 REFCLK 到 ESP32-P4 esp32_emac_config.clock_config.rmii.clock_mode EMAC_CLK_EXT_IN; esp32_emac_config.clock_config.rmii.clock_gpio ETH0_RMII_CLK_GPIO; // 配置MAC eth_mac_config_t mac_config ETH_MAC_DEFAULT_CONFIG(); // 配置PHY eth_phy_config_t phy_config ETH_PHY_DEFAULT_CONFIG(); phy_config.phy_addr ETH0_PHY_ADDR; phy_config.reset_gpio_num ETH0_RST_GPIO; // phy_config.post_hw_reset_delay_ms 100; // 如果出现硬件重启超时导致芯片重启的情况试一下硬件复位后等待100ms // 使用CH182 PHY驱动 - CH182D输出REFCLK esp_eth_phy_t *phy esp_eth_phy_new_ch182(phy_config); // 创建MAC实例 esp_eth_mac_t *mac esp_eth_mac_new_esp32(esp32_emac_config, mac_config); // 创建以太网驱动实例 esp_eth_config_t eth_config ETH_DEFAULT_CONFIG(mac, phy); ret esp_eth_driver_install(eth_config, eth_handle); if (ret ! ESP_OK) { ESP_LOGE(TAG, Failed to install Ethernet driver: %s, esp_err_to_name(ret)); return ret; } ESP_LOGI(TAG, Ethernet driver initialized successfully); ESP_LOGI(TAG, PHY: CH182D at address %d, ETH0_PHY_ADDR); ESP_LOGI(TAG, Interface: RMII); ESP_LOGI(TAG, Clock: CH182D OUT - ESP32-P4 IN); ESP_LOGI(TAG, SMI: MDCGPIO%d, MDIOGPIO%d, ETH0_MDC_GPIO, ETH0_MDIO_GPIO); ESP_LOGI(TAG, RX: RXD0GPIO%d, RXD1GPIO%d, CRS_DVGPIO%d, ETH0_RMII_RXD0_GPIO, ETH0_RMII_RXD1_GPIO, ETH0_RMII_CRS_DV_GPIO); ESP_LOGI(TAG, TX: TXD0GPIO%d, TXD1GPIO%d, TX_ENGPIO%d, ETH0_RMII_TXD0_GPIO, ETH0_RMII_TXD1_GPIO, ETH0_RMII_TX_EN_GPIO); ESP_LOGI(TAG, CLK: GPIO%d (input from CH182D), ETH0_RMII_CLK_GPIO); ESP_LOGI(TAG, RST: GPIO%d, ETH0_RST_GPIO); return ESP_OK; } /** * brief 以太网事件处理函数 */ static void eth0_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { switch (event_id) { case ETHERNET_EVENT_CONNECTED: ESP_LOGI(TAG, Ethernet Link Up); break; case ETHERNET_EVENT_DISCONNECTED: ESP_LOGW(TAG, Ethernet Link Down); break; case ETHERNET_EVENT_START: ESP_LOGI(TAG, Ethernet Started); break; case ETHERNET_EVENT_STOP: ESP_LOGI(TAG, Ethernet Stopped); break; default: break; } } void app_main(void) { ESP_LOGI(TAG, ); ESP_LOGI(TAG, CH182D Ethernet Driver); ESP_LOGI(TAG, ); ESP_LOGI(TAG, ); // 初始化TCP/IP网络接口 ESP_ERROR_CHECK(esp_netif_init()); // 创建默认事件循环 ESP_ERROR_CHECK(esp_event_loop_create_default()); // 创建默认的以太网网络接口 esp_netif_config_t cfg ESP_NETIF_DEFAULT_ETH(); esp_netif_t *eth_netif esp_netif_new(cfg); // 注册事件处理器 ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, got_ip_event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, eth0_event_handler, NULL)); // 初始化以太网驱动 ESP_ERROR_CHECK(eth0_init(s_eth_handle)); // 将以太网驱动附加到TCP/IP协议栈 ESP_ERROR_CHECK(esp_netif_attach(eth_netif, esp_eth_new_netif_glue(s_eth_handle))); // 启动以太网驱动 ESP_LOGI(TAG, Starting Ethernet driver...); ESP_ERROR_CHECK(esp_eth_start(s_eth_handle)); ESP_LOGI(TAG, ); ESP_LOGI(TAG, Waiting for IP address...); ESP_LOGI(TAG, ); // 主循环 - 保持运行 while (1) { vTaskDelay(pdMS_TO_TICKS(5000)); } }编译运行即可但运行时发现LINK指示灯在网线插入前闪烁插入后不闪烁ACT指示灯指示正常我看到组件中ch182.h文件中ETH_DEFAULT_LED_MODE可以更换指示灯模式但我全都试了一边发现并没有正确的模式。各位大佬如果看出哪里有问题请在评论区说一下。注意事项硬件方面需要注意的是如果CH182D外接晶振并且由CH182D提供RMII_CLK的话RXD0引脚不要接上拉电阻这个在数据手册中有体现。并且TX RX这些引脚也不需要接上拉这些在CH182D内部已接上拉、下拉。在终端中引入组件时报错无法将“idf.py”项识别为 cmdlet、函数、脚本文件或可运行解决办法是打开的这个ESP-IDF Terminal 这个终端才能正常运行。烧录中报错A fatal error occurred: bootloader/bootloader.bin requires chip revision in range [v3.1 - v3.99] (this chip is revision v1.3). Use --force to flash anyway.解决办法将menuconfig中Chip revision改为V1.0 , 改完保存重新编译下载。

相关新闻

Linux服务器环境配置与Python开发环境搭建完全指南

Linux服务器环境配置与Python开发环境搭建完全指南

本文基于CentOS 7/8和Ubuntu 22.04 LTS系统,涵盖系统管理、环境配置、Python安装、深度学习框架部署等实战内容。 一、系统基础信息查看 1.1 查看操作系统版本 在开始任何配置之前,首先需要确认操作系统类型和版本: # CentOS/RHEL 系统 ca…

2026/7/7 5:05:10 阅读更多 →
T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他

T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他

两拇炒诙一般而言,代码可分为同步与异步两类。两者同样需要等待操作完成:同步会阻塞当前线程,直至操作结束后再继续执行后续逻辑;异步则不阻塞当前线程,而是在发起操作时预先注册完成后的处理逻辑,待操作完…

2026/7/5 23:00:06 阅读更多 →
JVM对象分配:如何在高并发下安全高效地分配内存

JVM对象分配:如何在高并发下安全高效地分配内存

Java堆是所有线程共享的。如果多个线程同时分配对象,对堆内存分配指针的并发修改必须加锁。但全局加锁太慢,会严重影响吞吐量。 JVM的做法是分层处理,尽量避免加锁,非要加也用最轻的方式。 栈上分配(最快) …

2026/7/6 2:07:54 阅读更多 →

最新新闻

Playwright与MCP协议结合:用自然语言驱动浏览器自动化测试

Playwright与MCP协议结合:用自然语言驱动浏览器自动化测试

1. 项目概述:当Playwright遇上MCP,测试自动化迎来“对话式”革命 如果你是一名前端开发者、测试工程师,或者任何需要和浏览器打交道的技术人,最近一定被两个词刷屏了: Playwright 和 MCP 。前者是微软开源的现代浏…

2026/7/7 20:25:09 阅读更多 →
Switch游戏机畅享B站:wiliwili第三方客户端终极使用指南

Switch游戏机畅享B站:wiliwili第三方客户端终极使用指南

Switch游戏机畅享B站:wiliwili第三方客户端终极使用指南 【免费下载链接】wiliwili 第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili 你是否曾经想…

2026/7/7 20:23:08 阅读更多 →
从真实案例剖析SQL注入与XSS攻击:防御实战与靶场演练

从真实案例剖析SQL注入与XSS攻击:防御实战与靶场演练

1. 项目概述:从真实案例看Web安全的两大“顽疾”干了这么多年安全开发和渗透测试,我见过太多因为SQL注入和XSS(跨站脚本攻击)导致的数据泄露、网站被黑甚至公司倒闭的案例。很多开发者,尤其是刚入行的朋友,…

2026/7/7 20:21:08 阅读更多 →
构建高效自动化渗透测试体系:从架构设计到工程实践

构建高效自动化渗透测试体系:从架构设计到工程实践

1. 项目概述与核心理念在安全行业摸爬滚打八年,尤其是在一线攻防对抗和内部安全建设里泡了这么久,我越来越深刻地感受到一个趋势:单靠“人肉”堆砌的渗透测试,无论是效率、覆盖面还是持续性,都已经跟不上现代企业资产膨…

2026/7/7 20:19:07 阅读更多 →
如何快速掌握Java反编译神器:Luyten完整操作指南

如何快速掌握Java反编译神器:Luyten完整操作指南

如何快速掌握Java反编译神器:Luyten完整操作指南 【免费下载链接】Luyten An Open Source Java Decompiler Gui for Procyon 项目地址: https://gitcode.com/gh_mirrors/lu/Luyten 你是否曾经面对编译后的Java字节码文件感到无从下手?想要理解第三…

2026/7/7 20:19:07 阅读更多 →
XSS攻防实战:从靶场到IDE辅助的漏洞分析与防御

XSS攻防实战:从靶场到IDE辅助的漏洞分析与防御

1. 项目概述:从靶场到实战,一次完整的XSS攻防思维重塑最近在整理自己的Web安全学习笔记,翻到了几年前啃下来的xss-lab靶场记录。这个由PHP编写、包含20个经典关卡的XSS练习平台,可以说是无数安全从业者的“启蒙老师”。有意思的是…

2026/7/7 20:17:04 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻