在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(讀到了第一個數據包)