【故障2】
ping 192.168.1.50
不通,數碼管一直為1, 70
這些故障應該都是INT2上的低電平干擾造成的。為了增強抗干擾能力,可以在主循環中每5秒就自動檢查一次pkt_cnt=0時中斷EIE是否處於關閉狀態(也就是判斷是否產生了死鎖),若判斷出產生了死鎖,則應及時打開EIE使系統恢復正常。
同時也要檢查連接狀態改變中斷是否是開啟的狀態,並定時自動更新連接狀態,而不是完全依靠中斷來通知。
if (pkt_in){ asm("wdr"); GICR &= ~_BV(INT2); // 進入臨界區之前必須關網卡中斷! read_packet(); ENC28J60_SelectBank(1); if (!ENC28J60_Read(EPKTCNT)) // 若已接收完全部數據包 { pkt_in = 0; ENC28J60_SetBits(EIE, EIE_PKTIE, ENCSET); // 則重開數據包接收中斷 } GICR |= _BV(INT2); // 重開網卡中斷}
在上面的代碼中,當pkt_in等於0時若中斷PKTIE處於關閉狀態,就會發生死鎖。