搜索
bottom↓
回复: 24

STM32F103 + ENC28J60 + uIP1.0 DHCP无法工作!

[复制链接]

出0入0汤圆

发表于 2012-2-7 23:34:06 | 显示全部楼层 |阅读模式
大家好,最近在做STM32通过ENC28J60实现DHCP Client的工作,移植的uIP1.0。
现在的情况是这样的:
1、设置为静态IP时,可以ping通。
2、设置为动态获取IP,且打开DHCP的功能时,MAC地址为00:DE:F1:96:91:E5,第一个字节已经为偶数。此时将板子与PC链接时,使用Serva32模拟DHCP,看到DHCP Discover请求报文,且Serva32也已经给了Offer(如图1),但是在uIP的处理主循环里没有收到相应的数据。

(原文件名:dhcp-1.png)
图1
3、而且使用Microsoft Network Monitor检测到的报文也是OK的(如图2)。

(原文件名:dhcp-2.png)
图2
但是就是收不到PC返回的Offer数据包。
4、然后连接到Router后我用的是TP-LINK的TL-WR941N,查看系统日志,也没有我的ENC28j60的DHCP Discover报文。

情况如上述,我将工程源码上传上来,希望有做过这方面的前辈能够指点一二!!

工程文件ourdev_716718BAFLWC.zip(文件大小:5.46M) (原文件名:uIP_with_Problem.zip)

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2012-2-8 10:14:08 | 显示全部楼层
lz你有没有在udpapp上面吧67,68端口的给接进去,这边下载很慢,你直接把app代码贴出来,另外dhcp是有bug的,要改其中的一些代码,这你可上我直接百度下"uIP移植",第二个就是我写的,看名字就对了,里面有详细讲解.

出0入0汤圆

 楼主| 发表于 2012-2-8 11:53:31 | 显示全部楼层
好的~~我先仔细阅读前辈的博文,然后看看是否OK,如果还不OK,我就把代码贴出来,先谢谢了~

出0入0汤圆

发表于 2012-2-8 15:10:32 | 显示全部楼层
回复【1楼】myHXH
lz你有没有在udpapp上面吧67,68端口的给接进去,这边下载很慢,你直接把app代码贴出来,另外dhcp是有bug的,要改其中的一些代码,这你可上我直接百度下"uip移植",第二个就是我写的,看名字就对了,里面有详细讲解.
-----------------------------------------------------------------------

http://www.cnblogs.com/CodeHXH/archive/2012/01/19/2327426.html

很多代码,复制不好看,贴上地址,有些图不能显示哦~~

出0入30汤圆

发表于 2012-2-8 18:02:47 | 显示全部楼层
MARK。还没用到28J60.

出0入0汤圆

 楼主| 发表于 2012-2-9 03:21:18 | 显示全部楼层
问题找到~~
在myHXH兄的耐心的指导下,找到了问题的症结:

--========================================--
☆问题1.
28J60向PC端发送没有问题,但是收不到PC端DHCP服务器的Offer报文。

原因是28J60网卡初始化里没有将接受广播的过滤器寄存器的相应位打开。具体修改的地方在:
enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_BCEN);//原来是ERXFCON_PMEN,改为ERXFCON_BCEN
对应的datasheet的第8.0节开始就降到这个寄存器,可以参考一下每个位的具体功能。

--========================================--
☆问题2.
28J60接到路由后,路由还是无法接收到Discover报文,经详细查阅28J60的datasheet问题定位在网卡的工作模式上,之前是半双工模式,尝试改为全双工模式后,问题解决。修改地方为:

enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0 | MACON3_TXCRCEN | MACON3_FRMLNEN | MACON3_FULDPX);
//添加MACON3_FULDPX标志

--========================================--

myHXH兄一句话:网卡驱动你还是要先安静的吧enc手册看一遍。如醍醐灌顶,终生受用,我将静下心来好好的解决每一个遇到的问题,大谢myHXH兄!!

出0入0汤圆

发表于 2012-2-9 08:28:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-9 11:34:36 | 显示全部楼层
恩,还有勘误手册上面也讲到了全双工半双工的问题.这个事跟硬件无关的.所以有些人会误解.
另外半双工情况下是网卡是支持CSMA/CD的,所以也是可以正常工作的,就是会慢一点.

出0入0汤圆

发表于 2012-2-9 23:23:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-4-23 16:04:48 | 显示全部楼层
mark,准备用28J60

出0入0汤圆

发表于 2012-9-25 22:37:40 | 显示全部楼层
你好!我现在也在STM32F103 + ENC28J60+uIP1.0上移植DHCP但移植后,不会发送dhcp请求。
serva32上无法收到任何请求信息。板子可以ping通.
我在主流程中调用了dhcpc_init();
void myudp_appcall(void)
{
   //if(uip_udp_conn->lport == LPORT)                    //如果指定IP的指定端口发来数据
   //{
     if(uip_newdata())                                                
     {
                 //ETH_UDP_R=0;                           //UDP服务器数据接收标志置位                               
                  /* 获取远端的IP地址及端口号 */
                  rip[0]=uip_udp_conn->ripaddr[0]%0x100;
                  rip[1]=uip_udp_conn->ripaddr[0]/0x100;
                  rip[2]=uip_udp_conn->ripaddr[1]%0x100;
                  rip[3]=uip_udp_conn->ripaddr[1]/0x100;
                  rport=(((uip_udp_conn->rport)%0x100)<<8)+(uip_udp_conn->rport)/0x100;
                switch (uip_udp_conn->rport)
            {
            case HTONS(67):
                dhcpc_appcall();
                break;
            case HTONS(68):
                dhcpc_appcall();
                break;
            case HTONS(53):
                resolv_appcall();
                        break;
                default:
                        UDP_newdata();       
            }
              
     }
   //}
}

想请问一下,是否只调用dhcpc_init函数就可以启动dhcp流程了?

出0入0汤圆

发表于 2012-9-26 19:27:45 | 显示全部楼层
现在可以调用dhcp流程了。问题和楼主的现像完全一样了。但按楼主说的修改了
☆问题1.
28J60向PC端发送没有问题,但是收不到PC端DHCP服务器的Offer报文。

原因是28J60网卡初始化里没有将接受广播的过滤器寄存器的相应位打开。具体修改的地方在:
enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_BCEN);//原来是ERXFCON_PMEN,改为ERXFCON_BCEN
对应的datasheet的第8.0节开始就降到这个寄存器,可以参考一下每个位的具体功能。

--========================================--
☆问题2.
28J60接到路由后,路由还是无法接收到Discover报文,经详细查阅28J60的datasheet问题定位在网卡的工作模式上,之前是半双工模式,尝试改为全双工模式后,问题解决。修改地方为:

enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0 | MACON3_TXCRCEN | MACON3_FRMLNEN | MACON3_FULDPX);
//添加MACON3_FULDPX标志

还是不能解决问题。大家能否帮我一下

出0入0汤圆

发表于 2012-9-26 19:28:11 | 显示全部楼层
现在可以调用dhcp流程了。问题和楼主的现像完全一样了。但按楼主说的修改了
☆问题1.
28J60向PC端发送没有问题,但是收不到PC端DHCP服务器的Offer报文。

原因是28J60网卡初始化里没有将接受广播的过滤器寄存器的相应位打开。具体修改的地方在:
enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_BCEN);//原来是ERXFCON_PMEN,改为ERXFCON_BCEN
对应的datasheet的第8.0节开始就降到这个寄存器,可以参考一下每个位的具体功能。

--========================================--
☆问题2.
28J60接到路由后,路由还是无法接收到Discover报文,经详细查阅28J60的datasheet问题定位在网卡的工作模式上,之前是半双工模式,尝试改为全双工模式后,问题解决。修改地方为:

enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0 | MACON3_TXCRCEN | MACON3_FRMLNEN | MACON3_FULDPX);
//添加MACON3_FULDPX标志

还是不能解决问题。大家能否帮我一下

出0入0汤圆

发表于 2012-9-26 19:28:39 | 显示全部楼层
现在可以调用dhcp流程了。问题和楼主的现像完全一样了。但按楼主说的修改了
☆问题1.
28J60向PC端发送没有问题,但是收不到PC端DHCP服务器的Offer报文。

原因是28J60网卡初始化里没有将接受广播的过滤器寄存器的相应位打开。具体修改的地方在:
enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_BCEN);//原来是ERXFCON_PMEN,改为ERXFCON_BCEN
对应的datasheet的第8.0节开始就降到这个寄存器,可以参考一下每个位的具体功能。

--========================================--
☆问题2.
28J60接到路由后,路由还是无法接收到Discover报文,经详细查阅28J60的datasheet问题定位在网卡的工作模式上,之前是半双工模式,尝试改为全双工模式后,问题解决。修改地方为:

enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0 | MACON3_TXCRCEN | MACON3_FRMLNEN | MACON3_FULDPX);
//添加MACON3_FULDPX标志

还是不能解决问题。大家能否帮我一下

出0入0汤圆

发表于 2012-9-26 20:48:58 | 显示全部楼层
各位大虾帮下忙呀。

出0入0汤圆

发表于 2012-10-24 10:17:56 | 显示全部楼层
好贴 学习

出0入0汤圆

发表于 2013-6-5 14:07:27 | 显示全部楼层
我也碰到样的问题,解决不了呀,蛋疼!!!

出0入0汤圆

发表于 2013-6-14 17:20:44 | 显示全部楼层
我的问题是单片机收不到offer

出0入0汤圆

发表于 2013-7-1 21:57:02 | 显示全部楼层
同样的问题,我的驱动lz说的2个地方都是正确配置的。但是发现有的路由器不能接收到offer,我家里的TP-LINK的TL-WR841N,但是换到公司以后就能正确dhcp获取的地址;很奇怪。

出0入0汤圆

发表于 2013-11-7 19:55:57 | 显示全部楼层
好帖子,顶起来。我也在弄dhcp,希望能够成功

出0入0汤圆

发表于 2013-12-10 01:12:21 | 显示全部楼层
本帖最后由 crazyroc 于 2013-12-10 01:23 编辑
utopiaprince 发表于 2013-7-1 21:57
同样的问题,我的驱动lz说的2个地方都是正确配置的。但是发现有的路由器不能接收到offer,我家里的TP-LINK ...


我也遇到类似的问题。ENC28J60+AVR做的dhcp过程在我一个100M的2Wire路由上正常,但换了个1000M的Netgear路由就是没收到offer.
有2个问题困扰了我很久:
1. 连接在同个路由上的PC 使用wireshark软件能抓到ENC28J60发出的discover包(是否意为着路由器肯定也收到了呢?)
2. dhcp是否有新的规范?是否发出discover后就一定有offer过程?请看下面的图,我通过wireshark抓一个wince开发板在此路由上成功获得ip的过程,在其发出discover后我也没看到有offer包啊,似乎是路由在收到discover广播后发了个arp出去问谁是192.168.0.12,然后开发板又根据这个ip又重新以请求192.168.0.12 reques包的方式重新广播(又或许是在这个路由上就抓不到offer包?)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-12-10 05:22:26 | 显示全部楼层
很好的问题,先收藏了,以后调的时候再来看!

出0入0汤圆

发表于 2013-12-20 10:47:22 | 显示全部楼层
还没用到DHCP,收藏备用

出0入0汤圆

发表于 2014-10-15 16:23:05 | 显示全部楼层
打算用dhcp  先收藏一下

出0入0汤圆

发表于 2016-12-6 15:59:16 | 显示全部楼层
谢谢楼主的分享,并且也把遇到的问题及解决方案给说明出来,收藏好好看看代码。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 01:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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