OpenEdv-开源电子网

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

lwip双网口

[复制链接]

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
发表于 2017-4-1 16:37:35 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 hi我歌月徘徊 于 2017-4-1 16:39 编辑

百度一下LWIP双网口,找到了如下方法
  • 创建一个netif块,硬件初始化时在mylwip_init()函数中多添加一个netif_add,并调用netif_set_up().
  • 在low_level_init()中,区分两个网卡的MAC地址并且填充到netif块中。[由此代码可见,硬件mac地址修改后程序必须重新设置netif链表才能正确执行。]
  • 在low_level_output()中,判断返回的数据是要发送到哪个网卡,将数据拷贝到网卡发送缓冲区,然后发送。
  • 在low_level_input()中,判断是哪个网卡接受到了数据,并将网卡接受缓冲区中的数据拷贝到netif块的payload数据处。
   百度一下双网卡就可以找到,博客写的。
在原子哥lwip例程基础上,我也按着大神的思路去改
1.lwip_comm_init()函数下,首先设置了两个网卡的地址信息,除了mac和ip不一样,其他两个是一样的
  初始化两个网口驱动
  使用两次netif_add() 添加俩网卡, netif_set_default()设置为默认网口,netif_set_up打开网口
2.原子哥例程中使用ethernetif_init()把low_level_init()给封装了
[mw_shl_code=c,true]//使用low_level_init()函数来初始化网络
//netif:网卡结构体指针
//返回值:ERR_OK,正常
//       其他,失败
err_t ethernetif_init(struct netif *netif)
{
        LWIP_ASSERT("netif!=NULL",(netif!=NULL));
#if LWIP_NETIF_HOSTNAME                        //LWIP_NETIF_HOSTNAME
        netif->hostname="lwip";          //初始化名称
#endif
        netif->name[0]=IFNAME0;         //初始化变量netif的name字段
        netif->name[1]=IFNAME1;         //在文件外定义这里不用关心具体值
        netif->output=etharp_output;//IP层发送数据包函数
        netif->linkoutput=low_level_output;//ARP模块发送数据包函数
        low_level_init(netif);                 //底层硬件初始化函数
        return ERR_OK;
}[/mw_shl_code]

这该肿么搞~~先学习一下在搞吧
实验58 网络通信实验.rar (2.79 MB, 下载次数: 1396)

最佳答案

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

哈哈 搞定了 。 关于效验那一块,lan8720使用hal以太网库,使用的是硬件效验,28j60不是使用stm32的内部mac,所以没法使用以太网库的硬件效验,如果使用了肯定出现问题。 解决方法:lan8720也配置为软件效验,lwip也用软件效验,ok,都可以ping 代码修改: 8720的初始化中 [mw_shl_code=c,true]ETH_Handler.Init.ChecksumMode=ETH_CHECKSUM_BY_SOFTWARE;//软件帧校验 [/mw_shl_code] lwipopts.h中 将CHECKSUM_BY_HARDWAR ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-4-1 16:37:36 | 显示全部楼层
哈哈 搞定了 。

关于效验那一块,lan8720使用hal以太网库,使用的是硬件效验,28j60不是使用stm32的内部mac,所以没法使用以太网库的硬件效验,如果使用了肯定出现问题。
解决方法:lan8720也配置为软件效验,lwip也用软件效验,ok,都可以ping
代码修改:
8720的初始化中
[mw_shl_code=c,true]ETH_Handler.Init.ChecksumMode=ETH_CHECKSUM_BY_SOFTWARE;//软件帧校验  [/mw_shl_code]
lwipopts.h中
将CHECKSUM_BY_HARDWARE屏蔽掉 使用软件效验   
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
发表于 2017-4-1 18:57:40 | 显示全部楼层
本帖最后由 yangkefeng 于 2017-4-1 19:02 编辑

哥们是啥子问题啊   没说明白   是添加了两个网口  有一个不能正常通信还是?
两个网口应该是可以实现的  不然路由器可以插这么多网线没理由啊!
然后F429自带的MAC是不是只有一个啊   设置两个MAC地址不知道行不行,
我没弄过双网口,关注中
回复

使用道具 举报

0

主题

174

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2016-1-9
在线时间
64 小时
发表于 2017-4-1 19:12:21 | 显示全部楼层
双网口我觉得是不可以的,MAC控制器只有一个。除非分时复用。
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-4-1 19:21:50 | 显示全部楼层
本帖最后由 hi我歌月徘徊 于 2017-4-1 19:35 编辑
yangkefeng 发表于 2017-4-1 18:57
哥们是啥子问题啊   没说明白   是添加了两个网口  有一个不能正常通信还是?
两个网口应该是可以实现的   ...

429的内部mac确实只有一个,但是我可以外扩phy芯片啊,phy芯片可以挂载好多个呢,比如lan8720,这一点原子的例程中也有说到。我现在挂载lan8720,还有28J60(spi通信),单独使用是没问题的。lwip是支持多网口的
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-4-1 19:29:18 | 显示全部楼层
yangkefeng 发表于 2017-4-1 18:57
哥们是啥子问题啊   没说明白   是添加了两个网口  有一个不能正常通信还是?
两个网口应该是可以实现的   ...

D6%B]F7_A1}OR@T9EBJ2[VJ.png
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-4-1 19:33:52 | 显示全部楼层
whyviking 发表于 2017-4-1 19:12
双网口我觉得是不可以的,MAC控制器只有一个。除非分时复用。

STM32F429 自带的 MAC 相当于数据链路层,PHY芯片相当于物理层,在链路层的基础上外接多个物理层是没问题的
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
发表于 2017-4-1 19:50:53 | 显示全部楼层
hi我歌月徘徊 发表于 2017-4-1 19:33
STM32F429 自带的 MAC 相当于数据链路层,PHY芯片相当于物理层,在链路层的基础上外接多个物理层是没问题 ...

我个人觉得MAC只有一个  MAC地址也就只有一个
多网口肯定支持  所以你那个双网口应该是可以实现的
多网口的意义是不是像路由器一样可以连接多台电脑啊??
我在配置路由器的时候发现MAC地址只有一个,但是可以连接多台电脑
所以我觉得你在LWIP初始化的时候  MAC地址给一个就可以了  没必要两个

求指导!!!兄弟
回复

使用道具 举报

0

主题

174

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2016-1-9
在线时间
64 小时
发表于 2017-4-1 20:25:45 | 显示全部楼层
本帖最后由 whyviking 于 2017-4-1 21:47 编辑
hi我歌月徘徊 发表于 2017-4-1 19:33
STM32F429 自带的 MAC 相当于数据链路层,PHY芯片相当于物理层,在链路层的基础上外接多个物理层是没问题 ...

没具体做过,不太懂
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-4-2 10:41:44 | 显示全部楼层
yangkefeng 发表于 2017-4-1 19:50
我个人觉得MAC只有一个  MAC地址也就只有一个
多网口肯定支持  所以你那个双网口应该是可以实现的
多网 ...

路由器我不知道,但是两个网卡相当于两个客户端啊,在同一个局域网当中mac地址是不能重复的吧
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-4-4 00:16:10 | 显示全部楼层
hi我歌月徘徊 发表于 2017-4-2 10:41
路由器我不知道,但是两个网卡相当于两个客户端啊,在同一个局域网当中mac地址是不能重复的吧

你设置不同MAC即可
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-4-10 10:23:58 | 显示全部楼层
本帖最后由 hi我歌月徘徊 于 2017-4-10 10:30 编辑

KNU)H5F38AWQ[XM%)@07}[W.jpg 这是网卡1,可以ping PF5A[SP6%W1R5R8${H3HWEU.jpg

这是卡2 可以看到有数据返回 说明网卡底层没啥问题,就是效验发生了错误~~  有没有大神遇到过啊
实验58 网络通信实验lan8720-1.zip (2.84 MB, 下载次数: 1517)
回复

使用道具 举报

7

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2015-4-6
在线时间
57 小时
发表于 2017-4-10 11:03:54 | 显示全部楼层
原来搞过一个(LAN8720PHY+STM32MAC)  +(WLAN+MAC+phy)的双网卡 虽然都能ping通  但是感觉很费劲 后来又不折腾了
回复

使用道具 举报

7

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2015-4-6
在线时间
57 小时
发表于 2017-4-10 11:08:05 | 显示全部楼层
本帖最后由 STM33 于 2017-4-10 11:09 编辑

简短解说 就是麻烦麻烦 加麻烦 .老衲五木好像有双网卡的开发板 demo什么的 记得在淘宝看见过,,,,,,,,买一块
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-4-10 11:24:08 | 显示全部楼层
STM33 发表于 2017-4-10 11:08
简短解说 就是麻烦麻烦 加麻烦 .老衲五木好像有双网卡的开发板 demo什么的 记得在淘宝看见过,,,,,,,,买一 ...

我看到了 好贵啊~~~   
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-4-10 11:28:29 | 显示全部楼层
本帖最后由 hi我歌月徘徊 于 2017-4-10 11:29 编辑

#define CHECKSUM_BY_HARDWARE //定义CHECKSUM_BY_HARDWARE,使用硬件帧校验  卡一 ok  卡二效验值=0 ping不通
屏蔽掉硬件效验 ,使用软件效验  卡2 ok  卡1效验值=0 ping不通
反正俩网卡只能效验一个。。。。
[mw_shl_code=c,true]//帧校验和选项,STM32F4x7允许通过硬件识别和计算IP,UDP和ICMP的帧校验和
#define CHECKSUM_BY_HARDWARE //定义CHECKSUM_BY_HARDWARE,使用硬件帧校验
#ifdef CHECKSUM_BY_HARDWARE
  //CHECKSUM_GEN_IP==0: 硬件生成IP数据包的帧校验和
  #define CHECKSUM_GEN_IP                 0
  //CHECKSUM_GEN_UDP==0: 硬件生成UDP数据包的帧校验和
  #define CHECKSUM_GEN_UDP                0
  //CHECKSUM_GEN_TCP==0: 硬件生成TCP数据包的帧校验和
  #define CHECKSUM_GEN_TCP                0
  //CHECKSUM_CHECK_IP==0: 硬件检查输入的IP数据包帧校验和
  #define CHECKSUM_CHECK_IP               0
  //CHECKSUM_CHECK_UDP==0: 硬件检查输入的UDP数据包帧校验和
  #define CHECKSUM_CHECK_UDP              0
  //CHECKSUM_CHECK_TCP==0: 硬件检查输入的TCP数据包帧校验和
  #define CHECKSUM_CHECK_TCP              0
  //CHECKSUM_CHECK_ICMP==1:硬件检查输入的ICMP数据包帧校验和
  #define CHECKSUM_GEN_ICMP               0
#else
  //CHECKSUM_GEN_IP==1: 软件生成IP数据包帧校验和
  #define CHECKSUM_GEN_IP                 1
  // CHECKSUM_GEN_UDP==1: 软件生成UDOP数据包帧校验和
  #define CHECKSUM_GEN_UDP                1
  //CHECKSUM_GEN_TCP==1: 软件生成TCP数据包帧校验和
  #define CHECKSUM_GEN_TCP                1
  // CHECKSUM_CHECK_IP==1: 软件检查输入的IP数据包帧校验和
  #define CHECKSUM_CHECK_IP               1
  // CHECKSUM_CHECK_UDP==1: 软件检查输入的UDP数据包帧校验和
  #define CHECKSUM_CHECK_UDP              1
  //CHECKSUM_CHECK_TCP==1: 软件检查输入的TCP数据包帧校验和
  #define CHECKSUM_CHECK_TCP              1
  //CHECKSUM_CHECK_ICMP==1:软件检查输入的ICMP数据包帧校验和
  #define CHECKSUM_GEN_ICMP               1
#endif[/mw_shl_code]
回复

使用道具 举报

7

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2015-4-6
在线时间
57 小时
发表于 2017-4-10 12:00:32 | 显示全部楼层
别告诉我你是分时使用STM32的MAC
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-4-10 12:32:18 | 显示全部楼层
STM33 发表于 2017-4-10 12:00
别告诉我你是分时使用STM32的MAC

不不,一个用了内部的mac,另一个是28j60(mac+phy)
回复

使用道具 举报

7

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2015-4-6
在线时间
57 小时
发表于 2017-4-10 13:18:18 | 显示全部楼层
单独用哪个都正常?
回复

使用道具 举报

7

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2015-4-6
在线时间
57 小时
发表于 2017-4-10 13:18:34 | 显示全部楼层
那少年你有的玩了
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-4-10 13:21:03 | 显示全部楼层
STM33 发表于 2017-4-10 13:18
那少年你有的玩了

哈哈 ping通就好玩啦
回复

使用道具 举报

16

主题

173

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2441
金钱
2441
注册时间
2014-11-5
在线时间
348 小时
发表于 2017-4-10 16:20:42 | 显示全部楼层
hi我歌月徘徊 发表于 2017-4-10 10:23
这是网卡1,可以ping

这是卡2 可以看到有数据返回 说明网卡底层没啥问题,就是效验发生了错 ...

用什么抓的包呢?
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-12-1
在线时间
9 小时
发表于 2017-12-5 10:46:37 | 显示全部楼层
请问如果让stm32的板作为客户端,如何通过路由器同时连接多个服务器呢?
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-12-5 13:54:57 | 显示全部楼层

wireshark
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-12-5 13:55:55 | 显示全部楼层
lirudi3603 发表于 2017-12-5 10:46
请问如果让stm32的板作为客户端,如何通过路由器同时连接多个服务器呢?

听说过一个服务器支持多个客户端连接的,还不知道一个客户端连接多个服务器。。。
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-12-1
在线时间
9 小时
发表于 2017-12-5 15:07:03 | 显示全部楼层
hi我歌月徘徊 发表于 2017-12-5 13:55
听说过一个服务器支持多个客户端连接的,还不知道一个客户端连接多个服务器。。。

那如果把stm32的板 作为服务器,连多个客户端呢  怎么搞?
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
 楼主| 发表于 2017-12-5 17:49:44 | 显示全部楼层
lirudi3603 发表于 2017-12-5 15:07
那如果把stm32的板 作为服务器,连多个客户端呢  怎么搞?

无操作系统的lwip 都支持多个客户端的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 21:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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