以太网通讯

2019-08-04 14:52发布

买了块开发板,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;
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。