#definePHYCFGR ((0x002E<<8)+(WIZCHIP_CREG_BLOCK<<3)) //16位地址段+8位控制段
*/
WIZCHIP_SPI_write_byte((AddrSel&0x00FF0000)>> 16);
WIZCHIP_SPI_write_byte((AddrSel&0x0000FF00)>> 8);
WIZCHIP_SPI_write_byte((AddrSel&0x000000FF)>> 0);//8位控制段
ret=WIZCHIP_SPI_read_byte();
WIZCHIP_CS_deselect();
WIZCHIP_CRIS_exit();
returnret;
}
uint8WIZCHIP_SPI_read_byte(void)
{
uint8data;
data= MSP430_SPI_read_byte();
returndata;
}
uint8MSP430_SPI_read_byte(void)
{
while(!
(UC0IFG&UCB0RXIFG))
;//waitforanrxcharacter?
returnUCB0RXBUF;//readingclearsRXIFGflag
}
答:
具体的问题?
开始是一个reset的延时,表示拉低reset脚多长时间使reset引脚生效。
下面那个是检查W5500PHY的状态。
看一下网线是插入还是断开状态。
你看一下你的While函数判断过后是否进入死循环。
建议先参考一下官方的STM32+W5500的代码,再转移到MSP430平台上
原帖来自:
9MCU
5.
W5500io的KeilC工程文件包
参考:
9MCU下载
6.
W5300和W5500的区别
问题描述:
您好,我想问一下,咱们的W5300和W5500的区别在哪里呢!
?
从它们的说明书上的特性和架构上来看,W5300比W5500还要复杂,能告知一下W5500相比较于W5300有什么相同点和不同点吗?
!
谢谢……迫切渴望您的回答!
!
!
答:
关于W5300和W5500的区别,请参考一下几点:
1.单片机接口不同。
W5300具有8/16位总线接口;W5500只有SPI接口
2.发送/接收缓存大小不同。
W5300的缓存是W5500的二倍
3.功耗方面,W5500具有低功耗模式
4.工艺方面,W5500是.13nm工艺,W5300是.18的
5.其他一些细微差别
因此如果要是高速率应用,选用W5300比较适合。
若是对速率要求不高,可以选用W5500。
>>如有任何问题可随时留言给我们,或发送至WIZnet官方邮箱:
wiznetbj@wiznet.co.kr
关注WIZnet更多动态:
WIZnet官方微博:
W5500问题集锦
(二)
发布时间:
2014-11-26 阅读次数:
441 字体大小:
【小】【中】【大】
W5500问题集锦
(二)
2014/11/11 | Filed under:
W5500问题集锦and tagged with:
W5500, 问题247 Views
W5500自去年9月推出,已经有一年的时间。
一年间,不乏很多客户纷纷将目光投向了W5500这颗性价比很高的全新硬件TCP/IP以太网芯片,无论是在工控、安防、交通,还是在智能医疗、智能家居等众多领域中,得到了广泛应用及认可。
同时,也收到了很多客户在使用过程中的问题反馈,比如W5500中断问题、切换端口问题,及W5500做服务器,多端口连接等常见问题。
这些,我们都一一帮助大家分析,一同解决!
那么,为了提高技术支持效率,也特此将这些问题再次整理给大家,以供分享!
期待能有所帮助!
1.
W5500作为服务器时,如何获取来自连接方的IP地址及端口
问题描述:
w5500作为服务器时,如何获取来自连接方的IP地址及端口?
我怎么没有找到寄存器呢
读DIPR 和SIPR都不对,
是不是没有查询方法呀?
UDP和TCP模式我都试过了,整了一天也没找出明堂来,如果实在不行,只能依靠,谁来连接W5500,谁就在DATA区自报家门了,但这样做感觉有点不是很爽,按说是可以获取到来自连接方的IP地址及端口的
比如W5500接在网络上,要对它进行搜索和设置,那么就要UDP广播包,目前可以收到广播包,但量回应的包,去对方收不到,只能怀疑是目标地址和端口没有更新在dipr寄存器了,请支招儿,谢谢!
!
答1:
TCP Server模式下,在连接建立后,由硬件更新目标IP和端口值。
答2:
收到信息的前面6个字节即为对方IP地址和端口号。
答3:
TCP Server 模式下,可以读取Sn_DIPR和Sn_DPORT来确定连接方的IP及端口。
这个是可以,你可以打印这个地址里的信息来查看。
W5500 As TCP Server
原帖来自:
9MCU
2.
W5500一个独立端口作为Server模式可以支持多少个客户端连接
问题描述1:
W5500一个独立端口端口作为TCP Server模式打开一个端口,此端口已经映射到外网,现在可能有多个客户端连接过来,可以支持多少个客户端连接?
经测试,只能支持一个连接,连接上一个客户端后,后连的客户端根本连接不上;而采用ENC28J60采用uip协议时,利用TCP方式监听端口,是可以支持客户端多连接的。
不知w5500内部的硬件协议栈能否支持作为server,多个客户端连接过来?
答1:
可以这样用,但是要把5500的Socket都设置成TCP Server,然后端口都一致。
这样就可以有8个客户连接进来了。
问题描述2:
就是说,每个独立端口实际上对应的是一个连接,最多只能有8个连接,对吧?
答2:
是的
答3:
按照你初始化第一个Socket 0为TCP Server的方式,将其他Socket 1~7 配置成参数一致的TCP Server即可
原帖来自:
9MCU
3.
W5500无法清中断
问题描述:
这几天一直在调试W5500,MCU用的是STM32F205,
可以正常的收发,非中断方式。
现在改用中断模式,无法清除中断。
用户手册上写,Sn_IR,清除需对应位写1。
但此寄存器为只读寄存器,每次对此寄存器进行写操作都会导致看门狗复位。
有没有人遇到类似情况,求教
注:
UDP方式
答:
问题已解决,是回环测试后又产生了SEND_OK中断,最终因超时引起看门狗复位。
屏蔽发送中断后一切正常。
原帖来自:
9MCU
4.
问一下:
无论是通用寄存器中断IR还是socket中断寄存器SN_IR中断的清除都是我们使用MCU对该寄存器进行手动写0XFF么?
谢谢哦。
期待回信。
。
。
问题描述:
W5500的中断是不是可以理解成二级中断?
首先判断是不是通用寄存器IR的中断,如果不是然后判断中断是不是来自SN_IR。
如果来自SN那么进行检测SN的中断触发。
。
检测到中断之后,需要手动的向产生中断的IR寄存器写入0XFF进行中断的清除?
请问是这种思路么?
答1:
请看看 W5500中断寄存器的理解
… ead&tid=1062343
答2:
首先,可以类似的说成是二级中断,通用寄存器的中断和Socket中断的细分不同。
其次,清中断就是往对应位上写1。
原帖来自:
9MCU
5.
W5500中断寄存器的理解
W5500中断寄存器的理解
W5500中文手册V1.0 写的不够清楚,该文是本人结合中英文手册及自己理解,整理出有关中断部分的理解,如有不正确的请指正。
一:
引脚 INTn 为中断输出(Interrupt output)
低电平:
W5500的中断生效;
高电平:
无中断或者处于中断生效等待中
二:
中断相关寄存器
2.1 IR (连接中断寄存器) [R/W] [0x0015] [0x00]
该寄存器主要指示网络连接错误或唤醒引起当的中断。
某位为1 且 该位中断没有被屏蔽就可以引发中断,INTn引脚将会被拉低,中断处理完毕后,可以由主机写为‘1’清除该位中断. IR 为‘0×00’时,INTn引脚将会被拉高。
2.2 IMR (连接中断屏蔽寄存器) [R/W][0x0016][0x00]
中断屏蔽寄存器(IMR)是用来屏蔽中IR中断的,某位写‘1’,则开启中断;写‘0’,关闭中断。
每个中断屏蔽位对应中断寄存器(IR)中的一个位. 如果IMR某位写0,即使IR中对应位为1了,也不会引发中断,INTn引脚不会被拉低。
2.3 SIR ( Socket 中断寄存器) [R/W] [0x0017] [0x00]
SIR就是指示哪个Socket发生的中断的。
如果某个Socket发生的中断,该寄存器的对应位将被置为1 ,直到被主机置‘1’清除。
如果Sn_IR不等于‘0×00’, 就会引发中断,INTn引脚将被拉低。
2.4 SIMR (Socket 中断屏蔽寄存器) [R/W] [0x0018] [0x00]
SIMR寄存器来屏蔽中SIR中断的,某位写‘1’,则开启中断;写‘0’,关闭中断。
每个中断屏蔽位对应中断寄存器(SIR)中的一个位. 如果SIMR某位写0,即使IR中对应位为‘1’了,也不会引发中断,INTn引脚不会被拉低。
2.5 Sn_IR (Socket n 中断寄存器) [R] [0x0002] [0x00]
Sn_IR 寄存器用于提供给Socket n 中断类型信息,如建立(Establishment)、终止(Termination)、接收数据(Receiving data)和超时(Timeout)。
当触发一个中断即Sn_IMR的对应位是’1′的时候,Sn_IR的对应位也将会变成‘1’。
如果想把Sn_IR位清零的话,主机应该将该位置‘1’
这里的[R],而不是[R/W] 表示不能由主机写‘1’让W5500产生中断,只能由主机设置‘1’ ,清除某一位中断。
2.6 Sn_IMR (Socket n 中断屏蔽寄存器) [R/W] [0x002C] [0xFF]
Sn_IMR 负责屏蔽Socket n的中断。
某位写‘1’,则开启中断;写‘0’,屏闭中断。
每一位都对应了Sn_IR寄存器的相应位。
Socket n的中断触发并且Sn_IMR的对应位为‘1’时,Sn_IR的对应位变为‘1’。
如果Sn_IMR和Sn_IR的对应位均为‘1’且SIR 寄存器的相应为‘1’,INTn 引脚便会拉低并使主机产生中断。
2.7 INTLEVEL (低电平中断定时器寄存器) [R/W] [0x0013 – 0x0014] [0x0000]
该寄存器用于设置中断生效等待的时间(IAWT)。
当下一个中断触发,中断引脚将会在INTLEVEL时间后,拉低中断引脚(INTn)。
A. 当Socket 0的超时中断被触发,S0_IR[3] & SIR[0]设置为‘1’,然后 INTn 引脚才被拉低。
B. 当Socket 1的连接中断在前一个中断未处理完成之前被触发,则INTn 引脚仍然为低,S1_IR[0] & SIR[1]位设置为‘1’。
C. 如果主机是通过完全清理S0_IR[3]位来完成中断清除,则INTn引脚被拉高,但是此时S1_IR[0] & SIR[1]仍然保持为‘1’。
D. 即使S1_IR[0] & SIR[1]位被设置为‘1’,但是在 INTLEVEL 期间,INTn不能被拉低。
只有过了INTLEVEL时间,INTn才能被拉低。
三:
中断方式设计程序
通过以上介绍,可知几个寄存器之间有如下关系:
A:
3个中断寄存器 IR,SIR ,Sn_IR,它们对应的3个中断屏蔽寄存器IMR,SIMR,Sn_IMR(也可以认为是中断使能寄存器)。
只有使能对应位中断,该位为‘1’时才能引发中断,拉低INTn。
B:
一次中断处理结束,清除对应状态位后,都会拉高INTn,如果还有别的中断状态寄存器为‘1’,就等待一定时间再拉低INTn。
这个时间是由INTLEVEL寄存器来设定的。
对于主机来说来一次中断,只能处理一个事件。
C :
IR寄存器与网络连接状态有关的寄存器,跟SIR,Sn_IR 没有关系。
而SIR 和Sn_IR 是同时出现的,SIR 指出是Socket n发生了中断事件,Sn_IR指出了Socket n 发生了什么中断事件,如收到数据 超时等。
因此如果主机采用中断方式,检测到INTn才能被拉低了,进入中断服务函数可以采用先判断是不是IR中断,不是就读取SIR状态,找到触发中断的那个Socket n。
然后读取 对应的Sn_IR 进行处理。
每次处理完,就对相应寄存器的相应位清除。
原帖来自:
9MCU
6.
W5500上传数据错误
问题描述1:
我现在使用CC2530单片机和MCU通过SPI接口和W5500连接,使用W5500库函数,下载进去程序之后,在电脑中可以ping 通W5500设备,在电脑中打开TCP工具,程序中设置MCU自动上传数据和接收到什么数据就返回什么数据,但是这两个数据都出现错误,不能接收到正常的数据,这个数据通过串口发送出来,都是正常的数据,在TCP工具中偶尔可以见到几包正确的数据,但是大多数时候都是错误数据包,搞不清楚哪里设置错误,请大神指点一下。
答1:
你好,你可以用Wireshark抓包看看有无丢包。
如果没有丢包的话,就是说裸数据阶段就出现问题了。
看一下你SPI的速率,试着提升一下SPI速率试一下。
有可能你SPI处理数据太慢了导致的。
问题描述2:
我单步执行的时候,数据还是错误的,但是没有出现丢包的现象,在内部数据还是正确的,但是执行到W5500发送出来的时候,就是错误的。
//SCK时钟4MHZ,时钟频率/8
U1BAUD = 0×00; // BAUD_M = 0
U1GCR |= 0×11; // BAUD_E = 17
SPI的速率我这是设置的4M,我也尝试着提高了速率,但是没什么效果,减少速率也是不行,大多数数据都是错误的,中间偶尔会出现几包正确数据。
答2:
问题已经解决,是库函数没设置好,send_data_processing()和recv_data_processing()中,ptr一开始是16位,因为移位使数据溢出,可以设置成32位,或者在移位的时候,进行强制类型转换的时候,多使用括号,不要因为优先级不同,不能安装自己想要实现的功能来运行。
原帖来自:
9MCU
7.
W5500作为客户端直接连接电脑和交换机失败。
通过路由器可以
问题描述:
/*********************************************
* 函数名 :
Detect_Gateway
* 描述 :
检查网关服务器
* 输入 :
无
* 输出 :
无
* 返回值 :
成功返回TRUE(0xFF),失败返回FALSE(0×00)
* 说明 :
无
******************************************************/
unsigned char Detect_Gateway(void)
{
unsigned char ip_adde[4];
ip_adde[0]=IP_Addr[0]+1;
ip_adde[1]=IP_Addr[1]+1;
ip_adde[2]=IP_Addr[2]+1;
ip_adde[3]=IP_Addr[3]+1;
//检查网关及获取网关的物理地址
Write_W5500_SOCK_4Byte(0,Sn_DIPR,ip_adde);//向目的地址寄存器写入与本机IP不同的IP值
Write_W5500_SOCK_1Byte(0,Sn_MR,MR_TCP);//设置socket为TCP模式
Write_W5500_SOCK_1Byte(0,Sn_CR,OPEN);//打开Socket
os_dly_wait (100);//Delay(5);//延时5ms
if(Read_W5500_SOCK_1Byte(0,Sn_SR) !
= SOCK_INIT)//如果socket打开失败
{
Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//打开不成功,关闭Socket
return FALSE;//返回FALSE(0×00)
}
Write_W5500_SOCK_1Byte(0,Sn_CR,CONNECT);//设置Socket为Connect模式
do
{
u8 j=0;
j=Read_W5500_SOCK_1Byte(0,Sn_IR);//读取Socket0中断标志寄存器
if(j!
=0)
Write_W5500_SOCK_1Byte(0,Sn_IR,j);
os_dly_wait (10);//Delay(5);//延时5ms
if((j&IR_TIMEOUT) == IR_TIMEOUT)
{
return FALSE;
}
else if(Read_W5500_SOCK_1Byte(0,Sn_DHAR) !
= 0xff)
{
Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//关闭Socket
return TRUE;
}
}while
(1);
}
直接连接电脑的时候死在了这个函数里。
Read_W5500_SOCK_1Byte(0,Sn_DHAR) 的返回值一直是ff
答1:
无法获取目标MAC地址。
应该是W5500发出ARP请求,没有收到对应的回复。
你的交换机各个口之间是透明的吗?
如果是的话,用PC连在一个port上,用Wireshark抓包看一下。
你也可以把抓包附上来看一下。
答2:
问题找到了。
用交叉网线就可以了
原帖来自:
9MCU
8.
W5500工业方面有使用的吗
问题描述:
w5500抗干扰能力怎么样
答:
你好,
W5500的抗干扰还是很好的,工业客户还是蛮多的。
其实,光说的话也没有太大意义,你可以测试评估一下。
你可以给我一个邮箱,我发测试报告给你。
WIZnet的芯片都是工业级芯片。
原帖来自:
9MCU
9.
W5500端口切换问题!
问题描述1:
我是用的是自带协议栈的W5500+STM32F103!
我想要实现的功能:
向多个客户端节点同时发出命令,然后每个节点接收到命令后要开始数据的上传以及一些其他的节点操作;这样的需求,按照常理,应该是服务器发布命令使用广播,也就是UDP,为保证数据可靠性,数传就使用TCP!
这中间就存在了一个协议的切换问题,那我是不是可以在端口1使用UDP,在端口2使用TCP?
!
想问一下各位,W5500能够轻松的实现切换吗?
!
还有,UDP和TCP在切换中有什么需要注意的?
!
补充一点,现在我使用的是在TCP中加了一个for();循环,来给各个节点发布命令,相当于模拟了一个UDP广播,但是这样就浪费了大量的时间,请问有什么好的改进方法!
?
答1:
w5500有8个socket,可以一个socket做UDP广播,一个socket做TCP Server。
这样你可以使用socket_udp发送命令后,客户端节点收到命令后,将数据发到TCP Server。
当然需要处理的是TCPServer接收缓冲区的数据。
不知道这样的方案您能