【原创】LWIP技术--->答网友问081112(board_eth_rcv)

网友 gaozhenjiang-002 提出来的问题如下:

我在看你的网卡驱动时,对于board_eth_rcv这个函数没看太懂,尤其是下面这段

 SetRegPage(1);
 RxPageEnd = inportb(CURR);
 LWIP_DEBUGF(RTL8019_DEBUG, ("RTL8019's CURR = %d \r\n",RxPageEnd));
 
 SetRegPage(0);

 RxPageBeg = rBNRY+1;
 if(RxPageBeg>=RPSTOP)
 RxPageBeg = RPSTART;
 
 outportb(0x22, BaseAddr);

 outportb(0, RSAR0); 
 outportb(RxPageBeg, RSAR1);
 outportb(4, RBCR0); 
 outportb(0, RBCR1);
 outportb(0xa, BaseAddr);

 RxLength   = inportw(RWPORT);
 RxStatus   = RxLength&0xff;
 RxNextPage = RxLength>>8;
 RxLength   = inportw(RWPORT);
 RxLength  += RxLength&1;

那么我就针对这段代码做一个简单的解释,如果有不明白的地方,请继续提问。

首先我先介绍一下void SetRegPage(U8 PageIdx)这个函数

void SetRegPage(U8 PageIdx)
{
 U8 temp;
 
 temp = inportb(BaseAddr); 
 temp = (temp&0x3b)|(PageIdx<<6);      
 outportb(temp, BaseAddr);
}

这个你要是对8019这颗芯片有了解的话,我想你应该能看的明白,它主要实现的功能是:设置8019选中页地址

RxPageEnd = inportb(CURR);
上面这句话的意思是:读出当前接收缓冲区的地址指针

LWIP_DEBUGF(RTL8019_DEBUG, ("RTL8019's CURR = %d \r\n",RxPageEnd));

这句话是为了调试的时候方便查看各个寄存器而写的调试语句,可以不去考虑。

 SetRegPage(0);

 RxPageBeg = rBNRY+1;  //rBNRY 初始值 0x4C
 if(RxPageBeg>=RPSTOP)  //RPSTOP  = 0x80
  RxPageBeg = RPSTART; //RPSTART = 0x4C
 
 outportb(0x22, BaseAddr); //启动RTL8019

 outportb(0, RSAR0);   //RSAR0、RSAR1 设置远程DMA起始地址
 outportb(RxPageBeg, RSAR1);
 outportb(4, RBCR0);   //RBCR0、RBCR1 设置远程DMA数据字节数
 outportb(0, RBCR1);
 outportb(0xa, BaseAddr); //启动DMA读操作

这些都是针对8019这颗芯片寄存器做的一些设置,具体参数你可以参考datasheet,这里我就不做详细的介绍了。

 RxLength   = inportw(RWPORT);
 RxStatus   = RxLength&0xff;
 RxNextPage = RxLength>>8;
 RxLength   = inportw(RWPORT);
 RxLength  += RxLength&1;

这个就是读取数据的长度,8019芯片存放数据长度是放在两个寄存器里面,你需要读两次 ,才能读出来争取的结果。

所以我感觉对于上面的程序,都是针对8019这个芯片的一些基本的设置和操作。你可以在看代码前,先去看看这颗芯片的资料,对这个芯片的寄存器有所了解,然后再去试着看程序,读懂程序。

 

 

 

 

## 01、数据介绍 数据整理全国30个省份制造业细分行业产值,能够反映一定时期内细分行业工业生产总规模和总水平的指标,是计算工业生产发展速度和主要比例关系、计算工业产品销售率等其他经济指标的基础。先进制造业数据可用于两业融合测算。 数据名称:全国30省-制造业细分行业产值/先进制造业细分行业产值数据 数据年份:2001-2022年 ## 02、数据指标 农副食品加工业;食品制造业;饮料制造业;烟草制造业;纺织业;纺织服装鞋帽制造业;皮革、毛皮、羽毛(绒)极其制品业;木材加工及木、竹、藤、棕、草制品业;家具制造业;造纸及纸制品业;印刷业和记录媒介的复制;文教体育用品制造业;石油加工、炼焦及核燃料加工业化;学原料及化学制品制造业;医药制造业;化学纤维制造业;橡胶和塑料制品制品业;非金属矿物制品业;黑色金属冶炼及压延加工业;有色金属冶炼及压延加工业;金属制品业;通用设备制造业;专用设备制造业;汽车制造业;其他运输设备制造业;电气机械及器材制造业;通信设备计算机及其他电子设备制造业;仪器仪表及文化、办公用机械制造业;其他制造业;废弃资源和废旧材料回收加工业;制造业总产值 印刷业和记录媒介的复制;石油加工、炼焦及核燃料加工业;化学原料及化学制品制造业;医药制造业;橡胶和塑料制品制品业;非金属矿物制品业;黑色金属冶炼及压延加工业;有色金属冶炼及压延加工业;金属制品业;通用设备制造业;专用设备制造业;汽车制造业;其他运输设备制造业;电气机械及器材制造业;通信设备计算机及其他电子设备制造业;仪器仪表及文化、办公用机械制造业;废弃资源和废旧材料回收加工业
<think>嗯,用户想基于STM32H723和RTL8201开发以太网驱动程序,并确保能通过ping测试。首先,我需要回忆一下STM32H7系列的以太网模块相关知识。记得STM32H723用的是MAC层,需要外接PHY芯片,这里用的是RTL8201。硬件引脚配置是关键,可能参考了之前类似的题,比如引用[2]提到的DP83848的引脚配置,但RTL8201的接口可能不同。需要确认RTL8201是RMII还是MII接口,通常RMII更常见,所以可能需要配置STM32的RMII相关引脚。 接下来,硬件连接部分。用户可能需要知道具体的引脚映射,比如REF_CLK、TXD0、TXD1、CRS_DV等对应的GPIO。比如引用[2]中提到的一些引脚分配,但需要根据STM32H723的数据手册调整,确保每个信号线正确连接到RTL8201的对应引脚。另外,时钟部分也很重要,PHY需要外部时钟或由MCU提供,这里RTL8201可能使用外部25MHz晶振,或者通过STM32的REF_CLK输出,需要确认。 然后是软件配置,包括初始化MAC和PHY。可能需要使用HAL库或者LL库来配置以太网外设。PHY的初始化可能要通过SMI(MDIO和MDC)进行寄存器配置,比如设置自动协商、双工模式等。引用[1]中提到去掉上拉电阻解决了题,所以硬件设计上可能需要检查上下拉电阻是否正确,尤其是PHY的复位和配置引脚。 接下来是驱动程序的编写,涉及到DMA描述符的配置,发送和接收数据包的处理。可能还需要实现ARP、ICMP协议来响应ping请求。在测试阶段,如果ping不通,可能需要检查PHY的寄存器状态,比如链接是否建立,是否有数据收发。使用示波器或逻辑分析仪检查时钟信号和数据线是否有活动,引用[1]中提到的时钟信号检测是关键步骤。 最后,确保生成的代码正确集成到项目中,比如正确的中断处理、缓冲区管理。可能还需要配置LWIP或类似的网络协议栈,确保协议栈正确初始化并与硬件驱动配合。用户可能需要详细的步骤,比如CubeMX的配置,代码示例,以及调试技巧。总结时需要强调硬件检查、时钟配置、引脚映射和PHY寄存器设置的重要性,这些都是导致ping不通的常见原因。</think>### STM32H723与RTL8201以太网驱动开发指南 #### 一、硬件配置要点 1. **引脚映射与接口类型** RTL8201支持RMII接口,需配置STM32H723的RMII相关引脚(参考数据手册)。以下为典型引脚配置: - RMII_REF_CLK: PA1(需外部25MHz时钟输入) - RMII_TXD0/TXD1: PB12/PB13 - RMII_RXD0/RXD1: PC4/PC5 - RMII_CRS_DV: PA7 - RMII_MDC/MDIO: PC1/PA2(用于PHY寄存器配置)[^2] 2. **硬件设计验证** - 确保RTL8201的复位引脚(RST)正确连接到STM32 GPIO,并配置上电复位时序 - 检查RMII_REF_CLK信号是否稳定(25MHz±50ppm),可用示波器测量[^1] #### 二、软件驱动开发步骤 1. **CubeMX配置** ```c // 启用ETH外设,选择RMII模式 ETH_HandleTypeDef heth; heth.Instance = ETH; heth.Inx.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE; heth.Inx.Speed = ETH_SPEED_100M; heth.Inx.DuplexMode = ETH_MODE_FULLDUPLEX; ``` 2. **PHY初始化(RTL8201)** ```c // 通过MDIO配置PHY寄存器 HAL_ETH_WritePHYRegister(&heth, RTL8201_BMCR, PHY_AUTONEGOTIATION); while (!(HAL_ETH_ReadPHYRegister(&heth, RTL8201_BMSR) & PHY_AUTONEG_MASK)); ``` 3. **LWIP协议栈集成** ```c // 初始化LWIP内存池 mem_init(); tcpip_init(NULL, NULL); netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &eth;ernetif_init, &tcpip_input); ``` #### 三、Ping测试调试技巧 1. **常见故障排查** - **现象:** ARP请求无响应 **解决:** 检查MAC地址配置`heth.Inx.MACAddr`是否合法 - **现象:** 接收数据CRC错误 **解决:** 调整PHY寄存器`RTL8201_CR`的延迟参数[^1] 2. **关键验证点** ```shell # 使用Wireshark抓包验证 tcpdump -i eth0 -n -v icmp ``` #### 四、完整代码框架 ```c // 以太网中断处理 void ETH_IRQHandler(void) { HAL_ETH_IRQHandler(&heth); } // 数据接收回调 void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth) { ethernetif_input(&gnetif); } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值