高级会员
- 积分
- 994
- 金钱
- 994
- 注册时间
- 2016-7-22
- 在线时间
- 318 小时
|
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 ...
|