我目前正在使用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行)
我现在已经在这一天了,真的没有任何想法。
答案 0 :(得分:1)
我遇到了类似的问题。 EPKTCNT寄存器无缘无故地减少了时间(无需设置ECON2_PKTDEC位)。 我注意到,发生这种情况是在将ECON2_AUTOINC位置1之后。 并非每次都设置ECON2_AUTOINC,而是每次都设置。
我只是在ENC28J60的初始化时设置了ECON2_AUTOINC,在读取过程中不再设置。 由于EPKTCNT停止无故下降。
希望它能提供帮助