OpenEdv-开源电子网

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

STM32F207+DP83848+LwIP网线插拔问题

[复制链接]

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
发表于 2014-5-12 09:49:32 | 显示全部楼层 |阅读模式
5金钱
STM32F207+DP83848+LwIP,在插入网线的情况下是可以连通的,但是如果拔下网线再插入网线就连不通了,再插入网线时,我重新把 ETH_MACDMA_Config()配置了一下还是不可以。求教解决方案!

最佳答案

查看完整内容[请看2#楼]

已解决,断一下线程,重新建立!即可
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2014-5-12 09:49:33 | 显示全部楼层
已解决,断一下线程,重新建立!即可
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-5-7
在线时间
0 小时
发表于 2014-5-12 10:10:40 | 显示全部楼层
我也在学以太网的通信,可以请教几个问题吗。
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2014-5-12 10:21:34 | 显示全部楼层
回复【2楼】活在当下:
---------------------------------
当然可以,我尽力帮助!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-5-7
在线时间
0 小时
发表于 2014-5-12 10:26:02 | 显示全部楼层
我刚把LWIP移植进去,但用调试助手却收不到任务信息,我是根据一个移植笔记来做的,上面说移植好后会一直收到某句话
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2014-5-12 10:28:32 | 显示全部楼层
可以ping通吗?
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-5-7
在线时间
0 小时
发表于 2014-5-12 10:32:44 | 显示全部楼层
小白刚学,不知道该怎么测ping
回复

使用道具 举报

230

主题

1952

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-5-12 10:46:58 | 显示全部楼层
回复【6楼】活在当下:
---------------------------------
ping命令,它是用来检查网络是否通畅或者网络连接速度的命令。
是用方法:
ping  [ip]  
例如:ping 192.168.1.12   
         ping www.openedv.com
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2014-5-12 11:03:22 | 显示全部楼层
回复【6楼】活在当下:
---------------------------------
建议先看一下网络的基础知识,再去调试!这样就有方向了!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-5-7
在线时间
0 小时
发表于 2014-5-12 11:14:05 | 显示全部楼层
回复【7楼】Admin:
---------------------------------
谢谢!
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-5-7
在线时间
0 小时
发表于 2014-5-12 11:14:15 | 显示全部楼层
回复【8楼】象牙塔:
---------------------------------
好的,谢谢。
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-5-7
在线时间
0 小时
发表于 2014-5-12 17:12:18 | 显示全部楼层
回复【8楼】象牙塔:
---------------------------------
我的32跟上位机连通了,希望你也能解决你的问题
回复

使用道具 举报

15

主题

180

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2013-4-23
在线时间
25 小时
发表于 2014-5-12 22:30:42 | 显示全部楼层
关闭自动协商模式试试
回复

使用道具 举报

19

主题

234

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2014-7-8
在线时间
10 小时
发表于 2014-7-8 16:27:51 | 显示全部楼层
線拔了, 最好重新init 一次, 然後dhcp 也要在重新要一次ip

或用更簡單的方式....
只要不到5步的幾個at command就能上網, 給你參考, 要不要升級uart to ethernet 更快更穩
http://www.yerendian.com/e100-uart-to-ethernet-module/
以上給你參考, 謝謝
qq: 43752596
回复

使用道具 举报

38

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2014-8-1
在线时间
6 小时
发表于 2014-12-23 19:35:10 | 显示全部楼层
回复【14楼】象牙塔:
---------------------------------断了一下线程能不能详细点,我和你一样的问题,只不过我的解决方法是不用自动协商!你的是?
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2014-12-23 19:40:37 | 显示全部楼层
回复【15楼】静:
---------------------------------
把服务器线程关闭,并清除未发送的数据,防止内存溢出,然后在重新建个连接,Lwip有BUG,尤其数据量大时,没法解决,注意用网线状态的中断。
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

3

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2012-7-19
在线时间
63 小时
发表于 2014-12-26 09:14:31 | 显示全部楼层
回复【16楼】象牙塔:
---------------------------------
服务器线程能够知道网络断开么,哪个函数会返回这样的错误值
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2014-12-26 10:27:40 | 显示全部楼层
回复【17楼】myxiaoniao:
---------------------------------
1、网线掉时(和网口断开),有中断
void Eth_Link_ITHandler(uint16_t HYAddress)
{
  /* Check whether the link interrupt has occurred or not */

  if(((ETH_ReadPHYRegister(PHYAddress, HY_MISR)) & HY_LINK_STATUS) != 0)
  {
    EthLinkStatus = ~EthLinkStatus;


if(EthInitStatus==1 )
{
if(EthLinkStatus != 0)
{
EthSerStatus = 0;
ETH_WritePHYRegister(PHYAddress,0X18,(ETH_ReadPHYRegister(PHYAddress, 0X18)&0XFF)|0X00);
LED0=0;
}
else
{
EthSerStatus = 1;
ETH_WritePHYRegister(PHYAddress,0X18,(ETH_ReadPHYRegister(PHYAddress, 0X18)&0XFF)|0X01);
LED0=1;
EthInStatus = 1;
}
}
else
{
LED0=1;
}
EXTI_ClearITPendingBit(EXTI_Line14);  /*清除LINE14上的中断标志位 */ 
// #endif
  }
}
2、服务器线程要知道网线是否掉线,用心跳,不断的发送某一特定数据,进行判断。
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

3

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2012-7-19
在线时间
63 小时
发表于 2015-1-17 08:23:36 | 显示全部楼层
回复【18楼】象牙塔:
---------------------------------
我现在网线插拔中断和心跳都加上了,试试看
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2014-3-16
在线时间
0 小时
发表于 2015-4-6 17:33:56 | 显示全部楼层
回复【18楼】象牙塔:
---------------------------------
我使用的是ENC28J60芯片,下载的底层代码里没有发现检测网络断开的中断?请问这个该怎么解决呢?没有使用操作系统。
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2015-4-6 18:49:01 | 显示全部楼层
回复【20楼】永恒heng:
---------------------------------
数据量大吗?,如果不大你先试试!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2014-3-16
在线时间
0 小时
发表于 2015-4-7 13:22:32 | 显示全部楼层
回复【21楼】象牙塔:
---------------------------------
不大啊,我先试试把~
回复

使用道具 举报

0

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-1-18
在线时间
60 小时
发表于 2015-4-8 08:04:39 | 显示全部楼层
回复【21楼】象牙塔:
---------------------------------
象牙塔,能否把您处理热插拔的全部工程文件发上来,我们可以全面参考一下,谢谢!!!!!!!!!
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2012-9-3
在线时间
8 小时
发表于 2015-8-26 00:19:35 | 显示全部楼层
回复【20楼】永恒heng:
---------------------------------
ENC28J60芯片检测拔掉网线的问题我解决了。办法是:定时读取寄存器PHSTAT1。语句如下:
if((ENC28J60_PHY_Read(PHSTAT1) & 0x04) == 0) 表示断网了。
读物理寄存器的函数在网上可以搜索到。
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2015-8-26 09:19:11 | 显示全部楼层
回复【23楼】hunyuanqi:
---------------------------------
抱歉,工程是商业项目。
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
发表于 2016-9-6 16:23:32 | 显示全部楼层
如果是上电的时候不插网线初始化失败了,再插上网线不能正常初始化该怎么办
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-8-25
在线时间
2 小时
发表于 2017-7-13 15:46:22 | 显示全部楼层
怎么断线程
回复

使用道具 举报

24

主题

192

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2016-3-16
在线时间
194 小时
发表于 2018-1-27 17:35:06 | 显示全部楼层
最烦这种有问题知道问,解决了不愿意说的人。
路漫漫其修远兮,戒骄戒躁。
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2018-1-29 13:22:30 | 显示全部楼层
本帖最后由 象牙塔 于 2018-1-29 13:24 编辑
EAON 发表于 2018-1-27 17:35
最烦这种有问题知道问,解决了不愿意说的人。

你仔细看帖了吗?你问啥了我没回复,再说回复不回复是我的事,我没有义务回复所有问题吧,
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4340
金钱
4340
注册时间
2017-5-30
在线时间
576 小时
发表于 2018-3-8 13:49:24 | 显示全部楼层
请教一下楼主,现在可以PING通,但是PHY状态是LINK_DOWN,请问一下可能是哪里的问题
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2018-3-13 14:15:17 | 显示全部楼层
whj467467274672 发表于 2018-3-8 13:49
请教一下楼主,现在可以PING通,但是PHY状态是LINK_DOWN,请问一下可能是哪里的问题

你没搞错PHY状态状态吧,能ping通说明,网络通了,和LINK_DOWN态不是共存的,
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4340
金钱
4340
注册时间
2017-5-30
在线时间
576 小时
发表于 2018-3-14 08:25:46 | 显示全部楼层
象牙塔 发表于 2018-3-13 14:15
你没搞错PHY状态状态吧,能ping通说明,网络通了,和LINK_DOWN态不是共存的,

已经找到原因了,是因为LWIP 2.0.1的原因,需要手动LINK_UP一下,1.4.1就不需要。已经都弄好了STM32F107 DP83848 RT_THREAD MODBUS TCP
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2018-3-21 08:53:58 | 显示全部楼层
whj467467274672 发表于 2018-3-14 08:25
已经找到原因了,是因为LWIP 2.0.1的原因,需要手动LINK_UP一下,1.4.1就不需要。已经都弄好了STM32F107  ...

那就好
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4340
金钱
4340
注册时间
2017-5-30
在线时间
576 小时
发表于 2018-3-27 11:21:10 | 显示全部楼层

现在做一个串口转以太网的东西拿来练手,我用一个板子跑了串口,udpser,udpclient,现在是可以通过串口发送数据到网络上,网络上接受到的数据也可以通过串口打印出来,网络数据现在用网络调试助手来测试的,网络调试助手在每次连接以后要发送一个数据才能接收到数据,如果不发送一次是无法接收到数据的,请问一下这是什么原因
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2018-4-4 09:33:24 | 显示全部楼层
whj467467274672 发表于 2018-3-27 11:21
现在做一个串口转以太网的东西拿来练手,我用一个板子跑了串口,udpser,udpclient,现在是可以通过串口发 ...

你做的是客户端还是服务器端,确保和调试助手配置正确
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4340
金钱
4340
注册时间
2017-5-30
在线时间
576 小时
发表于 2018-4-4 10:26:20 | 显示全部楼层
象牙塔 发表于 2018-4-4 09:33
你做的是客户端还是服务器端,确保和调试助手配置正确

已经解决了
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2018-4-4 16:06:45 | 显示全部楼层

什么原因啊,让大伙瞅着点,互相学习,这个帖子就是相关问题的
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4340
金钱
4340
注册时间
2017-5-30
在线时间
576 小时
发表于 2018-4-5 13:22:01 | 显示全部楼层
象牙塔 发表于 2018-4-4 16:06
什么原因啊,让大伙瞅着点,互相学习,这个帖子就是相关问题的

我做得是2块板子用串口收发数据,板子间用网线通讯。用操作系统跑了2个 线程,一个是客户端一个是服务器,我用一个板子用电脑模拟的时候会出现上诉情况,后来修改了一下IP地址,用2个板子连起来之后就可以正常收发,原因没有找到。
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2018-4-9 09:33:09 | 显示全部楼层
whj467467274672 发表于 2018-4-5 13:22
我做得是2块板子用串口收发数据,板子间用网线通讯。用操作系统跑了2个 线程,一个是客户端一个是服务器 ...

那估计是静态IP,两个相同了
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4340
金钱
4340
注册时间
2017-5-30
在线时间
576 小时
发表于 2018-4-10 13:35:38 | 显示全部楼层
象牙塔 发表于 2018-4-9 09:33
那估计是静态IP,两个相同了

对的,设置的静态IP
回复

使用道具 举报

1

主题

88

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2018-11-7
在线时间
16 小时
发表于 2018-11-11 19:43:43 | 显示全部楼层
帮顶   
回复

使用道具 举报

21

主题

55

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-12-5
在线时间
45 小时
发表于 2018-12-5 09:12:20 | 显示全部楼层
象牙塔 发表于 2014-5-12 09:49
已解决,断一下线程,重新建立!即可

您好!向您请教一下,我使用lwip1.3.2的udp通信,没有操作系统,直接udp_new();udp_bind();udp_recv();udp_sendto(最终发送);   在连续发送数据过程中断开网线再插上后,也无法重新连接上。  程序循环卡死在sitaraif.c中
/** Handler for EMAC Transmit interrupt
* @param netif the lwip network interface structure for this ethernetif
* @return none/
void sitaraif_tx_inthandler(struct netif *netif) {

/* Make sure that the transmission is over */
while((curr_bd->flags_pktlen & EMAC_BUF_DESC_OWNER)
== EMAC_BUF_DESC_OWNER);
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2018-12-11
在线时间
2 小时
发表于 2018-12-13 11:29:51 | 显示全部楼层
供应以下系列芯片长期备货
REALTEK(瑞昱):
RTL8201F-VB-CG   4900/bag          RTL8201CP-VD-LF  2500/bag   
RTL8211EG-VB-CG  2600/bag         RTL8306M-CG      2600/bag            
RTL8309M-CG      1680/bag   
  TI(德州仪器)
MSP430F2131IPWR  2000/bag       MSP430F248TPM    1000/bag
MSP430F247IPM    1000/bag         MSP430F6723IPZ   1000/bag
MSP430F4793IPZR  1000/bag        MSP430G2452IPW20
MSP430F4152IPMR                        MSP430FR2033IPMR
MSP430FR4133IPMR                      MSP430F2131IDWR
  ST(意法半导体)
STM8L151G4U6                              STM8S003F3P6      
STM32F051R8T6                             STM32F051K6U6
STM32F103VCT6                             STM32F103RBT6
STM32F103VET6                              STM32F103R8T6
STM32F103C8T6                              STM32F030F4P6
STM32F407VET6                              STM8L151G6U6TR
STM8S005K6T6CTR                          STM8L151C8T6
原厂原装正品  有需要的请联系QQ728378470
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2019-1-3 09:20:24 | 显示全部楼层
cj0220 发表于 2018-12-5 09:12
您好!向您请教一下,我使用lwip1.3.2的udp通信,没有操作系统,直接udp_new();udp_bind();udp_recv();ud ...

断开时,清理一下中断
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-5-14
在线时间
18 小时
发表于 2019-6-3 16:48:06 | 显示全部楼层
象牙塔 发表于 2014-5-12 11:03
回复【6楼】活在当下:
---------------------------------
建议先看一下网络的基础知识,再去调试!这样就 ...

可以请教问题吗
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1831
金钱
1831
注册时间
2012-9-16
在线时间
282 小时
 楼主| 发表于 2019-6-10 13:20:11 | 显示全部楼层
KITE1 发表于 2019-6-3 16:48
可以请教问题吗

有问题说吧,大伙一起讨论
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-5-14
在线时间
18 小时
发表于 2019-6-11 15:11:22 | 显示全部楼层
我是按一下思路做了一遍可是没有效果,下面有完整文章的连接   大家帮忙看看 是不是我漏掉了什么
开发背景:

1、主芯片—STM32F107rct6;

2、TCP/IP协议栈—LWIP,依托ST例程移植;

3、操作系统—无(裸机);

异常现象:

1、网线不插入的情况下先给设备上电,之后再插入网线无法ping通;(如果上电前网线插入,网络正常);

2、网络已经正常的情况下,电脑PC端修改传输模式(比如从原来的100M全双工修改为10M全双工)导致网络不通;


原因分析:

1、针对第一种异常情况,是由于上电时网线未插入,导致ETH初始化部分未能成功完成,之后即使再插入网线,程序中没有再次进行初始化的逻辑补充,从而导致网络异常;

2、针对第二种情况,情况是上电时完成了ETH的初始化并与PC协商成功,此时网络正常。但当PC端修改传输模式后,程序中未能执行再次协商与MAC的初始化工作,导致网络异常;


解决方法:

首先,要明确上述问题的关键点所在,所有的异常均是网线的拔插导致(PC端修改连接传输方式时也相当于网线的拔掉重插),因此主程序中必须要有对当前网络连接与断开的检测或者利用PHY芯片的中断引脚;

其次,无论利用轮询或是PHY中断配置引脚,根本的原理都是一样的,就是感知到网络的连接与断开,下面给出采用的查询方式:


void Eth_Link_ITHandler(struct netif *netif)
{
/* Check whether the link interrupt has occurred or not */
if(((ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_MISR)) & PHY_LINK_STATUS) != 0){/*检测插拔中断*/

uint16_t status = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_BSR);

if(status & (PHY_AutoNego_Complete | PHY_Linked_Status)){/*检测到网线连接*/

if(EthInitStatus == 0){/*之前未成功初始化过*/

/*Reinit PHY*/
ETH_Reinit();
}
else{/*之前已经成功初始化*/

/*set link up for re link callbalk function*/

netif_set_link_up(netif);

}
}
else{/*网线断开*/\

/*set link down for re link callbalk function*/
netif_set_link_down(netif);
}
}
}

备注说明:将该检测函数放入主循环,程序中标注的部分为解决网线热拔插问题的关键点。

1、标注红色的部分执行的条件是检测到网线插入且之前ETH部分未成功初始化过(即之前一直处在上电但网线未插入)的情况,此时需要对ETH重新初始化,从而解决异常现象的第一种情况,具体执行内容为:
/**
* @brief : first time power on but init failed, do again
* @param : None

*

* @retval : None
* @Author : xuk
*/
void ETH_Reinit(void){

/* Configure Ethernet */
EthInitStatus =
ETH_Init(&ETH_InitStructure, DP83848_PHY_ADDRESS);

}
其中ETH_InitStructure已设为全局结构体;


2、标注蓝色部分的执行条件是已经成功初始化过ETH,但之后出现了网线的拔插情况,此时需要在每次检测到网络连接时重新进行自协商并初始化MAC,具体的执行流程如下介绍:

A、检测到该条件时,首先调用:

netif_set_link_up(netif);


netif_set_link_down(netif);


B、追溯两个函数的定义处,如下:
#if LWIP_NETIF_LINK_CALLBACK
/**
* Called by a driver when its link goes up
*/
void netif_set_link_up(struct netif *netif )
{
netif->flags |= NETIF_FLAG_LINK_UP;

#if LWIP_DHCP
if (netif->dhcp) {
dhcp_network_changed(netif);
}
#endif /* LWIP_DHCP */

#if LWIP_AUTOIP
if (netif->autoip) {
autoip_network_changed(netif);
}
#endif /* LWIP_AUTOIP */

if (netif->flags & NETIF_FLAG_UP) {
#if LWIP_ARP
/* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */

if (netif->flags & NETIF_FLAG_ETHARP) {
etharp_gratuitous(netif);
}
#endif /* LWIP_ARP */

#if LWIP_IGMP
/* resend IGMP memberships */
if (netif->flags & NETIF_FLAG_IGMP) {
igmp_report_groups( netif);
}
#endif /* LWIP_IGMP */
}
NETIF_LINK_CALLBACK(netif);
}

/**
* Called by a driver when its link goes down
*/
void netif_set_link_down(struct netif *netif )
{
netif->flags &= ~NETIF_FLAG_LINK_UP;
NETIF_LINK_CALLBACK(netif);
}

/**
* Ask if a link is up
*/

u8_t netif_is_link_up(struct netif *netif)
{
return (netif->flags & NETIF_FLAG_LINK_UP) ? 1 : 0;
}

/**
* Set callback to be called when link is brought up/down
*/
void
netif_set_link_callback(struct netif *netif, void (* link_callback)(struct netif *netif ))
{
if (netif) {
netif->link_callback = link_callback;
}
}
#endif /* LWIP_NETIF_LINK_CALLBACK */

注意:I:从上述看出,若要这两个函数有效编译,则必须定义宏LWIP_NETIF_LINK_CALLBACK 为1,请自行设置;

II:函数netif_set_link_callback的作用是指定网络连接发生改变时的回调函数;

III:详细的讲一下主要思路,Eth_Link_ITHandler执行中检测到网线拔插时分别调用netif_set_link_up(netif)、netif_set_link_down(netif);这两个函数的调用会引发netif_set_link_callback的执行,从而执行指定的网络连接或断开的回调函数;

Ⅳ:通过netif_set_link_callback该函数在LWIP初始化的时候指定网络连接变化的回调函数,可放置如下位置:



void LwIP_Init(void){

......

......

......

......

/*set the link up or link down callback function - xuk*/
netif_set_link_callback(&netif,eth_re_link);

}
do
{
tickstart++;
} while (!(ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_BSR) & PHY_AutoNego_Complete) && (tickstart < (uint32_t)PHY_READ_TO));

/* Return ERROR in case of timeout */
if(tickstart == PHY_READ_TO)
{
// return ETH_ERROR;
}

/* Reset Timeout counter */
tickstart = 0;

/* Read the result of the auto-negotiation */
regvalue = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_SR);

/* Configure the MAC with the Duplex Mode fixed by the auto-negotiation process */
if((regvalue & PHY_DUPLEX_STATUS) != (uint32_t)RESET)
{
/* Set Ethernet duplex mode to Full-duplex following the auto-negotiation */
ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;

}
else
{
/* Set Ethernet duplex mode to Half-duplex following the auto-negotiation */
ETH_InitStructure.ETH_Mode = ETH_Mode_HalfDuplex;

}

/* Configure the MAC with the speed fixed by the auto-negotiation process */
if(regvalue & PHY_SPEED_STATUS)
{

/* Set Ethernet speed to 10M following the auto-negotiation */

ETH_InitStructure.ETH_Speed = ETH_Speed_10M;

}
else
{

/* Set Ethernet speed to 100M following the auto-negotiation */

ETH_InitStructure.ETH_Speed = ETH_Speed_100M;

}

}
else{/*AutoNegotiation_Disable*/

if(!ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_BCR, ((uint16_t)(ETH_InitStructure.ETH_Mode >> 3) |
(uint16_t)(ETH_InitStructure.ETH_Speed >> 1))))
{
/* Return ERROR in case of write timeout */
// return ETH_ERROR;
}
/* Delay to assure PHY configuration */
// _eth_delay_(PHY_CONFIG_DELAY);

}



/*------------------------ ETHERNET MACCR Configuration --------------------*/
/* Get the ETHERNET MACCR value */

tmpreg = ETH->MACCR;
/* Clear WD, PCE, PS, TE and RE bits */
tmpreg &= MACCR_CLEAR_MASK;
/* Set the WD bit according to ETH_Watchdog value */
/* Set the JD: bit according to ETH_Jabber value */
/* Set the IFG bit according to ETH_InterFrameGap value */

/* Set the DCRS bit according to ETH_CarrierSense value */

/* Set the FES bit according to ETH_Speed value */

/* Set the DO bit according to ETH_ReceiveOwn value */

/* Set the LM bit according to ETH_LoopbackMode value */

/* Set the DM bit according to ETH_Mode value */

/* Set the IPCO bit according to ETH_ChecksumOffload value */

/* Set the DR bit according to ETH_RetryTransmission value */

/* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */

/* Set the BL bit according to ETH_BackOffLimit value */

/* Set the DC bit according to ETH_DeferralCheck value */

tmpreg |= (uint32_t)(ETH_InitStructure.ETH_Watchdog |

ETH_InitStructure.ETH_Jabber |

ETH_InitStructure.ETH_InterFrameGap |
ETH_InitStructure.ETH_CarrierSense |
ETH_InitStructure.ETH_Speed |

ETH_InitStructure.ETH_ReceiveOwn |
ETH_InitStructure.ETH_LoopbackMode |
ETH_InitStructure.ETH_Mode |

ETH_InitStructure.ETH_ChecksumOffload |

ETH_InitStructure.ETH_RetryTransmission |

ETH_InitStructure.ETH_AutomaticPadCRCStrip |

ETH_InitStructure.ETH_BackOffLimit |

ETH_InitStructure.ETH_DeferralCheck);
/* Write to ETHERNET MACCR */
ETH->MACCR = (uint32_t)tmpreg;

/*----------------------- ETHERNET MACFFR Configuration --------------------*/

/* Set the RA bit according to ETH_ReceiveAll value */
/* Set the SAF and SAIF bits according to ETH_SourceAddrFilter value */
/* Set the PCF bit according to ETH_PassControlFrames value */
/* Set the DBF bit according to ETH_BroadcastFramesReception value */
/* Set the DAIF bit according to ETH_DestinationAddrFilter value */
/* Set the PR bit according to ETH_PromiscuousMode value */
/* Set the PM, HMC and HPF bits according to ETH_MulticastFramesFilter value */
/* Set the HUC and HPF bits according to ETH_UnicastFramesFilter value */
/* Write to ETHERNET MACFFR */

ETH->MACFFR = (uint32_t)(ETH_InitStructure.ETH_ReceiveAll |

ETH_InitStructure.ETH_SourceAddrFilter |
ETH_InitStructure.ETH_PassControlFrames |
ETH_InitStructure.ETH_BroadcastFramesReception |

ETH_InitStructure.ETH_DestinationAddrFilter |
ETH_InitStructure.ETH_PromiscuousMode |
ETH_InitStructure.ETH_MulticastFramesFilter |
ETH_InitStructure.ETH_UnicastFramesFilter);

/*--------------- ETHERNET MACHTHR and MACHTLR Configuration ---------------*/
/* Write to ETHERNET MACHTHR */
ETH->MACHTHR = (uint32_t)ETH_InitStructure.ETH_HashTableHigh;
/* Write to ETHERNET MACHTLR */
ETH->MACHTLR = (uint32_t)ETH_InitStructure.ETH_HashTableLow;
/*----------------------- ETHERNET MACFCR Configuration --------------------*/
/* Get the ETHERNET MACFCR value */

tmpreg = ETH->MACFCR;
/* Clear xx bits */
tmpreg &= MACFCR_CLEAR_MASK;

/* Set the PT bit according to ETH_PauseTime value */
/* Set the DZPQ bit according to ETH_ZeroQuantaPause value */
/* Set the PLT bit according to ETH_PauseLowThreshold value */
/* Set the UP bit according to ETH_UnicastPauseFrameDetect value */
/* Set the RFE bit according to ETH_ReceiveFlowControl value */
/* Set the TFE bit according to ETH_TransmitFlowControl value */

tmpreg |= (uint32_t)((ETH_InitStructure.ETH_PauseTime << 16) |

ETH_InitStructure.ETH_ZeroQuantaPause |
ETH_InitStructure.ETH_PauseLowThreshold |
ETH_InitStructure.ETH_UnicastPauseFrameDetect |

ETH_InitStructure.ETH_ReceiveFlowControl |
ETH_InitStructure.ETH_TransmitFlowControl);

/* Write to ETHERNET MACFCR */
ETH->MACFCR = (uint32_t)tmpreg;
/*----------------------- ETHERNET MACVLANTR Configuration -----------------*/
/* Set the ETV bit according to ETH_VLANTagComparison value */
/* Set the VL bit according to ETH_VLANTagIdentifier value */

ETH->MACVLANTR = (uint32_t)(ETH_InitStructure.ETH_VLANTagComparison |

ETH_InitStructure.ETH_VLANTagIdentifier);


/*-------------------------------- DMA Config ------------------------------*/
/*----------------------- ETHERNET DMAOMR Configuration --------------------*/
/* Get the ETHERNET DMAOMR value */

tmpreg = ETH->DMAOMR;
/* Clear xx bits */
tmpreg &= DMAOMR_CLEAR_MASK;

/* Set the DT bit according to ETH_DropTCPIPChecksumErrorFrame value */
/* Set the RSF bit according to ETH_ReceiveStoreForward value */
/* Set the DFF bit according to ETH_FlushReceivedFrame value */
/* Set the TSF bit according to ETH_TransmitStoreForward value */
/* Set the TTC bit according to ETH_TransmitThresholdControl value */
/* Set the FEF bit according to ETH_ForwardErrorFrames value */
/* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */
/* Set the RTC bit according to ETH_ReceiveThresholdControl value */
/* Set the OSF bit according to ETH_SecondFrameOperate value */
tmpreg |= (uint32_t)(ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame |

ETH_InitStructure.ETH_ReceiveStoreForward |
ETH_InitStructure.ETH_FlushReceivedFrame |
ETH_InitStructure.ETH_TransmitStoreForward |

ETH_InitStructure.ETH_TransmitThresholdControl |
ETH_InitStructure.ETH_ForwardErrorFrames |
ETH_InitStructure.ETH_ForwardUndersizedGoodFrames |
ETH_InitStructure.ETH_ReceiveThresholdControl |

ETH_InitStructure.ETH_SecondFrameOperate);

/* Write to ETHERNET DMAOMR */
ETH->DMAOMR = (uint32_t)tmpreg;

/*----------------------- ETHERNET DMABMR Configuration --------------------*/

/* Set the AAL bit according to ETH_AddressAlignedBeats value */
/* Set the FB bit according to ETH_FixedBurst value */
/* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */
/* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */
/* Set the DSL bit according to ETH_DesciptorSkipLength value */
/* Set the PR and DA bits according to ETH_DMAArbitration value */

ETH->DMABMR = (uint32_t)(ETH_InitStructure.ETH_AddressAlignedBeats |

ETH_InitStructure.ETH_FixedBurst |
ETH_InitStructure.ETH_RxDMABurstLength | /* !! if 4xPBL is selected for Tx or Rx it is applied for the other */
ETH_InitStructure.ETH_TxDMABurstLength |

(ETH_InitStructure.ETH_DescriptorSkipLength << 2) |
ETH_InitStructure.ETH_DMAArbitration |
ETH_DMABMR_USP); /* Enable use of separate PBL for Rx and Tx */

#ifdef USE_ENHANCED_DMA_DESCRIPTORS
/* Enable the Enhanced DMA descriptors */
ETH->DMABMR |= ETH_DMABMR_EDE;
#endif /* USE_ENHANCED_DMA_DESCRIPTORS */

/* Return Ethernet configuration success */
// return ETH_SUCCESS;
// ETH_Start();
}
else{/*link down process*/

}
}


至此,对于STM32F207(裸机)- LWIP网线热插入网络不通遇到的问题以及解决办法介绍完毕。

原文:https://blog.csdn.net/xukao5671927/article/details/77765464


其中,回调函数eth_re_link的具体内容如下,实现网络拔插后的重新自协商与MAC初始化:
/**
* @brief : process the relink of eth
* @param : netif - - specify the ETH netif
*

* @retval : none
* @author : xuk
*/
void
eth_re_link(struct netif *netif){

__IO uint32_t tickstart = 0;
uint32_t regvalue = 0, tmpreg = 0;
if(netif_is_link_up(netif)){/*link up process*/

if(ETH_InitStructure.ETH_AutoNegotiation == ETH_AutoNegotiation_Enable){/*AutoNegotiation_Enable*/

/* Enable Auto-Negotiation */
ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_BCR, PHY_AutoNegotiation);

/* Wait until the auto-negotiation will be completed */

原文:https://blog.csdn.net/xukao5671927/article/details/77765464
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-6-22
在线时间
1 小时
发表于 2019-6-22 23:09:07 | 显示全部楼层
学习学习
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-10 00:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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