[STM32F1]

求助 stmf107+lan8720+lwip 无法通过1G路由器

[复制链接]
4189|23
手机看帖
扫描二维码
随时随地手机跟帖
黎明的太阳|  楼主 | 2020-10-9 20:05 | 显示全部楼层 |阅读模式
如题,可以通过百兆交换机/路由/电脑直连,但是没有办法通过G兆路由,哪怕是通过一个百兆交换机再接G兆路由都不行。phy的速度模式上无论是自动协商/10M/100兆都不行
求高人指点

使用特权

评论回复
zhuotuzi| | 2020-10-9 21:57 | 显示全部楼层
能通过多少的路由器?

使用特权

评论回复
天意无罪| | 2020-10-9 22:03 | 显示全部楼层
低速率的网络设备接入高速率的网络设备,如果你G兆路由不能自适应百兆网络,那肯定时有问题的。

使用特权

评论回复
黎明的太阳|  楼主 | 2020-10-9 22:28 | 显示全部楼层
zhuotuzi 发表于 2020-10-9 21:57
能通过多少的路由器?

其实百兆网访问没有问题,几个都没问题,但是没有办法通过G兆路由

使用特权

评论回复
黎明的太阳|  楼主 | 2020-10-9 22:29 | 显示全部楼层
本帖最后由 黎明的太阳 于 2020-10-10 22:47 编辑
天意无罪 发表于 2020-10-9 22:03
低速率的网络设备接入高速率的网络设备,如果你G兆路由不能自适应百兆网络,那肯定时有问题的。 ...

不是孤立问题,不同的8720PHY在不同的G兆路由上都是一样的表现,说明不是G兆路由的问题,现在搞不清是phy的问题还是lwip的问题

使用特权

评论回复
zhuotuzi| | 2020-10-9 22:51 | 显示全部楼层
不清楚。。。。

使用特权

评论回复
天意无罪| | 2020-10-10 10:27 | 显示全部楼层
黎明的太阳 发表于 2020-10-9 22:29
不是孤立问题,不同的8720PHY在不同的百兆路由上都是一样的表现,说明不是百兆路由的问题,现在搞不清是p ...

不知道是我表述有问题还是什么,我没说是百兆路由或者千兆路由有问题,最为产品他们都没问题。问题在于,你的千兆路由能不能自适应百兆....

使用特权

评论回复
黎明的太阳|  楼主 | 2020-10-10 10:55 | 显示全部楼层
天意无罪 发表于 2020-10-10 10:27
不知道是我表述有问题还是什么,我没说是百兆路由或者千兆路由有问题,最为产品他们都没问题。问题在于, ...

首先当然可以,这个路由接百兆其它设备非常正常。事实是使用一个百兆家用路由,wan口接G兆路由,Lan口接Lan8720,经过这个百兆路由转发,lan8720就可以通过G兆路由

使用特权

评论回复
天意无罪| | 2020-10-10 13:17 | 显示全部楼层
黎明的太阳 发表于 2020-10-10 10:55
首先当然可以,这个路由接百兆其它设备非常正常。事实是使用一个百兆家用路由,wan口接G兆路由,Lan口接L ...

你得MAC地址咋设置的?

使用特权

评论回复
黎明的太阳|  楼主 | 2020-10-10 14:44 | 显示全部楼层
天意无罪 发表于 2020-10-10 13:17
你得MAC地址咋设置的?

用mcu的id生成的,应该没问题

使用特权

评论回复
天意无罪| | 2020-10-10 15:11 | 显示全部楼层
黎明的太阳 发表于 2020-10-10 14:44
用mcu的id生成的,应该没问题

方便把代码贴出来看看不?主要是以太网的配置

使用特权

评论回复
黎明的太阳|  楼主 | 2020-10-10 22:44 | 显示全部楼层
本帖最后由 黎明的太阳 于 2020-10-10 22:57 编辑
天意无罪 发表于 2020-10-10 15:11
方便把代码贴出来看看不?主要是以太网的配置

//mac地址生成片段
uint32_t GetUID(){
        return DBGMCU_GetDEVID(); //调用自stm32f10x_dbgmcu.h
}
void GetMAC(uint8_t& a,uint8_t& b,uint8_t& c,uint8_t& d,uint8_t& e,uint8_t& f){
        a=0xF1; //mcuid是4byte,所以捏了两字节的头a,b用以补够6byte的mac
        b=0x32;
        uint32_t id=GetUID();
        char* cs=(char*)id;
        c=cs[0];
        d=cs[1];
        e=cs[2];
        f=cs[3];
}
//初始化默认地址的初始化函数
static void SetDefault(ConfigInfo* config){
        memcpy(config->User,"admin\0",6);
        memcpy(config->Password,"admin\0",6);
        config->InitialFlag=INITIAL_FLAG;
        config->Local.IP=Network::IpAddress(192,168,1,38);
        config->Local.Mask=Network::IpAddress(255,255,255,0);
        config->Local.GateWay=Network::IpAddress(0,0,0,0);

        config->Server.ServerIP=Network::IpAddress(192,168,1,56);
        config->Server.ServerPort=80;
        config->Eth.Speed=0; //PHY速度,设置为0表示自动协商
        config->Eth.Duplex_Mode=0;  //双工半双工模式,0表示使用自动协商

}
//从一个32位整数还原ip地址(因为ip地址是配置的,配置后的结果是个32bit整数,使用时还原)
static void IpAddress(u32_t ipaddr, u8_t* a, u8_t* b, u8_t* c, u8_t* d)
{
        *a = (ipaddr >> 24) & 0xff;
        *b = (ipaddr >> 16) & 0xff;
        *c = (ipaddr >> 8) & 0xff;
        *d = ipaddr & 0xff;
}

//初始化本地Ip/网关/掩码 片段 pConfig是一个结构体指针,用于初始化
    uint8_t a,b,c,d;
    IpAddress(pConfig->Local.IP,&a,&b,&c,&d);
    IP4_ADDR(&ipaddr,a,b,c,d);
    IpAddress(pConfig->Local.Mask,&a,&b,&c,&d);
    IP4_ADDR(&netmask,a,b,c,d);
    IpAddress(pConfig->Local.GateWay,&a,&b,&c,&d);
    IP4_ADDR(&gw, a,b,c,d);        uint8_t mac_address[6];
    GetMAC(mac_address[0],mac_address[1],mac_address[2],mac_address[3],mac_address[4],mac_address[5]);
    Set_MAC_Address(macaddress);
    netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);
    netif_set_default(&netif);
    netif_set_up(&netif);
//其它的没啥,都是从stm模板里复制的
//代码经过整理,毕竟涉及文件比较多,不在一块
必须强调,这个lan8720在百兆网络里没有问题(我上面的帖子手残把G兆错录成百兆),但是无法通过G兆路由

使用特权

评论回复
天意无罪| | 2020-10-12 09:36 | 显示全部楼层
黎明的太阳 发表于 2020-10-10 22:44
//mac地址生成片段
uint32_t GetUID(){
        return DBGMCU_GetDEVID(); //调用自stm32f10x_dbgmcu.h

把你MAC的第一个字节,即你程序中变量a,赋值为a=0xF0。

使用特权

评论回复
黎明的太阳|  楼主 | 2020-10-12 18:20 | 显示全部楼层
天意无罪 发表于 2020-10-12 09:36
把你MAC的第一个字节,即你程序中变量a,赋值为a=0xF0。

相关?立刻实验下

使用特权

评论回复
黎明的太阳|  楼主 | 2020-10-12 18:42 | 显示全部楼层
天意无罪 发表于 2020-10-12 09:36
把你MAC的第一个字节,即你程序中变量a,赋值为a=0xF0。

遗憾不行,压根不识别网口,模式是自动协商,phy的橘红灯常亮,再帮想想办法,拜托
在G兆路由里cmd显示
C:\Users\zgd>arp -a 192.168.1.38
未找到 ARP 项。
在百兆路由下cmd显示
C:\Users\zgd>arp -a 192.168.1.38

接口: 192.168.1.78 --- 0x3
  Internet 地址         物理地址              类型
  192.168.1.38          f0-32-01-fa-02-f3     动态

使用特权

评论回复
黎明的太阳|  楼主 | 2020-10-12 18:57 | 显示全部楼层
天意无罪 发表于 2020-10-12 09:36
把你MAC的第一个字节,即你程序中变量a,赋值为a=0xF0。

如果是网速协议的问题,解释不了百兆和G兆直接通过lan到lan通不过的问题,但是通过wan到lan就可以通过,这倒是比较容易理解,转发了嘛。所以,是否我的lwip太旧了?我是从一个很早期的stm演示里复制出来的,百兆试通后就没敢乱动过

使用特权

评论回复
天意无罪| | 2020-10-13 09:11 | 显示全部楼层
黎明的太阳 发表于 2020-10-12 18:57
如果是网速协议的问题,解释不了百兆和G兆直接通过lan到lan通不过的问题,但是通过wan到lan就可以通过, ...

1、从你MAC地址来看,第一个字节的最低位应该是0,这个你改过来了,不行,说明不是MAC地址规则的原因。
2、你的板子直接连千兆路由不行,而通过百兆路由能行,那是因为对千兆路由来说,实际网络设备是那个百兆路由。从现象来看,还是你板子这边的原因,你用的哪个版本的Lwip,最好换成最新版本的。

使用特权

评论回复
黎明的太阳|  楼主 | 2020-10-15 16:21 | 显示全部楼层
天意无罪 发表于 2020-10-13 09:11
1、从你MAC地址来看,第一个字节的最低位应该是0,这个你改过来了,不行,说明不是MAC地址规则的原因。
2 ...

发现lwip版本是1.31的,先搞成1.41试验下

使用特权

评论回复
天意无罪| | 2020-10-15 16:26 | 显示全部楼层
黎明的太阳 发表于 2020-10-15 16:21
发现lwip版本是1.31的,先搞成1.41试验下

Lwip现在都升级到2.0版本了

使用特权

评论回复
黎明的太阳|  楼主 | 2020-10-15 17:27 | 显示全部楼层
天意无罪 发表于 2020-10-13 09:11
1、从你MAC地址来看,第一个字节的最低位应该是0,这个你改过来了,不行,说明不是MAC地址规则的原因。
2 ...

更新了1.41后,百兆反倒ping通了,千兆可以ping通,但是也有错误发生,看起来就是lwip版本问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

12

帖子

0

粉丝