RTL8762KD_EVB_Board-嘉立创EDA设计

概述

        这篇文章,只要介绍自己设计了一款开发板。只要是两方面:一原厂提供的开发板太贵;二没有自己设计的功能多,所以才自己设计了此款开发板。

此开发板分有两块设计,top_board与bottom_board。这里说明下,原理图尺寸太大截图原因看不清楚正常。第二也半属于商业机密,不完全开放请了解,谢谢。

一、原理图

1、top_board

2、bottom_board

二、PCB

1、top_board

2、bottom_board

三、3D效果图

1、top_board

2、bottom_board

=> mw 0x302478a8 0x600062; mw 0x302478bc 0x640160; mw 0x302478a0 0x2640066; gpio set 32; gpio set 21; gpio set 29; umdk_hw_init; umdk_mapping_clk_init 0 1; umdk_port_interface_init 0 2; umdk_phybase_set 0 0 1 0; umdk_phy08_init; umdkportset 0; gpio: pin 32 (gpio 32) value is 1 gpio: pin 21 (gpio 21) value is 1 gpio: pin 29 (gpio 29) value is 1 umdk hw is init done _phy_rtl8218e_id_get: enter--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port0, read phy page = 0x0 reg = 0x2 data = 0x1c _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port0, read phy page = 0x0 reg = 0x3 data = 0xc984 _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_id_get: chip_id0, port0, phy_id1 = 0x1c, phy_id2 = 0xc984 _phy_rtl8218e_id_get: enter--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port1, read phy page = 0x0 reg = 0x2 data = 0xffff _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port1, read phy page = 0x0 reg = 0x3 data = 0xffff _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_id_get: chip_id0, port1, phy_id1 = 0xffff, phy_id2 = 0xffff _phy_rtl8218e_id_get: enter--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port2, read phy page = 0x0 reg = 0x2 data = 0xffff _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port2, read phy page = 0x0 reg = 0x3 data = 0xffff _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_id_get: chip_id0, port2, phy_id1 = 0xffff, phy_id2 = 0xffff _phy_rtl8218e_id_get: enter--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port3, read phy page = 0x0 reg = 0x2 data = 0xffff _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port3, read phy page = 0x0 reg = 0x3 data = 0xffff _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_id_get: chip_id0, port3, phy_id1 = 0xffff, phy_id2 = 0xffff _phy_rtl8218e_init: enter--------------- _phy_rtl8218e_conf_per_port_init: enter--------------- _phy_rtl8218e_dummy_reg_init: enter--------------- _phy_rtl8218e_reg_write: enter--------------- _phy_rtl8218e_reg_write: end--------------- _phy_rtl8218e_dummy_reg_init: chip_id0 port0 phy 8218e dummy reg init done! _phy_rtl8218e_chip_rev_id_get: enter--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port0, read phy page = 0x327 reg = 0x15 data = 0x83 _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_chip_rev_id_get: chip_id0 port0 get chip RevId: 0x3 _phy_rtl8218e_sds_mode_get: enter--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port0, read phy page = 0x260 reg = 0x12 data = 0xd0 _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_sds_mode_get: chip_id0 port0 SDS mode: 0x3 _phy_rtl8218e_conf_per_port_init: end--------------- _phy_rtl8218e_sds_basic_config: enter--------------- _phy_rtl8218e_sds_basic_config: enter---------------1111111111111111 _phy_rtl8218e_sds_mode_get: enter--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port0, read phy page = 0x260 reg = 0x12 data = 0xd0 _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_sds_mode_get: chip_id0 port0 SDS mode: 0x3 _phy_rtl8218e_chip_rev_id_get: enter--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port0, read phy page = 0x327 reg = 0x15 data = 0x83 _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_chip_rev_id_get: chip_id0 port0 get chip RevId: 0x3 _phy_rtl8218e_sds_basic_config: end--------------- _phy_rtl8218e_green_en_set: enter---------------base_port = 0 _phy_rtl8218e_sds_mode_get: enter--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port0, read phy page = 0x260 reg = 0x12 data = 0xd0 _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_sds_mode_get: chip_id0 port0 SDS mode: 0x3 _phy_rtl8218e_green_en_set: if--------------- _phy_rtl8218e_green_en_set: if---------------end _phy_rtl8218e_green_en_set: end--------------- _phy_rtl8218e_power_set: enter--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_MDI _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port0, read phy page = 0x0 reg = 0x0 data = 0x1940 _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_reg_write: enter--------------- _phy_rtl8218e_reg_write: end--------------- _phy_rtl8218e_power_set: end--------------- _phy_rtl8218e_sds_mode_get: enter--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port0, read phy page = 0x260 reg = 0x12 data = 0xd0 _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_sds_mode_get: chip_id0 port0 SDS mode: 0x3 _phy_rtl8218e_sds_mode_get: enter--------------- _phy_rtl8218e_reg_read: enter--------------- _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_write ok _phy_rtl8218e_reg_read: PHY_RTL8218E_TYPE_SDS _phy_rtl8218e_page_read ok _phy_rtl8218e_reg_read: chip_id0 port0, read phy page = 0x260 reg = 0x12 data = 0xd0 _phy_rtl8218e_reg_read: end--------------- _phy_rtl8218e_sds_mode_get: chip_id0 port0 SDS mode: 0x3 _phy_rtl8218e_init: chip_id0, port0, phy initialization complete! _phy_rtl8218e_init: end--------------- set port: 0 => ping 172.14.48.149 umdk_start_call Using umdk_#0 device ARP Retry count exceeded; starting again ping failed; host 172.14.48.149 is not alive => 我这边的第一个phy的复位引脚,是mw 0x302478a8 0x600062;gpio set 32,32引脚,然后我使用这个mw命令去切gpio引脚模式,然后发现打印中显示初始化完成,但是还是ping不通,这是什么问题?
10-24
<think>我们面对的是一个嵌入式系统(可能是基于U-Boot或类似引导程序)中网络初始化的问题。用户提供了一系列的命令和日志,显示初始化过程似乎成功了,但最后ping不通指定的IP地址(172.14.48.149)。用户怀疑是复位引脚设置的问题,因为他使用了`mw 0x302478a8 0x600062`和`gpio set 32`来设置GPIO32(作为PHY的复位引脚)。 ### 分析过程: 1. **命令序列回顾**: - `mw`命令用于写入内存地址。`mw 0x302478a8 0x600062`:可能是配置GPIO控制器的寄存器,将GPIO32设置为输出模式或其他功能。 - 然后通过`gpio set 32`将GPIO32设置为高电平(1),以解除PHY的复位。 - 后续的`gpio set 21`和`gpio set 29`可能是对其他GPIO的操作。 - 然后执行了一系列的`umdk_*`命令,用于初始化硬件、时钟、端口、PHY等。 - 日志显示`umdk hw is init done`,并且对PHY(RTL8218E)的初始化过程有详细输出,包括读取PHY ID、配置寄存器等,最后显示`phy initialization complete`。 2. **日志分析**: - 在初始化PHY的过程中,我们看到只对port0进行了成功的初始化(读到了有效的PHY ID:0x1c和0xc984),而port1、port2、port3读取到的PHY ID都是0xffff,这通常表示这些端口上没有连接PHY或者连接有问题。 - 然后初始化程序只对port0进行了配置(包括dummy寄存器初始化、获取芯片版本、SDS模式配置、基本配置、绿色节能设置、电源设置等)。 - 最后,尝试ping 172.14.48.149时,出现“ARP Retry count exceeded”错误,表示没有收到ARP响应。 3. **可能的问题原因**: - **PHY硬件连接问题**:只有port0初始化成功,其他端口都失败。但用户可能只使用了port0,所以问题可能不在此。但是,如果目标设备连接在未初始化的端口上,也会不通。 - **网络配置问题**:在ping之前,没有看到配置IP地址的命令。我们需要确保开发板的IP地址和子网掩码与目标设备(172.14.48.149)在同一个子网内。在U-Boot中,通常使用`setenv ipaddr`来设置开发板的IP地址,然后才能ping通。 - **物理连接问题**:网线是否连接正确?是否连接到port0对应的网口? - **复位问题**:虽然复位引脚被拉高,但复位时序可能不符合PHY要求。例如,复位信号需要保持低电平足够长时间(通常至少10ms)才能保证PHY可靠复位,然后拉高。在用户的命令中,执行`gpio set 32`之前是否已经将GPIO32设置为输出?复位是否有效? - **PHY寄存器配置问题**:虽然初始化日志显示成功,但可能某些关键配置(如速率、双工模式、自动协商)没有正确完成。 - **时钟或电源问题**:PHY的时钟或电源配置不正确,导致PHY不能正常工作。 ### 解决方案: 1. **检查网络配置**:在U-Boot中,使用`printenv`查看环境变量,确认`ipaddr`(开发板IP)和`serverip`(目标服务器IP,这里ping的是172.14.48.149)是否在同一子网。如果没有设置,需要设置: ```bash setenv ipaddr 172.14.48.x # x为开发板IP,确保在同一子网 saveenv ``` 然后重新ping。 2. **检查物理连接**: - 确认网线连接到正确的网口(对应port0)。 - 尝试更换网线或连接到其他网络设备(如交换机)观察链路指示灯。 3. **检查硬件复位时序**: - 确保复位信号满足PHY的时序要求。通常复位流程: - 将复位引脚设置为输出。 - 拉低复位引脚,并保持一段时间(例如20ms)。 - 拉高复位引脚。 - 用户命令中只有`gpio set 32`(拉高),但没有拉低和延时。正确的复位序列应该是: ```bash # 假设GPIO32已经配置为输出(由mw命令完成) gpio clear 32 # 拉低,复位 # 需要延时,可以使用循环来实现延时(在U-Boot中可以使用md命令进行简单延时) md 0x100000 1000 # 延时一段时间(具体时间取决于CPU速度,可能需要调整) gpio set 32 # 拉高,释放复位 ``` - 注意:用户之前的mw命令`mw 0x302478a8 0x600062`可能是配置该GPIO为输出,但需要确认这个寄存器的含义(参考芯片手册)。 4. **检查PHY的状态寄存器**: - 在初始化后,可以读取PHY的状态寄存器(例如标准PHY状态寄存器1,地址0x1)来确认链路状态。 - 在U-Boot中,可以使用`mii`命令读取PHY寄存器。例如: ```bash mii read <phy_addr> <reg> ``` 其中`<phy_addr>`是PHY的地址(port0的地址可能是0),`<reg>`是寄存器地址。 - 读取基本控制寄存器(0x00)和状态寄存器(0x01): - 基本控制寄存器(0x00):通常写入0x1200(重启自动协商)或0x1400(100M全双工)等。 - 状态寄存器(0x01):查看位2(链路状态)是否为1(链路已建立)。 - 如果链路没有建立,尝试重启自动协商: ```bash mii write 0 0 0x1200 # 假设PHY地址为0 ``` 然后再次检查状态寄存器。 5. **检查PHY的SDS(SerDes)配置**: - 从日志中看到,PHY被配置为SDS模式0x3(可能是某种SerDes模式),这需要与MAC的配置匹配。确保MAC侧也配置了相同的模式。 ### 实施步骤建议: 1. 在U-Boot中设置正确的IP地址。 2. 确保复位时序正确:在`gpio set 32`之前,先拉低一段时间。 3. 使用`mii`工具检查PHY的链路状态。 4. 如果链路状态为down,检查网线连接,重启自动协商。 5. 如果仍然不行,检查PHY的配置(特别是SDS模式)是否与硬件设计匹配。 ### 示例代码(在U-Boot命令行中执行): 以下是一个复位PHY并检查链路的示例步骤(假设使用GPIO32复位,PHY地址为0): ```bash # 1. 配置GPIO32为输出(可能已经由之前的mw命令完成,这里再确认) # 2. 复位PHY gpio clear 32 # 拉低复位 # 延时(这里使用md命令延时,循环1000000次,具体时间需根据CPU频率调整) md 0x100000 1000000 # 大约1秒,实际根据需要调整(最少10ms) gpio set 32 # 释放复位 # 3. 重新初始化PHY(可以重新运行之前的umdk初始化命令) umdk_hw_init umdk_mapping_clk_init 0 1 umdk_port_interface_init 0 2 umdk_phybase_set 0 0 1 0 umdk_phy08_init umdkportset 0 # 4. 检查PHY状态 mii info # 列出所有PHY mii read 0 1 # 读取PHY0的状态寄存器(地址0x01) # 观察位2(link up)是否为1 # 5. 如果链路已建立,尝试ping ping 172.14.48.149 ``` ### 相关问题: 根据问题,提出以下相关问题: §§相关问题§§: 1. 如何通过U-Boot的mii命令读取和写入以太网PHY寄存器? 2. 在嵌入式Linux中,如何检查PHY的状态和配置? 3. RTL8218E PHY芯片的复位时序要求是什么? 4. 如何确认MAC和PHY之间的SerDes配置匹配? </think>### 问题分析 您提供的日志显示了 RTL8218E PHY 芯片初始化过程,但最终 ping 失败。根据日志分析,主要问题可能出在以下几个方面: 1. **PHY 初始化异常**: - Port0 初始化成功(读取到有效 PHY ID: 0x1c 和 0xc984) - Port1/2/3 读取到无效 PHY ID (0xffff),表明这些端口未检测到 PHY - 但端口设置命令 `umdkportset 0` 只激活了 Port0 2. **网络层问题**: - `ARP Retry count exceeded` 错误表明二层通信失败 - 可能原因:PHY 链路未建立、MAC 配置错误或 IP 地址问题 3. **硬件配置问题**: - 复位引脚配置正确(gpio 32 置高) - 但 PHY 电源/时钟/模式配置需要验证 ### 解决方案 #### 1. 检查链路状态 在 U-Boot 中添加链路状态检测命令: ```c // 在 umdkportset 0 后添加链路检查 => mii read 0 0x1 // 读取 PHY 状态寄存器 ``` 期望返回值: - Bit 2 = 1 (链路建立) - Bit 1 = 1 (协商完成) #### 2. 完整的 PHY 初始化序列 ```c // 确保复位时序正确 mw 0x302478a8 0x600062 // GPIO 模式配置 gpio clear 32 // 复位拉低 md 0x100000 // 延时约 1ms (根据 CPU 频率调整) gpio set 32 // 复位释放 md 0x100000 // 复位稳定时间 // 重新初始化序列 umdk_hw_init umdk_mapping_clk_init 0 1 umdk_port_interface_init 0 2 umdk_phybase_set 0 0 1 0 umdk_phy08_init umdkportset 0 // 强制重启自动协商 mw 0x302478a0 0x2640066 // 访问 PHY 寄存器 mii write 0 0 0x1200 // BMCR: 重启自动协商 + 100M 全双工 ``` #### 3. 网络配置检查 ```c // 设置正确的 IP 信息 => setenv ipaddr 172.14.48.150 // 开发板 IP => setenv gatewayip 172.14.48.1 // 网关 => setenv netmask 255.255.255.0 // 测试链路层通信 => arping 172.14.48.149 ``` ### 关键排查点解释 1. **复位时序问题**: - PHY 需要 >10μs 的低电平复位脉冲 - 日志中缺少复位拉低操作 `gpio clear 32` - 解决方案中添加了完整复位序列 2. **SDS 模式配置**: - 日志显示 `SDS mode: 0x3` (RGMII) - 需确认 MAC 侧也配置为 RGMII 模式 - 检查时钟配置 `umdk_mapping_clk_init 0 1` 中参数是否匹配硬件 3. **PHY 寄存器验证**: ```c // 关键寄存器检查 => mii read 0 0x1 // 状态寄存器 => mii read 0 0x11 // 扩展状态 => mii read 0 0x26012 // SDS 模式寄存器 ``` 期望值: - 0x1: Bit[2]=1 (Link up) - 0x11: Bit[4]=1 (1000M 能力) - 0x26012: 0x00D0 (SGMII/1000M) ### 常见故障原因 1. **硬件连接问题**: - 检查 Port0 的 RJ45 接口链路指示灯 - 确认 TX/RX 差分线阻抗匹配 2. **时钟配置错误**: - RTL8218E 需要 25MHz 参考时钟 - 验证时钟源配置 `umdk_mapping_clk_init 0 1` 3. **电气特性问题**: - 测量 PHY 的 1.0V/1.8V/3.3V 供电电压 - 检查复位引脚电压 (应 > 2.5V)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ch_champion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值