STM32F407网口win10无线通信已关闭中怎么关闭DHCP

查看: 739|回复: 5
关于以太网通信DHCP获取的问题
主题帖子精华
新手入门, 积分 44, 距离下一级还需 -24 积分
在线时间1 小时
本人根据开发板自己做了一个以太网通信的板子,在调试的时候1wIP Init成功,但是程序运行到
while((lwipdev.dhcpstatus!=2)&&(lwipdev.dhcpstatus!=0XFF))//等待 DHCP DHCP 成功 /超时
{ lwip_periodic_handle(); }
的时候就死循环了,没有办法获取到IP地址,这是哪里出问题了?
希望有大神给予指点,感谢!
主题帖子精华
金钱128888
在线时间1149 小时
网络模块的灯亮了么?
不能dhcp,那静态ip呢?能ping通么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
新手入门, 积分 44, 距离下一级还需 -24 积分
在线时间1 小时
回复【2楼】正点原子:
---------------------------------
RJ45的灯在闪,静态IP没有获取到,所以PING不通啊
主题帖子精华
金钱128888
在线时间1149 小时
回复【3楼】chen:
---------------------------------
那就继续调代码了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
新手入门, 积分 44, 距离下一级还需 -24 积分
在线时间1 小时
回复【4楼】正点原子:
-----------------------------代码用的就是例程的代码啊,另外测了一下RMII_REF_CLK的晶振是40M,不是50M
主题帖子精华
金钱128888
在线时间1149 小时
回复【5楼】chen:
---------------------------------
必须是50M啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
Powered by查看: 885|回复: 18
STM32F407VE+DP83848C+LWIP移植,DHCP分配超时
主题帖子精华
初级会员, 积分 120, 距离下一级还需 80 积分
在线时间16 小时
各位大神好,我最近用STM32F407VE+DP83848芯片的板子,尝试移植了原子哥的LWIP无系统移植的例程,并把LAN8720A的网卡芯片的物理地址改为了DP8,但测试中发现程序在DHCP分配时一直超时,无法实现进一步的TCP通信,已经卡在这好几天了,并且查了很多资料一直未能解决,附件是DP83848的原理图部分,麻烦各位大神不吝赐教,拜托!!
(121.52 KB, 下载次数: 0)
15:10 上传
主题帖子精华
高级会员, 积分 878, 距离下一级还需 122 积分
在线时间152 小时
正好我刚刚弄好,基于RTT-STM32F107-dp83848-lwip。现在分配超时,那就先不要用DHCP,直接使用静态的IP,使用网线直连到电脑上看看能不能PING通。
主题帖子精华
高级会员, 积分 878, 距离下一级还需 122 积分
在线时间152 小时
你有一个问题诶,你的PHY地址是0x01,你是怎么得到的这个地址,我刚刚调通的板子的地址是0x1F
主题帖子精华
初级会员, 积分 120, 距离下一级还需 80 积分
在线时间16 小时
您好,请问您说的是网卡的物理地址吗。。。我的网卡的物理地址是0x01,stm32f4x7_eth_conf.h中的配置如下:
//DP83848 PHY芯片的状态寄存器
#define PHY_SR& & & & & & & & & & & & & & & & ((uint16_t)16) & & & & & & & & //DP83848的PHY状态寄存器地址
#define PHY_SPEED_STATUS& & ((uint16_t)0x0002) & & & & //DP83848 PHY速度值掩码
#define PHY_DUPLEX_STATUS& &((uint16_t)0x0004) //DP83848 PHY连接状态值掩码
主题帖子精华
初级会员, 积分 120, 距离下一级还需 80 积分
在线时间16 小时
你有一个问题诶,你的PHY地址是0x01,你是怎么得到的这个地址,我刚刚调通的板子的地址是0x1F
您好,我是这么改的,不确定对不对。
#define DP83848_PHY_ADDRESS&&& & & & 0x01& & & & & & & & & & & & & & & & //LAN8720 PHY芯片地址.
我看原子哥的LAN8720的例程里边,网卡地址是0x00,我用的DP83848,所以改用了0x01,但这俩现在都不行,,,,我先试试您说的地址,看能否解决哈
主题帖子精华
初级会员, 积分 120, 距离下一级还需 80 积分
在线时间16 小时
你有一个问题诶,你的PHY地址是0x01,你是怎么得到的这个地址,我刚刚调通的板子的地址是0x1F
您好,我现在用的这个板子的上一版本用测试程序可以PING通,但没做后续的测试,现在我移植了完整的LWIP的例程后测试DHCP总是超时,一直没解决,好郁闷。
主题帖子精华
初级会员, 积分 120, 距离下一级还需 80 积分
在线时间16 小时
你有一个问题诶,你的PHY地址是0x01,你是怎么得到的这个地址,我刚刚调通的板子的地址是0x1F
您好,请问您现在DHCP的问题解决了么。。。我用0x1F的地址DHCP还是超时,,,顺便问您一下,在初始化时对板子的MAC地址有什么特殊要求吗,我是随便写的一个
主题帖子精华
高级会员, 积分 878, 距离下一级还需 122 积分
在线时间152 小时
你这样根本不可能通的,你的PHY地址你都还没弄明白。你看了下你的硬件,你的0X01不对0X1F也不会对的,具体多少,自己看芯片手册。我的是0X1F是我的硬件决定的。
你现在PHY地址都是错的,你DHCP能通才见鬼了。
主题帖子精华
初级会员, 积分 120, 距离下一级还需 80 积分
在线时间16 小时
你这样根本不可能通的,你的PHY地址你都还没弄明白。你看了下你的硬件,你的0X01不对0X1F也不会对的,具体 ...
您好,我刚看了下手册,里边的例子中的RXD_0加了上拉电阻,所以地址是0x03,但我的PHYAD1/PHYAD2接的并不是上下拉电阻,所以我用的PHY地址为0x01,我不知道我这样理解是否正确呢
(24.77 KB, 下载次数: 0)
18:26 上传
主题帖子精华
初级会员, 积分 120, 距离下一级还需 80 积分
在线时间16 小时
你这样根本不可能通的,你的PHY地址你都还没弄明白。你看了下你的硬件,你的0X01不对0X1F也不会对的,具体 ...
请问您的芯片的地址引脚全部外接了上拉电阻,所以地址是0x1F吗
主题帖子精华
高级会员, 积分 878, 距离下一级还需 122 积分
在线时间152 小时
本帖最后由 whj 于
08:21 编辑
请问您的芯片的地址引脚全部外接了上拉电阻,所以地址是0x1F吗
PHY地址是由PHYAD[0:4]来决定的。可以看到我的是5个引脚全部接了,所以是 1 1 1 1 1=0x1F。按照你程序里写的0X01那么引脚应该接的是PHYAD0,其他全部悬空。
(138.35 KB, 下载次数: 0)
08:18 上传
主题帖子精华
初级会员, 积分 120, 距离下一级还需 80 积分
在线时间16 小时
PHY地址是由PHYAD[0:4]来决定的。可以看到我的是5个引脚全部接了,所以是 1 1 1 1 1=0x1F。按照你程序里 ...
您好,我现在的PHYAD[1-2]都接了个电阻,但不确实是上拉还是下拉,我测试了PHY的地址为:0x01/3/5/7,还是未能解决问题,请问您的DHCP超时的问题解决了么
(226.22 KB, 下载次数: 0)
10:34 上传
主题帖子精华
高级会员, 积分 878, 距离下一级还需 122 积分
在线时间152 小时
你为什么不能先用网线直连先确定你的硬件和驱动都没有问题了,在去找DHCP为什么超时的问题?
上面没解决,你再问DHCP超时有什么意义。
调试能不能一步一步来?
主题帖子精华
初级会员, 积分 120, 距离下一级还需 80 积分
在线时间16 小时
你为什么不能先用网线直连先确定你的硬件和驱动都没有问题了,在去找DHCP为什么超时的问题?
上面没解决, ...
您好,我现在这个板子的上一版的网卡这一块测试是可以ping通的,而且那个ping通的程序用的地址也是0x01。。。所以我现在也不知改怎么弄了
主题帖子精华
初级会员, 积分 120, 距离下一级还需 80 积分
在线时间16 小时
怎么办,好郁闷,求大神指点迷津呀
主题帖子精华
金钱128888
在线时间1149 小时
主题帖子精华
初级会员, 积分 120, 距离下一级还需 80 积分
在线时间16 小时
顶起来呀,别沉
主题帖子精华
高级会员, 积分 878, 距离下一级还需 122 积分
在线时间152 小时
先看看硬件有没有问题啊,看看晶振有没有起震
主题帖子精华
在线时间119 小时
有这么纠结吗,
1.先确定硬件问题,设置读取相关DP838448寄存器,看能不能正常。
2.软件问题,进入调试状态,打开LWIP的Debug,跟踪打印信息。
3.看上面描述,你的PHY 地址是 0x1,先试下能不能Ping通,然后再用静态地址,最后用DHCP。
Powered bystm32f407以太网及USB OTG快速开发_360doc个人图书馆
stm32f407以太网及USB OTG快速开发
  (2) & &设置clock,板子使用的是8MHz的晶振,软件对应的是Peripheral –&RCC。如下图:(3)&&&&&&根据原理图配置以太网,选择的是RMII接口,注意由于有管脚的复用,所有选择RMII后,软件自动的软件不一定和原理的对应上,我们应该按照原理图来配置管脚!对应上的就不用更改,不对应上就必须更改。如下图:、原图上的以太网PHY芯片管脚连接图是RMII接口,如下图所示:相应的管脚,软件对应管脚配置RMII_REF_CLK 、ETH_MDIO、RMII_CRS_DV、ETH_RESET、RMII_TX_EN、RMII_TXD0、RMII_TXD1这些管脚对应的位置以及软件上的配置,如下图:经过上述配置以太网的管脚基本上映射好了。修改管脚配置,方法:点击某个关键在弹出的功能菜单选中对应的功能即可!2、USB OTG管脚映射OTG配置!使用FS做OTG,因为原理图上面用的是FS。管脚使用默认的管脚无需更改。3、UART1作为打印口映射管脚使用默认的管脚无需更改。4、第三方库的配置(1) & & &第三方库的配置主要是文件系统(USB OTG需要)、网络协议栈(以太网需要)、RT OS(选配本次使用OS方便后面的以太网和USB OTG任务的调度)。如下:由于选了OS,而OS的滴答基于Systick来运作的,所以我们得另外选择定时器用来做软件的tcik的这里选这TIM1。如下图所示:配置sys tick,系统记时,单位是ms第三方库的选配:文件系统选择USB Disk USB硬盘设备使能freeOS(嵌入式实时操作系统)、LWIP(TCP/IP协议栈)细节方面:系统时钟的配置系统时钟的配置,Clock configuration选项卡里设置,如下配置:使用168MHz的时钟,USB时钟必须是48MHz。具体配置如下:功能的配置 Configuration选项卡里面设置,为了方便网页的开发,我这里配置LWIP的httpd功能,GPIO设置输出设置为High。如下图:总体细节框架如下:生成代码框架步骤:生成代码框架,菜单project-&setting设置编译平台和目录,Generator code生成代码框架!代码的配置1、进入到软件的及代码平台的编写!(1)&&&&&&PHY驱动的编写由于按照上面的步骤生成的代码基本上是可以用的,但是该代码基于的是LAN8742A芯片配置的PHY,原理图上用的是LAN8720,注意PHY芯片基本都上都一样的主芯片和PHY通信是通过MDIO接口来通信的,这个是标准化的,所以框架程序里面也是这样子的,这些基本不用改,而且PHY是IEEE802.3中定义的一个标准模块,PHY芯片的寄存器地址0-31地址具体功能IEEE802.3也是规范化标准了的,所以移植的时候就很方便了,不同的是PHY复位时间和PHY芯片地址,关于地址LAN8720有如下描述:The PHYAD0 bit is driven high or low togive each PHY a unique address.PHYAD 0 bit设置为1或者0以给PHY一个唯一的地址,就是LAN7820A的地址。Thisaddress is latched into aninternal register at the end of a hardware reset (default = 0b). PHY芯片硬件复位后地址被锁在内部寄存器。In a multi-PHY application (such as a repeater), the controller isable to manage each PHY via the unique address. 多PHY芯片应用场景(例如一个中继器),控制器能够通过这个唯一的地址管理每隔PHY芯片。Each PHY checks eachmanagement data frame for a matching address in the relevant bits. 每隔PHY芯片检查检查每个管理数据帧的相关位来匹配这个地址。When a match is recognized, the PHYresponds to that particular frame. 当一个匹配被检查到,PHY响应一个特殊的帧。The PHY address is also used to seed the scrambler.PHY.地址也用于种子的扰码In a multi-PHYapplication, this ensures that the scramblers are out of synchronization and dispersesthe electromagneticradiation across the frequency spectrum.根据上面的说法我们这里LAN7820的地址应该是0,所以找到LAN8742A_PHY_ADDRESS这个定义改为0即可。位置:Stm32f4xx_hal_conf.h复位时间IP修改修改自己的IP,注意该框架是默认打开DHCP的,DHCP功能,设备能在网内能请求DHCP服器来动态的配置设备的IP,我们这里要设置为固定iP,所以禁用DHCP!如下:头文件:lwipopts.hlwip.c文件修改固定IP修改,为了方便使用,我这定义一个联合体类型来存储IP地址,如下图:修改HAL_ETH_Init函数,添加硬复位如下:LWIP测试结果经过这样子就修改就可以完成了!只用主机能ping通,注意打印口映射代码没写出来,这个很简单,百度一下就有。具体实验图如下:使用正点原子的串口工具,必须用它的。注意要打开一些调试信息就可以看到了这些打印信息了。USB OTG 则直接可以用,答应USB监听状态,实验效果图如下:USB测试结果插入USB,主机检测到了USB连接上了,可以调用mount然后fopen函数来正常的读取文件了,到此基本完成!总结1、完成了LWIP和USB的功能,剩下就是网络通信,这些都是应用程序了,相对来说简单。网络通信无非就是SOCKET、以及USB就是fopen函数的调用write和read函数等。2、关于打印口看到了httpd_init,那是因为我添加了网页设计,通过网页可以修改IP等。3、使用STM的STM32CubMx软件快速开发出你想要的框架,底层配置大多数可以不用自己的手工的去计算,比如时钟,如果通过自己的计算来给各个总线来分配时钟源那会相当麻烦,从做STM32F103的时候就深有体会。如果还不会这个软件的,建议还是得学会,因为它可以帮我们很大的忙。作为从事STM32和linux开发的我来说,省去一大部分的时间了。
来自:&&& 《》在最近的一个项目中需要实现Modbus TCP通讯,而选用的硬件平台则是STM32F103和W5500,软件平台则选用IAR EWAR6.4来实现。
1、移植千的准备工作
为了实现Modbus TCP通讯首先需要下载W5500的驱动源码,可以到WIZnet的官网下载:
http://wizwiki.net/wiki/doku.php?id=products:w5500:driver
下载下来的压缩包,解压后如下图:
需要将ethernet文件夹拷贝到我们的项目目录中:
并在IAR的项目下添加相关的文件和路径,主要是socket.c、w5500.c、wizchip_.conf.c三个文件。这三个文件分别实现socket、硬件驱动及相关通讯配置功能,具体可以查看相应的源码级手册。
并在如下图所示的项目选项设置中添加Ethernet和Ethernet\W5500目录。
2、移植过程和代码编写
在完成以上工作后就可以开始真正地移植工作了。具体步骤如下:
硬件配置及初始化。
以太网通讯配置的初始化。
实现具体的通讯过程。
2.1、硬件的配置及初始化
由于W5500通过SPI接口与STM32通讯,所以硬件配置和初始化是非常简单的,与W5500实际上没有关系,使一些通用的操作。事实上就是STM32F103的SPI接口初始化的过程,需要实现RCC、GPIO以及SPI的初始化就可以了。关于这部分可以查看ST的例程。
2.2、以太网通讯配置的初始化
以太网通讯配置的初始化主要有三个方面的内容:
注册TCP通讯相关的回调函数& RegisterFunction();
初始化芯片参数& ChipParametersConfiguration();
初始化网络通讯参数& NetworkParameterConfiguration()
三个函数的具体实现内容如下:
//函数注册,首先,应由用户实现SPI注册回调函数来访问WIZCHIP
void RegisterFunction(void)
//临界区回调函数
reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit);
//注册临界区函数
//片选回调函数
_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_
reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);//注册SPI片选信号函数
#elif _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_
reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);
// CS必须为低电平.
#if (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SIP_) != _WIZCHIP_IO_MODE_SIP_
#error "Unknown _WIZCHIP_IO_MODE_"
reg_wizchip_cs_cbfunc(wizchip_select, wizchip_deselect);
//SPI的读写回调函数
reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte);
//注册读写函数
注册函数实际上就是函数指针的调用,可参考C语言函数指针部分内容。对于以上注册的函数,SPI_WriteByte需要说明一下,无论是用可函数还是直接操作寄存器,在写完之后都需要再读一下(红色部分),否则就会在客户端出现连接TCPServer超时的报警,没明白什么原因。
//写1字节数据到SPI总线
void SPI_WriteByte(uint8_t TxData)
while((SPI2-&SR&SPI_I2S_FLAG_TXE)==0);
//等待发送区空
SPI2-&DR=TxD
//发送一个byte
while((SPI2-&SR&SPI_I2S_FLAG_RXNE)==0);
//等待接收完一个byte
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
//等待发送区空
SPI_I2S_SendData(SPI2,TxData);
//发送一个byte
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == RESET);
//等待接收完一个byte
SPI_I2S_ReceiveData(SPI2);
//返回接收的数据
初始化芯片参数:
//初始化芯片参数
void ChipParametersConfiguration(void)
uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};
//WIZCHIP SOCKET缓存区初始化
if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1){
//printf("WIZCHIP Initialized fail.\r\n");
//PHY物理层连接状态检查
if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1){
//printf("Unknown PHY Link stauts.\r\n");
}while(tmp == PHY_LINK_OFF);
&以上实现网络物理层的配置。
初始化WIZCHIP中的网络参数信息:
//初始化WIZCHIP中的网络参数信息
void NetworkParameterConfiguration(void)
uint8_t tmpstr[6];
ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);
ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);
ctlwizchip(CW_GET_ID,(void*)tmpstr);
其中gWIZNETINFO是一个wiz_NetInfo类型的结构体变量,该结构体在wizchip_conf.h中定义,用于设置mac地址、IP地址等网络参数,具体如下:
typedef struct wiz_NetInfo_t
uint8_t mac[6];
///& Source Mac Address
uint8_t ip[4];
///& Source IP Address
uint8_t sn[4];
///& Subnet Mask
uint8_t gw[4];
///& Gateway IP Address
uint8_t dns[4];
///& DNS server IP Address
///& 1 - Static, 2 - DHCP
至此网络部分的初始化就已完成。
2.3、具体通讯过程的实现
经过前面的配置网络已经可以ping通了,下面可以实现具体的应用。对于我这个项目就是可是实现Modbus TCP的编写了。
编写TCP Server,这部分有很多资料,直接附代码:
//TCP服务器数据通讯
int32_t TCPServer(uint8_t sn, uint16_t port)
uint8_t socketStatus=getSn_SR(sn);
switch(socketStatus)
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
setSn_IR(sn,Sn_IR_CON);
uint16_t size=0;
if((size = getSn_RX_RSR(sn)) & 0)
if(size & DATA_BUFFER_SIZE)
size = DATA_BUFFER_SIZE;
uint8_t rxBuffer[DATA_BUFFER_SIZE];
ret = recv(sn,rxBuffer,size);
if(ret &= 0)
//添加数据解析及响应的函数
uint8_t txBuffer[DATA_BUFFER_SIZE];
uint16_t length=ReceivedDataParsing(rxBuffer,txBuffer);
uint16_t sentsize=0;
while(length != sentsize)
ret = send(sn,txBuffer+sentsize,length-sentsize);
if(ret & 0)
close(sn);
sentsize += // 不用管SOCKERR_BUSY, 因为它是零.
case SOCK_CLOSE_WAIT :
if((ret=disconnect(sn)) != SOCK_OK)
case SOCK_INIT :
if( (ret = listen(sn)) != SOCK_OK)
case SOCK_CLOSED:
if((ret=socket(sn,Sn_MR_TCP,port,0x00)) != sn)
其中ReceivedDataParsing(rxBuffer,txBuffer)实现具体的Modbus协议,根据具体的需求而定。
通过Modscan连接测试,结果正确。
欢迎关注:
阅读(...) 评论()1 / 415 页
昨天&17:35
昨天&16:27
昨天&20:34
昨天&21:00
昨天&18:07
昨天&16:26
前天&22:12
前天&23:08
昨天&12:01
昨天&11:35
昨天&17:33
昨天&23:18
昨天&15:35
昨天&13:34
昨天&14:49
昨天&20:48
昨天&21:14
昨天&11:40
前天&11:16
昨天&19:53
昨天&17:33
昨天&20:03
昨天&09:56
前天&16:42
前天&13:39
1 / 415 页
Powered by

我要回帖

更多关于 无线通信已关闭 的文章

 

随机推荐