分类: C/C++
2015-06-02 10:15:11
初始化CURR=0x4d,表示第一个收到的数据包将存放在0x4d00地址开始的缓冲区.
初始化CURR=0x4c,表示第一个收到的数据包将存放在0x4c00地址开始的缓冲区.
CURR只初始化一次,以后都不用再去修改它.
我的设置是CURR=0x4d.
网卡收到一个数据包,假如是一个短数据包,只要一页就可以存储的,那么这时候
CURR将会被加一.CURR将等于0x4d+1=0x4e.
假如需要两页来存储,那么CURR将等于0x4d+2=0x4f
如果CURR等于结束页PSTOP,也就是CURR>0x7f时,CURR将被重置成等于PSTART=0x4c.
CURR是网卡内部自己控制的.用户不需要干预.
网卡存储一定是按页存储,不满一页,也使用一页,下一包将用下一页开始存储.
举个例子;
CURR=0x4f
BNRY=0x4e
这时收到一个数据包
这是一个典型的ARP应答包,数据包发往52:54:ab:3d:8e:2c,发送者的网卡地址为
00:d0:09:68:f7:1e ,类型为0806
假设我的网卡地址是52:54:ab:3d:8e:2c,那么可以收到该包
这时
CURR=0x50
BNRY=0x4e
那么收到一包之后BNRY=CURR-2,而不是BNRY=CURR-1,也就是说两个指针差了两页,而不是一页.也就是说当CURR , BNRY 两个指针差2页或2页以上时,表示网卡收到新的数据包.(检查是否有新的数据包要用到这个关系,没有新的数据包时,两者指针只差一页).
,数据包只有60个字节的数据,那么网卡将用CURR指向的页0x4f来存储该包数据.
存储内容如下:
0x4f00:015040005254AB3D8E2C00D00968F71E
0x4f10:0806000108000604000200D00968F71E
0x4f20:C0A800015254AB3D8E2CC0A800070000
0x4f30:00000000000000000000000000000000
0x4f40:492E24C8
我们可以看到前面和后面都加了一些东西,中间的才是数据.
共加了8个字节的内容(共用了68个字节).
那么前面的4个字节的含义为:
前面的4个字节为:01504000
第一个字节0x01为接收的状态,也就是RSR(接收状态寄存器的值)
该字节Receive Status含义:
那么根据上面的标志位的定义,0x01=0000 0001B,也就是标志位PRX=1 ,表示这个数据包接收良好,没有错误.CRC=0,表示校验正确.PHY=0,表示这不是广播数据包.
第2个字节0x50 Next Packet Pointer,是一个指针,表示下一个数据包将存储在0x50页开始的地址0x5000.事实上等于此时的CURR=0x50.
第3和第4是接收的长度.表示该数据包的长度.这里是0x4000,要注意的是长度的高位和低位是颠倒的:
Receive Byte Count1=0x00
Receive Byte Count0=0x40
长度应该是0x0040=64字节.60字节是内容,4字节校验.
最后面的4个字节 492E24C8就是CRC校验码.