ENC28J60停止接收

时间:2017-05-26 17:33:16

标签: c embedded stm32 tcp-ip lwip

我目前正在使用stm32f405和ENC28J60并将lwip用作tcp / ip堆栈。一切都在启动时运行良好,但大约一分钟后,ENC停止接收数据包。传输保持正常工作。我已经尝试过轮询和使用中断。

我使用https://github.com/wolfgangr/enc28j60与ENC进行通信。这是处理传入数据包的代码:

while (true) {

eventmask_t mask = chEvtWaitAnyTimeout(ALL_EVENTS, LWIP_PACKET_POLL_INTERVAL);

if(mask & ENC_INTERRUPT_ID)
{
  /* Handle ENC28J60 interrupt */
  ENC_IRQHandler(&encHandle);
  /* Reenable interrupts */
  ENC_EnableInterrupts(EIE_INTIE);
}

if (mask & PERIODIC_LINK_TIMER_ID)
{
  bool current_link_status = ((encHandle.LinkStatus) & PHSTAT2_LSTAT) != 0;

  if (current_link_status != prev_link_status) {
    if (current_link_status) {
      dhcp_start(&thisif);
    }
    else {
      dhcp_stop(&thisif);
    }
  }
  prev_link_status = current_link_status;
}

/* Check if new frames where received */
struct pbuf *p;

while ((p = low_level_input(&thisif)) != NULL) {

  struct eth_hdr *ethhdr = p->payload;
  switch (htons(ethhdr->type)) {
  /* IP or ARP packet? */
  case ETHTYPE_IP:
  case ETHTYPE_ARP:

    /* full packet send to tcpip_thread to process */
    if (tcpip_input(p, &thisif) == ERR_OK)
      break;
    LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
  default:
    pbuf_free(p);
  }
}
}

函数low_level_input:

static struct pbuf *low_level_input(struct netif *netif) {
struct pbuf *p = NULL;
struct pbuf *q;
uint16_t len;
uint8_t *buffer;
uint32_t bufferoffset = 0;

if (!ENC_GetReceivedFrame(&encHandle)) {
  return NULL;
}

/* Obtain the size of the packet and put it into the "len" variable. */
len = encHandle.RxFrameInfos.length;
buffer = (uint8_t *)encHandle.RxFrameInfos.buffer;

if (len > 0)
{
  /* We allocate a pbuf chain of pbufs from the Lwip buffer pool */
  p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
}

if (p != NULL)
{
  bufferoffset = 0;

  for(q = p; q != NULL; q = q->next)
  {
    /* Copy data in pbuf */
    memcpy( (uint8_t*)((uint8_t*)q->payload), (uint8_t*)((uint8_t*)buffer + bufferoffset), q->len);
    bufferoffset = bufferoffset + q->len;
  }
}

return p;
}

一段时间后,函数ENC_GetReceivedFrame继续返回false,即使我确定已经收到了一些数据包。 我调试了函数(在enc28j60.c中找到)和这一行:

pktcnt = enc_rdbreg(handle, ENC_EPKTCNT);

pktcnt始终为0.我用逻辑分析仪查看了SPI总线,ENC确实是0。SPI总线工作正常。

在此之前发生了一些未标记为RXSTAT_OK的数据包(请参阅enc28j60.c中的第1259行)

我现在已经在这一天了,真的没有任何想法。

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题。 EPKTCNT寄存器无缘无故地减少了时间(无需设置ECON2_PKTDEC位)。 我注意到,发生这种情况是在将ECON2_AUTOINC位置1之后。 并非每次都设置ECON2_AUTOINC,而是每次都设置。

我只是在ENC28J60的初始化时设置了ECON2_AUTOINC,在读取过程中不再设置。 由于EPKTCNT停止无故下降。

希望它能提供帮助