|
发表于 2013-12-25 18:15:03
|
显示全部楼层
楼主,你好,我现在也是遇到ping不通问题,刚好看到这个,我在想我ping不通有没有可能也是这个问题,但我移植的原子库函数的程序和你的程序有点不一样,你能不能帮我看下是不是这个问题
//从网络获取一个数据包内容
//maxlen:数据包最大允许接收长度
//packet:数据包缓存区
//返回值:收到的数据包长度(字节)
u32 ENC28J60_Packet_Receive(u32 maxlen,u8* packet)
{
u32 rxstat;
u32 len;
if(ENC28J60_Read(EPKTCNT)==0)return 0; //是否收到数据包?
//设置接收缓冲器读指针
ENC28J60_Write(ERDPTL,(NextPacketPtr));
ENC28J60_Write(ERDPTH,(NextPacketPtr)>>8);
// 读下一个包的指针
NextPacketPtr=ENC28J60_Read_Op(ENC28J60_READ_BUF_MEM,0);
NextPacketPtr|=ENC28J60_Read_Op(ENC28J60_READ_BUF_MEM,0)<<8;
//读包的长度
len=ENC28J60_Read_Op(ENC28J60_READ_BUF_MEM,0);
len|=ENC28J60_Read_Op(ENC28J60_READ_BUF_MEM,0)<<8;
len-=4; //去掉CRC计数
//读取接收状态
rxstat=ENC28J60_Read_Op(ENC28J60_READ_BUF_MEM,0);
rxstat|=ENC28J60_Read_Op(ENC28J60_READ_BUF_MEM,0)<<8;
//限制接收长度
if (len>maxlen-1)len=maxlen-1;
//检查CRC和符号错误
// ERXFCON.CRCEN为默认设置,一般我们不需要检查.
if((rxstat&0x80)==0)len=0;//无效
else ENC28J60_Read_Buf(len,packet);//从接收缓冲器中复制数据包
//RX读指针移动到下一个接收到的数据包的开始位置
//并释放我们刚才读出过的内存
ENC28J60_Write(ERXRDPTL,(NextPacketPtr));
ENC28J60_Write(ERXRDPTH,(NextPacketPtr)>>8);
//递减数据包计数器标志我们已经得到了这个包
ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,ECON2,ECON2_PKTDEC);
return(len);
} |
|