当前位置:   article > 正文

LWIP 以太网先启动后插入网线无法入网的解决办法_enet_phy_write_read

enet_phy_write_read
  1. 运行环境:系统RT-thread lwip2.0 mcu: GD32F470

  1. 问题描述:先插入网线后启动时以太网联网正常,但先启动,后插入网线时,无法入网。

  1. 原因:启动时若未插入网线,以太网初始化失败,虽然开启dhcp,但是无法分配dns及ip地址

  1. 解决办法:加入Link状态监测线程,关注网线link的变化,当检测到网线插入后,Link的状态未up,此时重新初始化emac。此时若dhcp开启,等待dhcp分配地址,分配到地址时,internet_state置为up。即可正常上网。

  1. 源码:

  1. /*检测网线插入*/
  2. #define LINK_CHECK_STACK_SIZE 256
  3. #define LINK_CHECK_PRIORITY RT_THREAD_PRIORITY_MAX/2
  4. #define LINK_CHECK_TIMESLICE 20
  5. static rt_thread_t tid1 = RT_NULL;
  6. void thread_linkCheck_start(void)
  7. {
  8. /* 初始化线程 thread_ptl_txt,名称是 ptltxt,入口是 thread_ptl_txt_entry */
  9. tid1=rt_thread_create("phy",
  10. eth_link_thread_entry,
  11. RT_NULL,
  12. LINK_CHECK_STACK_SIZE,
  13. LINK_CHECK_PRIORITY,
  14. LINK_CHECK_TIMESLICE);
  15. if(tid1!=RT_NULL)
  16. {
  17. rt_thread_startup(tid1);
  18. }
  19. }
  20. static int GET_PHY_LINKState(uint8_t *linkstate)
  21. {
  22. uint16_t phy_value = 0U;
  23. enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BSR, &phy_value);
  24. phy_value &= PHY_LINKED_STATUS;
  25. *linkstate = phy_value>0? 1:0;
  26. return (*linkstate);
  27. }
  28. //eth动态监测任务入口函数
  29. static void eth_link_thread_entry(void* parameter)
  30. {
  31. uint8_t u8link_state_now = 0; uint8_t u8link_state = 0;
  32. struct netif* pnetif = gd32_emac_device0.parent.netif;
  33. if (GET_PHY_LINKState(&u8link_state) != RT_TRUE)
  34. {
  35. rt_kprintf("cant load link state\n");
  36. }
  37. if(u8link_state)
  38. {
  39. u8link_state_now = 1;
  40. }
  41. while(1)
  42. {
  43. if (GET_PHY_LINKState(&u8link_state) != RT_TRUE) //检测网线连接
  44. {
  45. // rt_kprintf("cant load link state\n");
  46. }
  47. //网线接入
  48. if((u8link_state == 0)&&(u8link_state_now == 1))
  49. {
  50. u8link_state_now = 0;
  51. eth_device_linkchange(&gd32_emac_device0.parent, RT_FALSE);
  52. LOG_W("link break\n");
  53. }
  54. //网线断开
  55. if((u8link_state == 1)&&(u8link_state_now == 0))
  56. {
  57. u8link_state_now = 1;
  58. //重新配置MAC和DMA
  59. // phy_reset();
  60. gd32_emac_init((rt_device_t)&gd32_emac_device0);
  61. #if !LWIP_DHCP
  62. pnetif->ip_addr = inet_addr(RT_LWIP_IPADDR);
  63. pnetif->gw = inet_addr(RT_LWIP_GWADDR);
  64. pnetif->netmask = inet_addr(RT_LWIP_MSKADDR);
  65. #else
  66. IP4_ADDR(&(pnetif->ip_addr),0,0,0,0);
  67. IP4_ADDR(&(pnetif->netmask),0,0,0,0);
  68. IP4_ADDR(&(pnetif->gw),0,0,0,0);
  69. #endif
  70. //若开启了DHCP,会自动执行
  71. eth_device_linkchange(&gd32_emac_device0.parent, RT_TRUE);
  72. LOG_I("link on\n");
  73. }
  74. rt_thread_mdelay(1000);
  75. }
  76. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/67298
推荐阅读
相关标签
  

闽ICP备14008679号