ENC28J60比较复杂,W5500用了很久,这次做了一个转发服务模块,总是遇到各种现象。
1、W5500无论是TCP客户端还是服务端,通过自动或者手动KEEPALIVE来知道对方已经不在线,W5500的机制是双方必须都发送成功过数据,才会人为链路OK,才会发送心跳,否则抓包你是看不到的。这个其他地方都不一定说了。代码如下很简单,写寄存器
//keepalive 心跳 手动
void Send_KA(SOCKET s)
{
Write_W5500_SOCK_1Byte(s,Sn_KPALVTR,0);
Write_W5500_SOCK_1Byte(s,Sn_CR,SEND_KEEP);
}
//自动keeplive 1-7
void AUTO_KA(void)
{
U8 i=0;
for(i=1;i<8;i++)
{
Write_W5500_SOCK_1Byte(i,Sn_KPALVTR,1);//1*5S
}
}
2、接收网络数据函数,这个是普遍例程里面的
size=Read_SOCK_Data_Buffer(0, Rx_Buffer);
这个size可能是0,如果发送串口出去,恭喜,单片机就2了,使劲发送各种乱起八糟的东西,看门狗就重启了,然后就RST。
测试了很久,这个芯片还是不错的,前提是连上网之后,但是有时候初始化阶段就进不去下一步,就是在等待网线插入那个函数是死循环
while((Read_W5500_1Byte(PHYCFGR)&LINK)0)//等待以太网连接完成
{
if(debugflag1)
{
LED=0;
Uart_Send_Byte(‘S’);
Uart_Send_Byte(‘Y’);
Uart_Send_Byte(‘:’);
Uart_Send_Byte(‘W’);
Uart_Send_Byte(‘A’);
Uart_Send_Byte(‘I’);
Uart_Send_Byte(‘T’);
Uart_Send_Byte(0x0d);
Uart_Send_Byte(0x0a);
delay_ms(100);
LED=1;
delay_ms(100);
}
}
加了一个指示的,方便确定是这里