作者共發了3篇帖子。
【bug】ENC28J60网卡中的ERXWRPT接收写指针未能及时更新的bug
1樓 巨大八爪鱼 2017-4-26 13:06
在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(读到了第一个数据包)
2樓 巨大八爪鱼 2017-4-26 13:56
最好的解决办法是:把接收区的开始地址设为0。这样不管ERXWRPT有没有自动更新, 都不会出错。
例如,接收区的范围为0~6654,发送区的范围为6655~8191。
3樓 巨大八爪鱼 2017-4-26 14:06
注:status是指status vector的高16位,len为status vector的低16位。

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
 
 
©2010-2024 Arslanbar [手機版] [桌面版]
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。