一派护法 十九级 |
在ENC28J60_Init函数中设置了接收缓冲区的指针ERXST和ERXRDPT,用一个while语句等待MAC和PHY寄存器稳定后,配置好接收过滤器,最后再在ECON1中将ECON1_RXEN置为1允许接收。 然而如果PC端已有网卡IP地址对应MAC地址的ARP缓存,并且在单片机开机之前就向网卡发送了数据包,那么网卡就会在ERXWRPT更新之前接收到这些数据包。虽然ERXST=1500,但这些数据包却被写到了0地址处(该区域本来是发送缓冲区,根本就不是接收缓冲区),然后程序检测到数据包个数EPKTCNT大于0后,错误地在1500地址处去读数据,读到的数据包长度length和状态值status vector都是错误的,next_ptr指针当然也是错误的,最后ERDPT指针也跑飞了,程序再也读取不到正确的数据包。 Recv: EPKTCNT=1, RX=312, start=1500, len=45868, next=50776, status=43183(程序准备在1500处读取数据包,但由于ERXWRPT(RX)指针未能及时更新,仍为初始值0,所以要读取的数据包实际位置位于0地址处,读到的next_ptr,status和len都是错误的) Recv: EPKTCNT=1, RX=624, start=50776, len=52276, next=64236, status=21804(执行语句start=next后,指针跑飞) Recv: EPKTCNT=1, RX=694, start=64236, len=33187, next=26656, status=55662 Recv: EPKTCNT=1, RX=764, start=26656, len=28308, next=54987, status=35899 Recv: EPKTCNT=1, RX=834, start=54987, len=14822, next=28851, status=55525 Recv: EPKTCNT=1, RX=904, start=28851, len=18569, next=39195, status=38863 Recv: EPKTCNT=1, RX=974, start=39195, len=29763, next=1615, status=13568 Recv: EPKTCNT=1, RX=1044, start=1615, len=50083, next=33134, status=30117 Recv: EPKTCNT=1, RX=1114, start=33134, len=22009, next=14079, status=0 Recv: EPKTCNT=1, RX=1184, start=14079, len=41746, next=60892, status=26233 Recv: EPKTCNT=1, RX=1254, start=60892, len=49924, next=31244, status=51762 Recv: EPKTCNT=1, RX=1324, start=31244, len=5247, next=18352, status=43259 Recv: EPKTCNT=1, RX=1394, start=18352, len=36875, next=50465, status=48520 Recv: EPKTCNT=1, RX=1464, start=50465, len=65532, next=0, status=0(最后因为next碰巧=0了,所以读指针终于回到了0地址处,这才开始读取开机时收到的第一个数据包) Recv: EPKTCNT=1, RX=1534, start=0, len=301, next=312, status=192(读到了第一个数据包)
|