【求助】W5300 UDP 接收不到数据

20000 2014-05-14 12:19:40
dsp控制W5300使用UDP与PC收发数据。W5300的UDP发送没问题,但无法接收PC传来的UDP报文。代码如下。
在CCS4.2里调试,正常连续运行时rxlen(接收缓冲区收到字符长度)始终为0;
如果在 "rxlen = 0x0fff & getSn_RX_RSR(s);"前加断点,rxlen是有接收值的,且接收字符个数也正确。
简单说就是:
dsp连续运行,getSn_SSR(s)返回0;
dsp单步运行,getSn_SSR(s)才有返回值。
这是什么原因,请大侠给分析一下。

socket(s, Sn_MR_UDP, port, mode);
switch((0x00ff & getSn_SSR(s)))
{
case SOCK_UDP:
rxlen = 0x0fff & getSn_RX_RSR(s);
if(rxlen > 0)
{
rxlen = recvfrom(s, (uint8*)rxbuf, rxlen, gw, &rxport);
}
if(len !=sendto(s,p,len,gw,port)) // send the data to the destination
{ }
break;
...........
}
...全文
1492 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangxia0215 2016-08-06
  • 打赏
  • 举报
回复
请问有没有W5300可以在Ad软件已经封装好的芯片,如果有可以给我发一个吗,谢谢了
技术老腊肉 2015-05-18
  • 打赏
  • 举报
回复
引用 8 楼 tyro88cn 的回复:
怎么这么巧,我也遇到类似的问题了,请教楼上咋解决的,下面是我的代码 淘宝上买了块开发板,28335控制w5300的,店家给的例子就两个,连个数据通讯的都没有,自己摸索搞了好长时间了也还没有搞定,我的cpu用的是150M,XINTF都是最大的配置,也就是操作w5300的时钟是150/2/10=7.5M,看了w5300的操作时序,这个是可以的。我把下面这个函数放到while(1)中去运行,断点达到case6:此时可以ping通,然后继续全速跑,用上位机调试助手去连接5300上建立的这个服务器,只要一连上位机就能看到,网络断线了。然后我又把这个函数放到一个10ms的定时器里去运行,发现网络要尝试很多遍才可以连接上,就是上位机的网络连接图标不是红叉,然后我又用助手去连接,这时可以连上,我用助手发送一组数据,5300收到了,同时也往回传了,但就是网络突然断掉了,5300经过一番尝试又到了等待连接状态,我再次用助手连接,是可以连上的,重复上述过程,助手一样收到数据,网络再次掉了。 大家帮忙分析一下啊。 void w5300Task(void) { static Uint16 w5300Ticks = 0; static Uint32 len,i; static int ssr_status, ir_status; unsigned int *ptr; switch(w5300Ticks) { case 0://复位 W5300_RST_ON; DELAY_US(2000); W5300_RST_OFF; DELAY_US(2000); w5300Ticks=1; break; case 1://初始化 setMR(getMR() | MR_RDH | MR_WDF(2)); setSHAR(&mac[0]); setGAR(&gw[0]); setSUBR(&sn[0]); setSIPR(&ip[0]); w5300Ticks=2; case 2://设置工作模式,端口,分配空间 setSn_MR(0,Sn_MR_TCP); *(uint16 *)Sn_PORTR(0)=5000; sysinit(tx_mem_conf,rx_mem_conf); w5300Ticks=3; break; case 3://读SOCKET状态 ssr_status=getSn_SSR(0); if((ssr_status & 0xFF)==SOCK_CLOSED) w5300Ticks=6; else w5300Ticks=4; break; case 4://关闭SOCKET setSn_CR(0,Sn_CR_CLOSE); w5300Ticks=1; break; case 5://断开连接 setSn_CR(0,Sn_CR_DISCON); w5300Ticks=1; break; case 6://打开SOCKET setSn_CR(0,Sn_CR_OPEN); w5300Ticks=7; break; case 7://读SOCKET状态 //ssr_status=getSn_SSR(0); ssr_status=IINCHIP_READ(Sn_SSR(0)); if((ssr_status & 0xFF)==SOCK_INIT) w5300Ticks=8; else w5300Ticks=4; break; case 8://设置SOCKET侦听 setSn_CR(0,Sn_CR_LISTEN); DELAY_US(1000); w5300Ticks=9; break; case 9://读SOCKET状态 ssr_status=IINCHIP_READ(Sn_SSR(0)); if((ssr_status & 0xFF)==SOCK_LISTEN) w5300Ticks=10; else if( (ssr_status & 0xFF)==0) w5300Ticks=0; else w5300Ticks=4; break; case 10://读SOCKET状态--等待连接 ssr_status=IINCHIP_READ(Sn_SSR(0)); ssr_status=ssr_status & 0xFF; if(ssr_status==SOCK_CLOSED) w5300Ticks=4; else if(ssr_status==SOCK_CLOSE_WAIT) w5300Ticks=5; else if(ssr_status==SOCK_ESTABLISHED) w5300Ticks=11; else w5300Ticks=10; break; case 11://读SOCKET状态--已建立连接 ssr_status=getSn_SSR(0); if((ssr_status & 0xFF)==SOCK_CLOSED) w5300Ticks=4; else if((ssr_status & 0xFF)==SOCK_CLOSE_WAIT) w5300Ticks=5; else w5300Ticks=12; break; case 12://读中断 ir_status=getSn_IR(0) & 0x00FF; if( (ir_status & 0x04)==0x04) { w5300Ticks=13; } else { w5300Ticks=11; } break; case 13://清中断 setSn_IR(0, Sn_IR_RECV); w5300Ticks=14; break; case 14://读数据 len=getSn_RX_RSR(0); if(len>0) { for(i=0;i<len;i++) { buf[i] = IINCHIP_READ(Sn_RX_FIFOR(0)); } setSn_CR(0,Sn_CR_RECV); } w5300Ticks=15; break; case 15: w5300Ticks=16; break; case 16://写数据 for(i=0;i<4;i++) { IINCHIP_WRITE(Sn_TX_FIFOR(0),buf[i]); } setSn_IR(0, Sn_IR_SENDOK); setSn_TX_WRSR(0,len); setSn_CR(0,Sn_CR_SEND); w5300Ticks=17; break; case 17: w5300Ticks=12; break; default: break; } }
又遇到你了,你的问题解决没有呢
waner4045 2014-12-09
  • 打赏
  • 举报
回复
请问你们上位机都是用网口调试助手接收的数据么?有没有哪位大神有VC控制台程序能接收数据的?
青衣门 2014-10-11
  • 打赏
  • 举报
回复
楼主有W5300的官方例子吗,能否给发一份,907399193@qq.com,我的用28335,老是写不了寄存器
xuewanguichuanzhen 2014-06-18
  • 打赏
  • 举报
回复
楼主,我现在也在做dsp28335和W5300之间的网络通信,但是我的寄存器为什么老是赋不进去值呢?观测寄存器的值也是有的,但是不是一一对应的,更别说插到电脑上有本地连接了!希望能跟你交流下,我的QQ号1548905780
tyro88cn 2014-05-31
  • 打赏
  • 举报
回复
怎么这么巧,我也遇到类似的问题了,请教楼上咋解决的,下面是我的代码 淘宝上买了块开发板,28335控制w5300的,店家给的例子就两个,连个数据通讯的都没有,自己摸索搞了好长时间了也还没有搞定,我的cpu用的是150M,XINTF都是最大的配置,也就是操作w5300的时钟是150/2/10=7.5M,看了w5300的操作时序,这个是可以的。我把下面这个函数放到while(1)中去运行,断点达到case6:此时可以ping通,然后继续全速跑,用上位机调试助手去连接5300上建立的这个服务器,只要一连上位机就能看到,网络断线了。然后我又把这个函数放到一个10ms的定时器里去运行,发现网络要尝试很多遍才可以连接上,就是上位机的网络连接图标不是红叉,然后我又用助手去连接,这时可以连上,我用助手发送一组数据,5300收到了,同时也往回传了,但就是网络突然断掉了,5300经过一番尝试又到了等待连接状态,我再次用助手连接,是可以连上的,重复上述过程,助手一样收到数据,网络再次掉了。 大家帮忙分析一下啊。 void w5300Task(void) { static Uint16 w5300Ticks = 0; static Uint32 len,i; static int ssr_status, ir_status; unsigned int *ptr; switch(w5300Ticks) { case 0://复位 W5300_RST_ON; DELAY_US(2000); W5300_RST_OFF; DELAY_US(2000); w5300Ticks=1; break; case 1://初始化 setMR(getMR() | MR_RDH | MR_WDF(2)); setSHAR(&mac[0]); setGAR(&gw[0]); setSUBR(&sn[0]); setSIPR(&ip[0]); w5300Ticks=2; case 2://设置工作模式,端口,分配空间 setSn_MR(0,Sn_MR_TCP); *(uint16 *)Sn_PORTR(0)=5000; sysinit(tx_mem_conf,rx_mem_conf); w5300Ticks=3; break; case 3://读SOCKET状态 ssr_status=getSn_SSR(0); if((ssr_status & 0xFF)==SOCK_CLOSED) w5300Ticks=6; else w5300Ticks=4; break; case 4://关闭SOCKET setSn_CR(0,Sn_CR_CLOSE); w5300Ticks=1; break; case 5://断开连接 setSn_CR(0,Sn_CR_DISCON); w5300Ticks=1; break; case 6://打开SOCKET setSn_CR(0,Sn_CR_OPEN); w5300Ticks=7; break; case 7://读SOCKET状态 //ssr_status=getSn_SSR(0); ssr_status=IINCHIP_READ(Sn_SSR(0)); if((ssr_status & 0xFF)==SOCK_INIT) w5300Ticks=8; else w5300Ticks=4; break; case 8://设置SOCKET侦听 setSn_CR(0,Sn_CR_LISTEN); DELAY_US(1000); w5300Ticks=9; break; case 9://读SOCKET状态 ssr_status=IINCHIP_READ(Sn_SSR(0)); if((ssr_status & 0xFF)==SOCK_LISTEN) w5300Ticks=10; else if( (ssr_status & 0xFF)==0) w5300Ticks=0; else w5300Ticks=4; break; case 10://读SOCKET状态--等待连接 ssr_status=IINCHIP_READ(Sn_SSR(0)); ssr_status=ssr_status & 0xFF; if(ssr_status==SOCK_CLOSED) w5300Ticks=4; else if(ssr_status==SOCK_CLOSE_WAIT) w5300Ticks=5; else if(ssr_status==SOCK_ESTABLISHED) w5300Ticks=11; else w5300Ticks=10; break; case 11://读SOCKET状态--已建立连接 ssr_status=getSn_SSR(0); if((ssr_status & 0xFF)==SOCK_CLOSED) w5300Ticks=4; else if((ssr_status & 0xFF)==SOCK_CLOSE_WAIT) w5300Ticks=5; else w5300Ticks=12; break; case 12://读中断 ir_status=getSn_IR(0) & 0x00FF; if( (ir_status & 0x04)==0x04) { w5300Ticks=13; } else { w5300Ticks=11; } break; case 13://清中断 setSn_IR(0, Sn_IR_RECV); w5300Ticks=14; break; case 14://读数据 len=getSn_RX_RSR(0); if(len>0) { for(i=0;i<len;i++) { buf[i] = IINCHIP_READ(Sn_RX_FIFOR(0)); } setSn_CR(0,Sn_CR_RECV); } w5300Ticks=15; break; case 15: w5300Ticks=16; break; case 16://写数据 for(i=0;i<4;i++) { IINCHIP_WRITE(Sn_TX_FIFOR(0),buf[i]); } setSn_IR(0, Sn_IR_SENDOK); setSn_TX_WRSR(0,len); setSn_CR(0,Sn_CR_SEND); w5300Ticks=17; break; case 17: w5300Ticks=12; break; default: break; } }
20000 2014-05-16
  • 打赏
  • 举报
回复
rxlen = 0x0fff & getSn_RX_RSR(s); 连续执行是这里返回0 查询方式读寄存器经常死机,会是字长的原因么? 改用中断方式,效果好些。 感谢各位讨论!
mangoalx 2014-05-15
  • 打赏
  • 举报
回复
引用 5 楼 20000 的回复:
rxlen = 0x0fff & getSn_RX_RSR(s); 这句加断点,停住 ---->点击PC程序的发送按钮---->dsp在断点处继续执行;这种运行方式rxlen有返回值,且这个值正好等于pc发送字节数 + UDP报头长度。(但取出的内容不对,可能是对齐或大小端问题) 不加断点,dsp程序正常的连续执行时,pc发送,rxlen返回总是0; 芯片速度慢的话不应该慢到这种程度噢?!而且PC发送是随机的,dsp轮询方式加延时,效率太低。 在试中断方式,好像进不了中断,苦闷~~
你现在是查问题,怎么解决之后再考虑。 连续执行时Rxlen在后面重新赋值了啊,先分清是哪个调用返回0
20000 2014-05-15
  • 打赏
  • 举报
回复
rxlen = 0x0fff & getSn_RX_RSR(s); 这句加断点,停住 ---->点击PC程序的发送按钮---->dsp在断点处继续执行;这种运行方式rxlen有返回值,且这个值正好等于pc发送字节数 + UDP报头长度。(但取出的内容不对,可能是对齐或大小端问题) 不加断点,dsp程序正常的连续执行时,pc发送,rxlen返回总是0; 芯片速度慢的话不应该慢到这种程度噢?!而且PC发送是随机的,dsp轮询方式加延时,效率太低。 在试中断方式,好像进不了中断,苦闷~~
mangoalx 2014-05-14
  • 打赏
  • 举报
回复
是说加个断点停一下,然后继续执行就对了?那你可以在这里加个延时,是不是芯片反应速度慢
20000 2014-05-14
  • 打赏
  • 举报
回复
回楼上的, getSn_SSR()是轮询方式, 1秒钟调用一次。 看w5300的手册中UDP接收不推荐中断方式,且官方的例子是轮询的,所以用的轮询。 udp接收是查询 getSn_RX_RSR(7)这个函数。返回值表示收到数据字节数 奇怪的地方是:这个函数设置断点才有返回值。不设断点,返回值一直是0。
曹大夯 2014-05-14
  • 打赏
  • 举报
回复
你的getSn_SSR()函数以什么样的频率被调用阿? 接收方式是轮询还是中断?
20000 2014-05-14
  • 打赏
  • 举报
回复
没有防火墙, PC ping W5300是通的

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧