OpenEdv-开源电子网

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

F407开发板网线实现热插拔方法

[复制链接]

12

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1887
金钱
1887
注册时间
2015-4-21
在线时间
102 小时
发表于 2016-1-18 15:09:37 | 显示全部楼层 |阅读模式
实现网线热插拔,不必开机前就插上网线。就要把lwip_comm_init()放在while(1)循环里。但是当插上网线发现也不能初始化,打断点发现是申请内存失败ETH_Mem_Malloc(),lwip_comm_mem_malloc();这是因为未插网线时多次进行初始化(LAN8720_Init()初始化失败),多次申请内存且没有释放导致可用内存不足;所以在初始化失败后要释放内存        ETH_Mem_Free();lwip_comm_mem_free();。这样就可以随时插入网线都可以初始化成功连接网络了。插网线连接实现了,那么拔掉网线不断开连接怎么办呢?
这就可以查询lan8720的中断来实现。LAN8720A的寄存器29的第4位中断位为1时掉线中断,可以查询此位来判断网线的连接状态,当中断置1时可以断开网络,重新等待连接。
u8 LAN8720_Get_link(void)
{
u8 link;
link=((ETH_ReadPHYRegister(0x00,29)&0x10)>>4); //从LAN8720的29号寄存器中读取连接状态中断:1为断开
return link;
}       
               
       
               

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

使用道具 举报

54

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2014-3-6
在线时间
41 小时
发表于 2016-10-20 19:06:28 | 显示全部楼层
我觉得有几点不明确的。你说在while(1)里一直执行lwip_comm_init().但是,什么时候退出来呢,而且难道不插网口就不干别的了?而且这个函数还一直netif_add,会一直添加网络接口。
回复 支持 1 反对 0

使用道具 举报

17

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
658
金钱
658
注册时间
2015-12-22
在线时间
128 小时
发表于 2016-1-18 15:17:27 | 显示全部楼层
绑定                           
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-6-8 22:43:21 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

17

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
658
金钱
658
注册时间
2015-12-22
在线时间
128 小时
发表于 2016-6-9 10:04:22 | 显示全部楼层
mark              
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-5-23
在线时间
7 小时
发表于 2016-6-13 08:47:12 | 显示全部楼层
留名待用
回复 支持 反对

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
发表于 2016-6-22 21:50:40 | 显示全部楼层
能不能再讲细点?感觉没有理解你的意思。
回复 支持 反对

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
发表于 2016-6-22 21:51:02 | 显示全部楼层
能不能再讲细点?感觉没有理解你的意思。
回复 支持 反对

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-6-22 22:42:05 | 显示全部楼层
mark!!!
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-5-23
在线时间
7 小时
发表于 2016-7-11 16:15:58 | 显示全部楼层
留名,备查
回复 支持 反对

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2012-5-5
在线时间
7 小时
发表于 2016-7-11 16:26:24 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2016-3-9
在线时间
75 小时
发表于 2016-8-13 20:16:22 | 显示全部楼层
Mark一下
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2016-3-9
在线时间
75 小时
发表于 2016-8-13 22:26:09 | 显示全部楼层
mark!!!
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-10-14
在线时间
8 小时
发表于 2016-11-1 10:34:16 | 显示全部楼层
我按照你的方法试了下,成功读取了寄存器状态,可是有个问题是当我把网线插上后,并且重新链接网络成功(不是复位),29寄存器的4位一直为1了。
回复 支持 反对

使用道具 举报

12

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1887
金钱
1887
注册时间
2015-4-21
在线时间
102 小时
 楼主| 发表于 2016-11-1 14:47:18 | 显示全部楼层
wjstaotao 发表于 2016-11-1 10:34
我按照你的方法试了下,成功读取了寄存器状态,可是有个问题是当我把网线插上后,并且重新链接网络成功(不 ...

最好复位一下不会出现什么问题
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-10-14
在线时间
8 小时
发表于 2016-11-1 15:48:45 | 显示全部楼层
weilong1370 发表于 2016-11-1 14:47
最好复位一下不会出现什么问题

按照L8720A参考手册上寄存器的说法来看,读取了那一位,如果网线接上后就应该置零,可是并没有置零,读出来的值仍然为1,即代表断线。还有如果是复位的话,那就没意义了啊
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-10-14
在线时间
8 小时
发表于 2016-11-1 16:28:56 | 显示全部楼层
weilong1370 发表于 2016-11-1 14:47
最好复位一下不会出现什么问题

可以加我企鹅1125349264嘛?我俩交流交流
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-8-3
在线时间
29 小时
发表于 2017-2-24 09:04:00 | 显示全部楼层
正好在弄热插拔网线,试下
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-8-3
在线时间
29 小时
发表于 2017-3-2 09:15:55 | 显示全部楼层
wjstaotao 发表于 2016-11-1 15:48
按照L8720A参考手册上寄存器的说法来看,读取了那一位,如果网线接上后就应该置零,可是并没有置零,读出 ...

我也遇到这个问题,读取的那一位在插线网线后也一直是1,请问您解决了嘛?
回复 支持 反对

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
发表于 2017-3-5 18:11:45 | 显示全部楼层
45度斜向上 发表于 2017-3-2 09:15
我也遇到这个问题,读取的那一位在插线网线后也一直是1,请问您解决了嘛?

我也是这个问题  一直为1  重新连接网线 能正常通信了  值还是1,是需要自己手动置0 的吗
求指导!!!兄弟
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2017-1-7
在线时间
61 小时
发表于 2017-8-10 14:34:50 | 显示全部楼层
wjstaotao 发表于 2016-11-1 10:34
我按照你的方法试了下,成功读取了寄存器状态,可是有个问题是当我把网线插上后,并且重新链接网络成功(不 ...

regval = (LAN8720_ReadPHY(1)>>2)&0x01;                //从LAN8720的1号寄存器中读取连接状态中断: 0为断开 Link Status: 0 = link is down   1= link is up
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
发表于 2019-3-4 09:02:12 | 显示全部楼层
我试了一下,还是不管用。能不能再细化一点呢?一直不成功
回复 支持 反对

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-22
在线时间
50 小时
发表于 2019-3-27 20:22:29 | 显示全部楼层
谢谢分享,
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2019-3-16
在线时间
29 小时
发表于 2019-3-30 08:23:02 来自手机 | 显示全部楼层
定时读取LAN8720状态寄存器,监视网线的连接状态,初始化LWIP的时候注册关于网线连接的回调函数,这样网线连接有变化的时候就会自动调用相应的函数对网络重新进行配置
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2016-4-21
在线时间
70 小时
发表于 2019-4-29 21:39:21 | 显示全部楼层
楼主,你好!我用这个函数为何读出的寄存器一直是1不变啊?
回复 支持 反对

使用道具 举报

10

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1717
金钱
1717
注册时间
2017-10-9
在线时间
144 小时
发表于 2019-6-5 08:57:30 | 显示全部楼层
这个好像不行的,上电前网线插入,正常连接后,拔掉网线后再重新插入,读取的状态值一直为1.
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-2 20:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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