【故障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处于关闭状态,就会发生死锁。