GD32F107使用RTL8201F在LWIP-1.41上运行

找了很多资料,都找不到SMT32和GD32F系列驱动RTL8201F的方案,就算是驱动RTL8201F的硬件连接也很少,经过
努力,终于实现连接,分享给大家,让大家不再使用dp83848h的高成本方案,

主要是硬件的搭建,上图


网口变压器我使用TRC1102NL。
MRII_INT中断并不是必须的,反正都没用到
最重要一点就是RTL8201F有50M时钟输出,PA8的时钟就不要配置了,否则网卡芯片发热和不稳定
CPU的时钟再也不用为边个50M时钟去降频使用了
软件部份,主要是初始化部份。

#define PHY_BCR          0          /*!< Tranceiver Basic Control Register */
#define PHY_BSR          1          /*!< Tranceiver Basic Status Register */
#define PHY_ID1          2
#define PHY_ID2          3
#define PHY_ADDRESS      0x00       //RTL8201F地址,根据核心板硬件连接决定
#define RMII_MODE                   //配置网卡接口为RMII
#define ANLPAR         5          //这个才是协商寄存器

还有一个重要的寄存器是16,配置RTL8201F输出50M时钟
RTL8201F初始化

 if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_Reset)))
  {
    /* Return ERROR in case of write timeout */
    return ETH_ERROR;
  }
 
  /* Delay to assure PHY reset */
  _eth_delay_(PHY_ResetDelay);
 
  if(ETH_InitStruct->ETH_AutoNegotiation == ETH_AutoNegotiation_Enable)
  {  
    /* We wait for linked satus... */
    ETH_WritePHYRegister(PHYAddress, 16, 0x031B);        //RMII  50M输出模式,CRS_DV
    do
    {
      timeout++;
    } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
    /* Return ERROR in case of timeout */
    if(timeout == PHY_READ_TO)
    {
      return ETH_ERROR;
    }
    /* Reset Timeout counter */
    timeout = 0;
    
    /* 启用自动协商 */
    if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_AutoNegotiation)))
    {
      /* Return ERROR in case of write timeout */
      return ETH_ERROR;
    }
    
    /* 等到自动协商完成 */
    do
    {
      timeout++;
    } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO));  
    /* Return ERROR in case of timeout */
    if(timeout == PHY_READ_TO)
    {
      return ETH_ERROR;
    }
    /* Reset Timeout counter */
    timeout = 0;
    
    /* 阅读自动协商的结果 */
//    RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR);
      RegValue = ETH_ReadPHYRegister(PHYAddress, ANLPAR);
    /* 使用由自动协商过程修复的双工模式配置MAC*/
    if((RegValue & PHY_ANLPAR_100TXFD)||(RegValue & PHY_ANLPAR_10TXFD))
    {
      /* 自动协商后将以太网双工模式设置为FullDuplex */
      ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;       
    }
    else
    {
      /* 自动协商后将以太网双工模式设置为HalfDuplex */
      ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;           
    }
    /* 使用自动协商过程确定的速度配置MAC */
    if((RegValue & PHY_ANLPAR_100TX)||(RegValue & PHY_ANLPAR_100TXFD))
    {  
      /* 自动协商后将以太网速度设置为100M */    
       ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
    }
    else
    {   
      /* 自动协商后将以太网速度设置为10M */
      ETH_InitStruct->ETH_Speed = ETH_Speed_10M;        
    }    
  }

还有一个就是断线重连和没有网线的时候重启

/*******************************
函数功能:断线重连
********************************/
void Eth_Link_ITHandler(void)
{
/* Check whether the link interrupt has occurred or not */

   // if(((ETH_ReadPHYRegister(PHY_ADDRESS, PHY_BSR)) & PHY_BSR) != 0){/*检测插拔中断*/
    if((ETH_ReadPHYRegister(PHY_ADDRESS, PHY_BSR) & PHY_Linked_Status) == 0x00){
        uint16_t status = ETH_ReadPHYRegister(PHY_ADDRESS, PHY_BSR);
        if(status & (PHY_AutoNego_Complete | PHY_Linked_Status)){/*检测到网线连接*/
            if(EthInitStatus != 1){/*if(EthInitStatus != ETH_SUCCESS)之前未成功初始化过*/
                /*Reinit PHY*/
                ETH_Reinit();
            }
            else{/*之前已经成功初始化*/
                /*set link up for re link callbalk function*/
                netif_set_link_up(&netif);
            }
        }
        else{/*网线断开*/\
            /*设置链接以重新链接callbalk功能*/
            netif_set_link_down(&netif);
        }
        IGMP_UP_Time = 0;  //掉线标志位
    }
}


查询放在这里了

//LWIP周期性任务
void lwip_periodic_handle()
{
#if LWIP_TCP
    //每250ms调用一次tcp_tmr()函数
  if (LWipTime - TCPTimer >= 250)
  {
    TCPTimer =  LWipTime;
    tcp_tmr();
  }
   #if LWIP_IGMP
        if(IGMP_UP_Time>=2){
            IGMP_UP_Time=3;
            igmp_tmr();           //如果有使用组播,250ms也是正常的
        }
    #endif    
#endif
  //ARP每5s周期性调用一次
  if ((LWipTime - ARPTimer) >= ARP_TMR_INTERVAL)
  {
    ARPTimer =  LWipTime;
    etharp_tmr();
    IGMP_UP_Time++;
    Eth_Link_ITHandler();   //断线重连
  }

#if LWIP_DHCP //如果使用DHCP的话
  //每500ms调用一次dhcp_fine_tmr()
  if (LWipTime - DHCPfineTimer >= DHCP_FINE_TIMER_MSECS)
  {
    DHCPfineTimer =  LWipTime;
    dhcp_fine_tmr();
  }

  //每60s执行一次DHCP粗糙处理
  if (LWipTime - DHCPcoarseTimer >= DHCP_COARSE_TIMER_MSECS)
  {
    DHCPcoarseTimer =  LWipTime;
    dhcp_coarse_tmr();
  }  
#endif

}

资料上传百度网盘。

资料下载





  • 11
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
gd32f107原理图是指GigaDevice推出的一款微控制器芯片的电路原理图。gd32f107是基于ARM Cortex-M3内核的高性能微控制器,具有低功耗、高速运算和丰富的外设接口等特点。 gd32f107原理图通常包含各种外围电路和连接关系的图示,包括电源电路、时钟电路、复位电路、存储器接口、外设接口等。通过该原理图,可以清晰了解芯片各个功能模块之间的连接方式和针脚分配情况。 电源电路是gd32f107正常运行所需的基础,通常包括电源接入及整流、稳压器等。时钟电路为芯片提供稳定的工作时钟信号,包括晶振、时钟发生器等。复位电路用来对芯片进行复位操作,保证其在启动时处于初始状态。 存储器接口用于连接片内的Flash存储器和RAM,以便程序的运行和数据的存储。外设接口涵盖了数字输入输出口、通用定时器/计数器、串口、SPI、I2C等,在实际应用中可以通过开发板或外部电路进行扩展。 在gd32f107原理图中,各个功能模块之间的连接关系清晰明了,通过阅读原理图,可以帮助工程师们更好地了解该芯片的电路结构,实现对其进行合理的设计和调试。 总之,gd32f107原理图是一份重要的参考资料,对于工程师们来说是不可或缺的。通过深入研究原理图,可以更好地理解芯片的特性和各功能模块之间的关系,从而更好地开发并应用gd32f107微控制器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值