OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7894|回复: 5

F407,参考网上大神移植了FreeRTOS+LWIP+MQTT。热插拔功能有问题。

[复制链接]

28

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2018-1-11
在线时间
64 小时
发表于 2021-8-2 22:24:18 | 显示全部楼层 |阅读模式
10金钱
我是使用的标准库,目前完成的功能是移植验证基本功能没问题。插好网线上电,系统启动起来之后再拔网线插网线,可以动态路由到IP。但是如果上电之后再插网线,就不能动态路由到IP了。各位大神给点这方面的建议。
我估计是没插网线,初始化有什么资源没开起来。我检查了LAN8720初始化,没发现什么问题。
//读取LAN8720网线连接状态 插入的时候需要检测到link为1且自动协商完成 拔出任意为1则连接层异常
u8 LAN8720_Get_hotplugstatus(void)
{
        u8 state;
        state=ETH_ReadPHYRegister(0x00,1)& (0x0020U | 0x0004U); //0x0020U:自动协商  0x0004U:link
        return state;
}


/*热插拔检测任务*/
void lwip_hotplug_detect_task(void *pdata)
{
        eTaskState taskstate;
        while(1)
        {
                /*读取当前LAN8720的状态 和上次的状态比较 发生变化做处理*/
                lwipdev.hotplugstatus_now = LAN8720_Get_hotplugstatus();
               
                if(lwipdev.hotplugstatus_now != lwipdev.hotplugstatus_last)                                  //检测到连接状态发生变化
                {
                        lwipdev.hotplugstatus_last = lwipdev.hotplugstatus_now;                            //保存状态
                        if(lwipdev.hotplugstatus_now)                                                //如果已连接或自协商已经完成(网线插入)
                        {
                                printf("lwip_hotplug_detect_task 网线接入\r\n");
                                if(lwipdev.stack_isInit)                                                      //如果已经初始化过
                                {
                                        netif_set_link_up(&lwip_netif);                                                                                       //重新连接
                                        lwipdev.dhcpstatus = DHCP_NONE;                                                               //重新启动DHCP
                                        lwip_netif.ip_addr.addr = 0;                                                                                          //清除IP地址
                                        printf("lwip_hotplug_detect_task 创建DHCP任务 1\r\n");
                                        lwip_comm_dhcp_creat();                                                     //创建dhcp任务
                                }
                                else                                                                        //如果没初始化过
                                {
                                        if(lwip_comm_init()==0)                                                   //初始化
                                        {
                                                printf("lwip_hotplug_detect_task lwip_comm_init\r\n");
                                                lwipdev.dhcpstatus = DHCP_NONE;                                                     //重新启动DHCP
                                                lwip_netif.ip_addr.addr = 0;                                                                                //清除IP地址
                                                printf("lwip_hotplug_detect_task 创建DHCP任务 2\r\n");
                                                lwip_comm_dhcp_creat();                                                 //创建dhcp任务
                                        }
                                }
                        }
                        else                                                                          //如果连接断开
                        {
                                printf("lwip_hotplug_detect_task 网线断开\r\n");
                                taskstate = eTaskGetState(DHCPTask_Handler);                                //获取dhcp任务状态
                                if(taskstate != eDeleted)
                                {
                                        printf("lwip_hotplug_detect_task 删除DHCP任务\r\n");
                                        lwip_comm_dhcp_delete();                                                  //删除dhcp任务
                                }
                                printf("lwip_hotplug_detect_task 删除MQTT任务\r\n");
                                MQTT_task_delete();
                                netif_set_link_down(&lwip_netif);                                                                       //断开网络
                                //lwipdev.stack_isInit=0;//????
                        }
                }
               
                /*DHCP ip成功或者使用静态IP 则创建MQTT任务*/
                if(lwipdev.dhcpstatus == DHCP_DONE)/*||(lwipdev.dhcpstatus == DHCP_FAIL)*/
                {
                                lwipdev.dhcpstatus = DHCP_NONE;
                               
                                printf("lwip_hotplug_detect_task 创建MQTT任务\r\n");
                                MQTT_task_creat();
                }

                vTaskDelay(200);
        }

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2018-1-11
在线时间
64 小时
 楼主| 发表于 2021-8-2 22:56:47 | 显示全部楼层
刚刚查看代码,没插网线应该  LAN8720_Init-》ETH_MACDMA_Config-》ETH_Init  中
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;
    }
应该失败才对啊,为什么没有返回错误?@正点原子
回复

使用道具 举报

28

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2018-1-11
在线时间
64 小时
 楼主| 发表于 2021-8-4 09:05:12 | 显示全部楼层
来人啊,给点意见我周末调
回复

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-9-14
在线时间
16 小时
发表于 2021-11-11 17:16:15 | 显示全部楼层
JImLu 发表于 2021-8-4 09:05
来人啊,给点意见我周末调

解决没有,我碰到的问题是热插拔网线后,能够和服务器建立连接,但是不能和服务器建立通信
回复

使用道具 举报

0

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2019-4-25
在线时间
100 小时
发表于 2021-11-11 22:47:27 | 显示全部楼层
17.未插网线开机后再插网线无法实现功能;解决办法stm32f4x7_eth.c中if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
&#160;&#160;{&#160;&#160;
&#160; &#160; /* We wait for linked satus... */
&#160; &#160; do
&#160; &#160; {
&#160; &#160;&#160; &#160;timeout++;
&#160; &#160; } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
&#160; &#160; /* Return ERROR in case of timeout */
&#160; &#160; if(timeout == PHY_READ_TO)
&#160; &#160; {
&#160; &#160;&#160; &#160;return ETH_ERROR;
&#160; &#160; }
&#160; &#160; /* Reset Timeout counter */
&#160; &#160; timeout = 0;
中的ETH_AutoNegotiation_Disable,换成ETH_AutoNegotiation_Enable
LAN8720.c中
ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;                           ETH_InitStructure.ETH_Speed=ETH_Speed_10M;//相应的网卡速度
回复

使用道具 举报

0

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2019-4-25
在线时间
100 小时
发表于 2021-11-11 22:47:51 | 显示全部楼层
17.未插网线开机后再插网线无法实现功能;解决办法stm32f4x7_eth.c中if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable)
&#160;&#160;{&#160;&#160;
&#160; &#160; /* We wait for linked satus... */
&#160; &#160; do
&#160; &#160; {
&#160; &#160;&#160; &#160;timeout++;
&#160; &#160; } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));
&#160; &#160; /* Return ERROR in case of timeout */
&#160; &#160; if(timeout == PHY_READ_TO)
&#160; &#160; {
&#160; &#160;&#160; &#160;return ETH_ERROR;
&#160; &#160; }
&#160; &#160; /* Reset Timeout counter */
&#160; &#160; timeout = 0;
中的ETH_AutoNegotiation_Disable,换成ETH_AutoNegotiation_Enable
LAN8720.c中
ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;                           ETH_InitStructure.ETH_Speed=ETH_Speed_10M;//相应的网卡速度
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-5 22:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表