OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3723|回复: 0

STM32F107运行一段时间以后ping不通,驱动卡死在ETH_ERROR

[复制链接]

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2018-11-26
在线时间
21 小时
发表于 2020-2-11 14:19:00 | 显示全部楼层 |阅读模式
2金钱
我使用的是STM32F107+DP83848,在使用一段时间以后,网络出现ping不通的情况,在线调试以后发现能够接收到ARP请求包,但是无法发送出去,原因是发送的驱动程序卡在ETH_ERROR下,但是我的以太网驱动知识储备不足,不知道应该怎么处理。我自己看了原子的LWIP视频,大概知道描述
符的初始化是怎样的,但是具体到里面的每一个状态位就不懂了,请各位大佬伸出援手,小的感谢各位了。

这是我发送数据包的函数:
static err_t
low_level_output(struct netif *netif, struct pbuf *p)
{
  struct pbuf *q;
  int l = 0;
  u8 *buffer =  (u8 *)ETH_GetCurrentTxBuffer();

  for(q = p; q != NULL; q = q->next)
  {
    memcpy((u8_t*)&buffer[l], q->payload, q->len);
        l = l + q->len;
  }

  ETH_TxPkt_ChainMode(l);//程序就是卡死在这个函数里面

  return ERR_OK;
}


//ETH_TxPkt_ChainMode函数如下面所示
u32 ETH_TxPkt_ChainMode(u16 FrameLength)
{   
  /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
  if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (u32)RESET)
  {  
        /* Return ERROR: OWN bit set */
       return ETH_ERROR;//出现问题的时候,程序一致卡死在这里,其实也不是卡死,就是每次进来以后都进入这种状态
  }

  /* Setting the Frame Length: bits[12:0] */
  DMATxDescToSet->ControlBufferSize = (FrameLength & ETH_DMATxDesc_TBS1);

  /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */   
  DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS;

  /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
  DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;

  /* When Tx Buffer unavailable flag is set: clear it and resume transmission */
  if ((ETH->DMASR & ETH_DMASR_TBUS) != (u32)RESET)
  {
    /* Clear TBUS ETHERNET DMA flag */
    ETH->DMASR = ETH_DMASR_TBUS;
    /* Resume DMA transmission*/
    ETH->DMATPDR = 0;
  }

  /* Update the ETHERNET DMA global Tx descriptor with next Tx decriptor */  
  /* Chained Mode */
  /* Selects the next DMA Tx descriptor list for next buffer to send */
  DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMATxDescToSet->Buffer2NextDescAddr);   


  /* Return SUCCESS */
  return ETH_SUCCESS;   
}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 16:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表