-
2021-09-29 16:13:49
**
W5500问题集锦
1、 如何确认W5500网络芯片物理连接是否正常?
使用W5500网络协议芯片,对其进行可靠的硬件复位(网络协议芯片的RESET或RST引脚)后可能出现下列现象:(1) 芯片的LINKLED引脚输出低电平,LINKLED指示灯会被点亮(未接,接错或灯坏除外).
(2) 如果是通过网线直连电脑,电脑上本地连接显示本地连接已连接状态。如果是网线连到路由等设备,路由等相应指示灯提示连接成功。
如果出现上述现象,表明物理连接已经成功并且芯片工作,否则需要排查相关问题。
2、 如何检测W5500物理连接是否成功与芯片是否工作及相关线路是否正常有关系?
(1) 因芯片焊反或关键位置虚焊,短路等问题导致芯片不能正常工作。(2) 因芯片的供电,接地等不正常或连接芯片,导致芯片不能正常工作。
(3) 因芯片引脚外接的用于隔离数字电源与模拟电源的1uH电感损坏开路,导致不能工作。
(4) 因芯片的晶振不按要求连接,而导致芯片不能工作。使用有源振荡器的,线路连接错误,或者有源振荡器的电压不是1.8V,请参考原理图进行正确设计 。
(5) 因复位引脚连接错误,使得芯片不能完成可靠复位。
(6) 因线路中RXIP、RXIN、TXOP、TXON与变压器的连接错误,导致与电脑等无法建立连接。
(7) 因采用与线路不匹配的或坏的RJ45模块和变压器导致与电脑等无法连接。这里需要特别补充一下的是,W5500变压器连接上与W5100、W5200、W5300大不一样,如直接把他们的连接照搬过来可能不能工作,具体参考原理图。
(8) 因网线或电脑路由器等不正常而无法连接。
(9) 因某些MCU只需电压2.7V就可工作,MCU在电压还未上升到3V就对需要3V以上才能运行的网络协议芯片进行复位操作必然失败,最终导致不能连接。(可程序解决)
(10) 如果是使用的W5300芯片,当不使用外部PHY时,TEST_MODE[3:0](19~22引脚),必须全部为低电平,可全接地,否则可能因没有PHY导致不能连接。
3、 W5500连接正常却PING不通,怎么办?
W5500芯片是否可以ping通,不仅与物理连接等有关系,还和相关电路以及网关、子网掩码、MAC地址、IP地址配置有关系,可以从以下方面进行排除:(1) W5500的EXRES1引脚(10脚)所接12.4K参考电阻,均接地且要求误差必须控制在1%以内。
(2) RXIP、RXIN、TXOP、TXON接口,信号长度必须小于 25cm,越短越好,且尽量走等
长线,各差分信号相差不能超过2.5cm。RXIP,RXIN应尽量靠近,TXOP,TXON应尽量靠
近,有条件的应走平行线。
(3) 必须保证被操作的寄存器地址配置正确。
(4) 可以对寄存器进行读写操作,判断读写是否一样,采用SPI接口的可以以此判断SPI部分的程序以及电路有无问题。使用并行接口的,则可以判断程序以及地址线、数据线的连接有无问题。
(5) MAC地址的第一个字节必须为偶数。
(6) 必须正确设置子网掩码,且电脑IP地址与网络芯片的IP地址必须设置在同一个子网。
4、 为什么W5500芯片可以PING通,但无法发送数据?
W5500芯片可以ping通,说明相关电路以及网关、子网掩码、MAC地址、IP地址配置均正常, 如果不能建立连接发送接收数据,需要从从SOCKET配置,SOCKET状态,中断寄存器,发送接收程序,或是上位机软件的设置等进行排查 。具体配置参考W5500数据手册
5、 W5500在配置时需要检查网关吗?为什么?
其实只要不访问外网,完全可以不做这个检测,如果要访问外网,必须经过网关,做这步就是为提前知道网关是否存在,是否正常工作。6、 为什么检测网关时要将目的IP地址每位加‘1’?
在正确设置网关的情况下,去连接一个不在同一子网(外网)的目的IP,就可找到网关,而将目的IP每位加1,正好造就一个不在同一子网的目的IP,如果愿意你加2加3都可以。7、 为什么检测网关要判断目的MAC地址首位不为0xff?
因为未找到网关以前,读出目的MAC地址所有位全为0xff, 至于为什么判断首位,因为找到的目的MAC地址首位应该是偶数,因此绝不可能是0xff(255)8、 WIZnet网络芯片TCP模式下的客户端与服务器有什么异同?
不同点:客户端起启动连接(CONNECT)的作用,主动连接必须要知道连接目标,因此要正确设置SOCKET的目的(服务器)IP和目的(服务器)端口号。
服务器则是侦听的作用(LISTEN),等待连接不需要设置目的IP 和目的端口号,客户端来连接时,服务器自然知道客户端的IP地址与端口号。
相同点:
客户端服务器SOCKET 分片长度最大均为1460字节,即每次发送最大为1460字节
客户端服务器均要先配置为TCP模式
客户端服务器连接成功均为SOCK_ESTABLISHED状态(Sn_SR 寄存器)
详细内容可查看各芯片的《数据手册》
9、 TCP模式下,通过路由器,对方拔掉网线后,再插上后不能建立通讯怎么办?
WIZnet芯片可以在发送过数据后,空闲既未发送也未接收达的情况,到一定时间(3秒,5秒,10秒自定义)后,发送SEND_KEEP命令,如对方正常就保持连接,如果对方在一定时间内未回应,则发出超时中断,自动关闭SOCKET端口,就可以自动重新连接,这样就能连接上了。但此命令只能用于TCP模式,如果是UDP模式下如果也想查看对方状态就需要从程序想办法了。10、 请问,官方例程为什么不提供中断模式控制W5500的数据收发呢
因为中断读了数据后,然后还是要去读寄存器,去判断是什么中断,有可能在判断的过程中又来了N 个中断,增加中断就增加了很多不确定因素。中断必然有响应时间,当上次中断还没结束,又产生新的中断甚至连续产生多次新的中断时,或者中断标志未及时清除,必然不能响应所有中断,此时以中断标志位来判断是否该接收,必然丢失数据。
11、 同一块芯片,同时使用多个SOCKET工作,应该注意什么问题
WIZnet目前每款网络协议芯片都可以支持多个SOCKET同时工作,但每个SOCKET可以且必须以不同的端口号做为区分。12、 多块网络协议芯片同时使用,端口号可以设置成一样吗?
多块网络协议芯片在同一个子网中使用,应具备唯一的MAC地址,唯一的IP地址,因为不在同一块网络芯片,IP地址、MAC地址不一样,因此可以设置成一样的端口号。13、 W5500设备,在同一网段存在多台设备的情况,运行不正常
问题描述:单个设备在局域网中的时候能够正常Ping通,而且TCP连接也使用正常没有任何问题;解答:首先检查程序中IP地址、MAC地址是否有冲突,如果地址都没有冲突,可检查程序中配置的问题。
14、 同一块网络芯片的多个SOCKET,可以同时设置成客户端去连接电脑服务器的一个端口吗,怎么实现?
当然可以,WIZnet每款网络协议芯片都可以支持多个SOCKET同时工作,只需将芯片内每个SOCKET设置成不同端口号,分别设置成客户端去连接服务器就行, 前提是服务器的上位机软件需支持多任务,否则不能成功。15、 用dhcp模式,插在电脑上能捕捉到discover,一插到路由器上就捕捉不到了,更别提offer了,是为什么?
首先,需要检查discover的内容,最简单的就是,你把电脑设置成固定IP,再设置成DHCP,抓一下电脑的内容,然后再对比一下16、 将w5500的RST引到电源上面 这样软件就不用配置RST了 可行吗?
这样是不可行的,复位必须有可靠操作,让芯片满足工作条件;RST那里只是保险,但绝大多数问题是其他原因造成的,如果没有反应,先看一下W5500回的信息,有没有正确的初始化,再去找其他问题的原因。
17、 W5500芯片有发热现象是为什么?
W5500芯片内部集成了PHY,将会处理大量以太网信息,所以功耗会较大,芯片温度会比较高。但是,WIZnet芯片满足工业级标准(-40°C~80°C)的要求,拥有广泛的工作温度范围。正常工作的温度远低于工作温度范围的上限,所以用户若正常操作无短接等现象,发现芯片发热属正常现象。更多相关内容 -
W5500问题
2021-08-18 23:19:02网口 W5500芯片 1 定义网络服务器的地址和端口 uint8 server_ip[4]={192,168,1,87}; uint16 server_port=5000; uint16 local_port=6000; uint16 len=0; 定义了服务器地址 server_ip,服务器端口 server_port,本地...网口 W5500芯片
1 定义网络服务器的地址和端口
uint8 server_ip[4]={192,168,1,87}; uint16 server_port=5000; uint16 local_port=6000; uint16 len=0;
定义了服务器地址 server_ip,服务器端口 server_port,本地端口 local_port,以及缓存字节长度 len
2 对DSP芯片相关功能的初始化
InitSpiaGpio();//初始化W5500的复位的GPIO gpio_config();//GPIO配置 DINT;//关中断 InitPieCtrl(); //初始化PIE IER = 0x0000; //清除中断 IFR = 0x0000; InitPieVectTable();//初始化中断向量
3 对W5500芯片相关功能的初始化
Reset_W5500();//复位W5500 set_default();//设置网络属性 set_network();//对W5500设置,ip那些,到这一步就能Ping通了
3.1 Reset_W5500();
其中 Reset_W5500(); 函数,主要对W5500芯片引脚RSTn进行操作
void Reset_W5500(void) { GpioDataRegs.GPBDAT.bit.GPIO52 = 0; delay_loop(); GpioDataRegs.GPBDAT.bit.GPIO52 = 1; delay_loop(); }
将其至低后拉高,完成W5500的复位。
3.2 set_default();
设置默认的W5500芯片的物理地址 MAC、IP地址 IP、网关 GW、子网掩码 SUB、服务器 DNS。
void set_default(void) // 设置默认MAC、IP、GW、SUB、DNS { uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x12}; uint8 lip[4]={192,168,1,150}; uint8 sub[4]={255,255,255,0}; uint8 gw[4]={192,168,1,1}; uint8 dns[4]={8,8,8,8}; memcpy(ConfigMsg.lip, lip, 4); //printf("lip: %d.%d.%d.%d\r\n",lip[0],lip[1],lip[2],lip[3]); memcpy(ConfigMsg.sub, sub, 4); // printf("sub: %d.%d.%d.%d\r\n",sub[0],sub[1],sub[2],sub[3]); memcpy(ConfigMsg.gw, gw, 4); //printf("gw: %d.%d.%d.%d\r\n",gw[0],gw[1],gw[2],gw[3]); memcpy(ConfigMsg.mac, mac,6); memcpy(ConfigMsg.dns,dns,4); //printf("dns: %d.%d.%d.%d\r\n",dns[0],dns[1],dns[2],dns[3]); ConfigMsg.dhcp=0; ConfigMsg.debug=1; ConfigMsg.fw_len=0; ConfigMsg.state=NORMAL_STATE; ConfigMsg.sw_ver[0]=FW_VER_HIGH; ConfigMsg.sw_ver[1]=FW_VER_LOW; }
3.3 set_network();
设置网络,将第二步中的默认设置,通过SPI的方式,将这些数据写入W5500设置。可以理解为,第二步是定义,第三步才是真正的设置。
void set_network(void) // 配置初始化IP信息并打印,初始化8个Socket { uint8 ip[4]; setSHAR(ConfigMsg.mac); //printf("mac:"); setSUBR(ConfigMsg.sub); setGAR(ConfigMsg.gw); setSIPR(ConfigMsg.lip); sysinit(txsize, rxsize); // 初始化8个socket setRTR(2000); // 设置超时时间 setRCR(3); // 设置最大重新发送次数 getSIPR (ip); printf("IP : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]); getSUBR(ip); printf("SN : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]); getGAR(ip); printf("GW : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]); }
此函数可配置每个socket通道的缓存大小,超时时间,已经最大重新发送次数。
4 状态寄存器Sn_SR 4个状态组成switch函数
此时,芯片W5500有了自己的IP地址,物理地址等。未进行任何操作的情况下,其状态寄存器 Sn_SR 应该为0x00
4.1 SOCK_CLOSED
最初经初始化后,W5500的状态应该是SOCK_CLOSED(0x00),进行第一步操作:
设置W5500的模式。包括TCP UDP等case SOCK_CLOSED://第一步,设置模式 socket(0,Sn_MR_TCP,local_port,Sn_MR_ND); break;
此代码含义为,对W5500芯片SOCKET 0 通道,设置为TCP模式。其中会使用到OPEN命令
4.2 SOCK_INIT 0x13
第一步中,设置为了TCP模式,并且使用了OPEN命令。故Sn_SR寄存器将变为SOCK_INIT 0x13。若使用LISTEN命令,则此芯片为服务器,若使用CONNECT,此芯片为客户端。
case SOCK_INIT://第二步,初始化,连接服务器 connect(0, server_ip,server_port); break;
从代码看出,芯片为TCP模式的客户端。并且使用connect命令,连接服务器。
4.3 SOCK_ESTABLISHED 0x17
当 CONNECT 命令配置成功时,Sn_SR变为 SOCK_ESTABLISHED。这个状态下,就代表可以进行send或者receive了。
4.3 SOCK_CLOSE_WAIT 0x1C
最后一个状态是关闭通道的状态,如文字描述。
case SOCK_CLOSE_WAIT: close_socket(0); break;
注意:正常工作时,W5500芯片一般都在SOCK_ESTABLISHED 状态
5 SOCK_ESTABLISHED 状态
5.1 第一步,判断 Sn_IR (Socket n 中断寄存器)
if(getSn_IR(0) & Sn_IR_CON) { setSn_IR(0, Sn_IR_CON); }
Sn_IR_CON=0x01的 也就是说,此时Sn_IR这个八位寄存器的第0位 CON=1。表明是建立了连接。setSn_IR(0, Sn_IR_CON); 这个又相当于初始化了Sn_IR,把他的中断标志初始化。
5.2 第二步,读取接收缓存的字节大小 Sn_RX_RSR
Sn_RX_RSR 显示了 Socket n 接收缓存中已接收和保存的数据大小。
len=getSn_RX_RSR(0);
读取len,如果有缓存,就是电脑服务器端发过来数据了,就会进行处理;如果没有,len=0,就会进行while1循环,继续进行switch判断。并且到这一步只会进行 SOCK_ESTABLISHED 状态。换句话说,就是只会一直判断len是否大于0,len大于0了,就会进行接下来的操作。如果没有大于0,就会一直判断len。
5.3 第三步,len>0 之后的操作
这部分就是真正的对fpga寄存器等的操作,这部分的程序包括对cmddata[]命令的解析,和数据的下发,以及对数据的上传。单开一张说明,保证逻辑性,先跳过这部分的具体操作。
其包括,接收命令,命令解析,设置编码模式,下发命令,设置解码模式,读取数据,上传数据。6 len>0后的操作
6.1 首先明确命令的组成
一条命令包括:0xaa+cmddata[0] cmddata[1] cmddata[2] cmddata[3] cmddata[4] cmddata[5] cmddata[6] + (cmddata[6])个数据
一般来说一条命令只有8个16位数据,分为两个字节发送,特殊的命令会加上(cmddata[6])个数据
0xaa:数据头
cmddata[0]:采集命令
cmddata[1]:延时时间
cmddata[2]:送数命令
cmddata[3] :M2通道上传个数
cmddata[4] :M5通道上传个数
cmddata[5] :M7通道上传个数
cmddata[6] :送数命令后跟的送数命令。也就是多个送数命令拿通信测试命令举例:
0x00 0xaa 0x99 0x1e 0x00 0x1e 0x99 0x4e 0x00 0x08 0x00 0x11 0x00 0x11 0x00 0x00 共16个字节,
其实是也就是8个参数:
0xaa:数据头 00aa
cmddata[0]:采集命令 991e
cmddata[1]:延时时间 001e
cmddata[2]:送数命令 994e
cmddata[3] :M2通道上传个数 0008
cmddata[4] :M5通道上传个数 0011
cmddata[5] :M7通道上传个数 0011
cmddata[6] :送数命令后跟的送数命令。也就是多个送数命令 00006.2 数据回环(最终时不需要send命令)
memset(buffer,0,sizeof(buffer)); memset(buffer16,0,sizeof(buffer16));//将两个数组清零 recv(0,buffer,len); send(0,buffer,len);//将W5500的数据写入数组buffer
将buffer数组和buffer16数组清零
接收recv命令,DSP芯片通过SPI接口,将W5500缓存的数据存到buffer数组。
注:send只是测试用,方便在网口观察现象。最终测试时,不能加send命令。
此时数据已经到了buffer数组,为8位的。6.3 命令解析
for(i=0,j=0;j<1024;i++,j++)//将buffer的八位的数据转换成buffer16数组的16位数据 { temp1=buffer[i]; temp1=(temp1<<8); temp1=temp1&0xff00; temp2=buffer[i+1]; temp2=temp2&0x00ff; buffer16[j]=temp1|temp2; i++; } if(buffer16[0]!=0x00aa) { break; } for(i=0,j=1;i<7;i++,j++)//命令第2到8个字,分别为cmddata[0]~cmddata[6],共7个字 { cmddata[i]=buffer16[j]; }
第一个for循环:将buffer数组的8位的数据,转存到buffer16里,变为16位的数据
if语句:如果命令的头不是0xaa。则说明是无效命令,直接break,然后程序将重新运行switch循环
第二个for循环:解析出cmddata命令,也就是cmddata[0]~cmddata[6] -
W5500问题集锦(二)
2018-03-30 11:05:52W5500自去年9月推出,已经有一年的时间。一年间,不乏很多客户纷纷将目光投向了W5500这颗性价比很高的全新...同时,也收到了很多客户在使用过程中的问题反馈,比如W5500中断问题、切换端口问题,及W5500做服务器,多...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中断寄存器的理解
http://www.9mcu.com/9mcubbs/foru … 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接收缓冲区的数据。 不知道这样的方案您能接收不。 当然同理客户端也是两个socket,只不过除了udp,多了一个TCPClient。
另,你可以初始化2个socket,例: Socket 0 是UDP, Socket 1~7是TCP Server(参数配置成一样的,意味着同时有7个客户端可以连入)。使用Socket 0发布命令,使用Socket 1~7接收数传。
问题描述2:再追加一个问题,您知道怎么做可以提高UDP广播的命令的可靠性!?
答2:首先udp就是面向不可靠连接,如果想做到可靠又想使用广播,那么你可以在udp的程序里自己加上一次握手。例如server发送udp(地址255.255.255.255)广播后,每个接收到广播的设备回复一个ack,server在得到ack后则认为数据送达。这里有个问题就是server知道各个客户端的ip地址,这样收到的ack才有指向性。 但是这样好麻烦啊。 还有就是你可以一段时间T内多次广播命令,降低丢包概率。
问题描述3:请问W5500+STM32103 多个socket同时发送数据时候出现丢包应该怎么处理啊
答3:这个主要看一下你SPI的读取速率,是不是太慢造成buff溢出导致的。你可以提高SPI速率,或者使用小包多发的形式,将大数据包拆分成小包来发送。
原帖来自:9MCU
10.
W5500工作一段时间灯全亮
问题描述1:W5500工作一段时间(大概几分钟),有时会出现双灯全亮的现象,此时,拔下网线,灯依旧亮。重启断电后上电,依然灯全亮。需要过很长时间才能恢复。
灯全亮阶段,网口显示断开状态。各DX有遇到过此类问题的吗?如有,是什么原因,该如何解决啊,谢谢!
答1:会不会是有个别的控制引脚悬空了?比较容易受到干扰。
比如reset之类的,状态进入随机,失去控制
问题描述2:ARM和W5500的控制线确实走线较远,这样是不是应该在RESET等信号端加上拉或下拉电阻啊?
答2:但就RESET而言,是应该加一个上拉,给芯片一个上电默认状态!
问题描述3:恩恩,非常感谢!!
原帖来自:9MCU
11.
求助:W5500连续接收数据出错。。。。。
问题描述:做的测试是W5500做TCP服务端 然后PC做客户端,PC间隔50ms给 W5500 发 几个字节如1234, W5500接收后,把接收的数据发到PC端 。经过大量测试,把问题锁定在 W5500接收数据,当接收一定量时,就会出现这种情况:如 PC发送的是1234,这时候它只能接收 1 后面几个字节都接收不到 (观察SPI寄存器),但是过一段时间又可以正常接收有时候还有出现,一个字节都不能接收,但都是过一会又正常,而且出现的频率比较规律。。。。。 各位有遇到过吗 求助。。。。。。
答1:有没有参考WIZnet 的TCP Server例程?建议你用Wireshark抓包看一下
答2:你这个是TCP Server Loopback。 W5500有这个例程,你可以参考一下(http://pan.baidu.com/s/1F7SzO)。感觉是你的函数地址定义问题。
原帖来自:9MCU
12.
发送NBNS响应包无效
问题描述1:W5500收到NBNS Quer包后发了NBNS的响应包(自己构造的)出去,抓包工具也能抓到,看内容也没有错误,但是询问端好像对响应包没反应,就和没有响应包一样,但实际上已经收到响应包了,不知问题出在哪里,另附上抓包文件(抓包工具为:Wireshark Version 1.12.1)谢谢大家。
答1:ARP的那部分,做个断点试试,是没收到,还是数据没对上?
问题描述2:管理员,您好,关于ARP的部分,W5500(192.168.1.5)收到 PC(192.168.1.8)的MAC而且能将其自身的MAC发给PC,这个是由W5500自身硬件完成的,这部分程序中未有涉及,程序中编写部分是接收137端口消息并做出响应,那个响应包是程序构造的,不知道是不是这部分出了问题,我对了很久也没对出哪里有问题。
答2:建议通过断点调试,在进入处理的位置开始就步步观察
问题描述3:关于断点调试我不太清楚要调试那个部分,从抓包文件上看不出程序执行本身有什么错误
问题描述4:我已找到问题,是TRANSACTION ID不匹配导致的,谢谢。
原帖来自:9MCU
13.
W5500 正常工作几天时间后,连不上,ping时候断断续续
问题描述:W5500有的 用几天后 连接不上 ping时候 断断续续的,大侠们怎么破。
答:建议将W5500的板子与电脑直连,配置到一个网段内,然后‘ping ip –t’不停的ping下。偶尔的ping不通可以理解,但是如果经常ping 不通就要检查你的物理链路状态了。有可能导致的问题:1.RJ-45部分网线没有插好或者口松;2. 布板的时候信号线平行走线产生寄生电容电感。
原帖来自:9MCU
14.
如何在W5500中实现HTTPS(http+ssl)客户端?
问题描述:
如何在W5500中实现HTTPS客户端?跟HTTP客户端实现的关键的区别?
HTTP/1.1 400 Bad Request
Server: nginx/1.2.0
Date: Thu, 24 Apr 2014 12:06:46 GMT
Content-Type: text/html
Content-Length: 270
Connection: close
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body bgcolor=”white”>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.2.0</center>
</body>
</html>
答:这个需要你熟悉应用层的SSL协议,然后调用传输层及网络层的W5500协议。这个可能后续有示例代码开放出来,但是在这之前只能各位朋友自己多摸索一下了。
原帖来自:9MCU
15.
W5500与FPGA连接
问题描述:有没有人会W5500与FPGA连接啊
答:有但是比较少,用FPGA一般总线资源足够而且线程够快,所以一般使用BUS接口。W5500是SPI接口。按照经验来看,发部分FPGA的用户会用W5300。因为Buff够大,实际带宽高。虽然,W5300比W5500要贵,但是用FPGA的用户追求的还是简单高效一般是不会在乎这几块钱的。
原帖来自:9MCU
16.
请问W5500支持DNS域名解析吗?我看了看datasheet,貌似没有这方面的描述
答:DNS是应用层协议,W5500实现的是应用层以下的传输层及网络层协议。不过,W5500有DNS的示例代码(http://pan.baidu.com/s/1F7SzO)。你可以参考。
17.
W5500断开无法重联
问题描述:CC2530单片机和W5500连接好可以正常通讯,断开网线或者关闭TCP工具,过一段时间再打开,TCP工具无法正常打开进行通讯,W5500的状态一直显示为连接状态,不能实现断开重联。添加心跳检测包,也没有任何作用,IINCHIP_WRITE(Sn_KPALVTR(s),0×02); 这个是添加的心跳包检测语句。还需要其他地方进行设置吗
答:1.IINCHIP_WRITE(Sn_KPALVTR(s),0×02)注意你KPALVTR寄存器的地址是否正确添加了。具体可以参考W5500 Keepalive的示例代码http://pan.baidu.com/s/1F7SzO
2.添加心跳包可以实现断线后,N个周期(基于RTR和RCT)后,若仍没有收到对方的ACK信号,则会触发超时中断,并同时将Socket状态变为Closed。程序里只要加上监听Socket状态变为Closed之后就重新开发Socket监听/连接即可实现断线重连。
原帖来自:9MCU
18.
W5500自动协商PMODE工作模式,AVR64跑TCP透传可以吧?
问题描述:打算用W5500做物联网比赛。所以过来问个问题咯。请知道的人指导下,歇歇咯。
N01:我将PMODE0 PMODE1 PMODE2接10k上拉电阻。根据手册配置成所有功能自动协商。是不是W5500就可以自动协商PMODE的所有工作模式了呢?歇歇咯。
NO2:我使用AVR64跑TCP透传应该可以吧??我通过百度资料看到arduino硬件使用的ATMEGA芯片有跑20M带W5500。W5100有用51跑简单的网络连接。我用AVR64 8M跑应该没问题的吧?
答:1.是的,PMODE全为1时为自动协商
2.可以的,没有问题。WIZnet的S2E透传模块都是8051+W5XXX或者W7100A(内置8051)
原帖来自:9MCU
19.
W5500如何设置连接到外网服务器,不知如何实现?
答:只要你的PC可以访问外网服务器,W5500就可以访问外网服务器。如果你的外网服务器是在一个内网里面的,没有透明出来,需要设置路由使用端口映射,将其透明出来,即可访问。
20.
W5500做server,通讯一段时间Client会断开
问题描述:我用w5500作为server,用Client去连接,在通讯一段时间后会出现Client突然断开,继续进行连接一直连接不上,调试server端程序的时候发现出现这个情况的时候,SR寄存器读出来的值是0×17,即还是处于SOCK_ESTABLISHED状态,现在出现这个情况的频率比较高,大概运行十多分钟就会出现,求教?
答:这个是由于Client断开没有经过四次握手,非法断开连接,导致Socket被占用,无法恢复通信。
可以让客户加入断线重连机制,有以下方式:
(1) 检查PHY状态寄存器的Link位,如果Link down 则重新初始化Socket;
主要针对网线插拔/断开;
(2) 如果TCP通讯中断,尝试重新发起连接2-3次,若不能重新连接,则重新初始化Socket;
主要针对运行在TCP Client。您这里是Server可以不予考虑;
(3) 设置Keep a live心跳包,若link断开会在RTR和RCR规定时间之后,触发超时中断;
TCP 模式下可以使用。Server 或者Client都可以通过这种方法检测。
21.
RTR值设定疑问
问题描述1:你好!请问下在W5500中要设置keep alive心跳包,通过配置RTR和RCR的值,触发超时中断。根据文档的计算方法,最短时间是否只能是RTR=32768 RCR=0的情况,这样算出来的时间是3.2s?能否把触发时间设置的非常短?大概在10ms左右,现在我keep alive心跳包是通过手动发送的,不是自动发送。发送的时间大概在1ms之内。
答1:关于您下面的问题,可能是您对我们的数据手册有些误解。触发超时中断的时间(ms) = RTR的值除以10,即,如果你把RTR的值设置为2000时,产生中断的时间是200ms。如果想把产生中断的时间设定为10ms,那么把RTR的值设定为100即可。但是,不建议这么操作,如果网络反应过慢,会频繁的重传。根据10/100M以太网特性,200ms是一个比较通用的发送超时时间。请您参考。
问题描述2:如果按照你这样说的,那RCR值设置代表的是什么意思? 超时时间不是通过这两个值来决定的吗?
答2:RCR(Retransmission Counter Register) 是重传次数,如果配置成3,表示发生超时中断时会重传一次,如果重传还不成功,又发生了超时中断,还会重传,但,总次数不超过3。
建议您先看看我们数据手册,上面说明比较详细。
阅读:W5500问题集锦(一)
>>如有任何问题可随时留言给我们,或发送至WIZnet官方邮箱:wiznetbj@wiznet.co.kr
关注WIZnet更多动态:
WIZnet官方微博:http://www.e.weibo.com/wiznet2012
</div> </div>
-
Linux内核中 SPI以太网W5500问题
2019-08-28 15:39:37Linux内核中 SPI以太网W5500问题 Linux内核驱动中将W5500 W5300和W5100集成到了一起,本人只用到了W5500。 问题描述 绿灯LinkLED和黄灯ACTLED交替闪烁,而正常状态应该为LinkLED常亮 ifconfig eth0 报错 经过...Linux内核中 SPI以太网W5500问题
Linux内核驱动中将W5500 W5200和W5100集成到了一起,本人只用到了W5500。
问题描述
绿灯LinkLED和黄灯ACTLED交替闪烁,而正常状态应该为LinkLED常亮
ifconfig eth0 报错
经过观察W5500网卡在整个板子复位时大多数情况是可以正常DHCP分配IP的,而adb reboot的时候大多数时候DHCP分配IP失败就会有上述错误状态,怀疑是复位有问题,分析代码果然函数名称为硬件复位(w5100_hw_reset)的函数在内部调用了软件复位函数
在w5100_hw_reset之前加上硬件复位代码,解决该问题。static int w5100_hw_reset(struct w5100_priv *priv) { u32 rtr; //此处增加硬件复位代码 //w5100_reset为软件复位 w5100_reset(priv); w5100_disable_intr(priv); w5100_write_macaddr(priv); switch (priv->ops->chip_id) { case W5100: w5100_memory_configure(priv); rtr = W5100_RTR; break; case W5200: w5200_memory_configure(priv); rtr = W5100_RTR; break; case W5500: w5500_memory_configure(priv); rtr = W5500_RTR; break; default: return -EINVAL; }
return 0;
}``
-
W5500 DHCP_stm32平台W5500DHCP_w5500_
2021-10-01 08:07:15W5500 DHCP stm32f103rct6程序 -
STM32F405_W5500_W5500UDP通信_w5500_STM32F4w5500_
2021-09-30 04:39:36实现基于STM32F405RGT6移植,UDP模式下通信正常,可用于应用开发 -
w5500驱动,w5500驱动程序分析,C,C++
2021-09-10 18:16:35W5500驱动 stm32f405VG,完整驱动程序 -
STM32_W5500_HTTP例程_STM32_W5500_HTTP例程_w5500
2021-09-11 03:00:40STM32F103 + w5500 网页例程 -
w5500驱动_w5500_W5500STM32
2021-09-10 18:16:35W5500驱动 stm32f405VG,完整驱动程序 -
W5500_EVB:W5500-EVB 库和示例
2021-06-15 17:59:17W5500 评估板 W5500 芯片开发平台,适用于网络化微控制器应用 以太网(W5500 硬连线 TCP/IP 芯片)和基于 32 位 ARM:registered: Cortex:trade_mark:-M0 的设计 Arduino Pin 兼容平台硬件 新代码示例: 更多详情,... -
W5500问题集锦(持续更新中)
2014-07-08 19:56:00在”WIZnet杯”以太网技术竞赛中,有非常多參赛者在使用中对W5500有各种各样的疑问,对于这款WIZnet新推出的以太网芯片,使用中大家是不是也一样存在下面问题呢?来看一看: 1. W5500不支持自己主动极性变换,... -
W5500 HAL库代码(使用官网最新的W5500驱动)
2021-02-20 12:24:35W5500 HAL库代码 -
w5500TCP server解决有时连接断开问题
2018-08-13 10:50:09w5500TCP server解决有时连接断开问题,可以保持客户端和服务器端一直通信