搜索
bottom↓
回复: 6

如何设置STM32F4以太网最小帧长度

[复制链接]

出0入0汤圆

发表于 2019-10-20 16:38:52 | 显示全部楼层 |阅读模式
足 IEEE 802.3 中规定最小帧长度为46或者64字节,ST提供的驱动默认情况下不足64字节的会补0x00,填满64字节再发送出去,现在发现一些路由器对于64字节的ARP广播包不应答,该如何设置不自动补0呢?

电脑的IP为192.168.1.3,路由器的IP为192.168.1.1,电脑发送42字节长度(wiresharp不显示4字节CRC)的ARP广播包很快得到路由器的回复。


设备的地址为192.168.1.100,发送60字节的ARP广播包,路由器无应答


STM32F4提供的驱动当中自动填满64字节数据


数据手册中有关disable PAD的描述


按照手册的描述,修改HAL提供的驱动,HAL_StatusTypeDef HAL_ETH_TransmitFrame(ETH_HandleTypeDef *heth, uint32_t FrameLength) 函数中的一句
heth->TxDesc->Status |=ETH_DMATXDESC_FS|ETH_DMATXDESC_LS|ETH_DMATXDESC_DP;//有修改,帧小于64byte时,自带补齐64B数据,原来为:heth->TxDesc->Status |=ETH_DMATXDESC_FS|ETH_DMATXDESC_LS;
也就是发送时将DP为置1,这样修改过后,wiresharp完全侦听不到设备发出数据了,怀疑是disable PAD置位后,补位项和CRC一起去掉了,导致侦听不到数据








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2019-10-20 16:40:50 | 显示全部楼层
修改驱动中的发送函数:


/**
  * @brief  Sends an Ethernet frame.
  * @param  heth pointer to a ETH_HandleTypeDef structure that contains
  *         the configuration information for ETHERNET module
  * @param  FrameLength Amount of data to be sent
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_ETH_TransmitFrame(ETH_HandleTypeDef *heth, uint32_t FrameLength)
{
  uint32_t bufcount = 0U, size = 0U, i = 0U;
  
  /* Process Locked */
  __HAL_LOCK(heth);
  
  /* Set the ETH peripheral state to BUSY */
  heth->State = HAL_ETH_STATE_BUSY;
  
  if (FrameLength == 0U)
  {
    /* Set ETH HAL state to READY */
    heth->State = HAL_ETH_STATE_READY;
   
    /* Process Unlocked */
    __HAL_UNLOCK(heth);
   
    return  HAL_ERROR;                                    
  }  
  
  /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
  if(((heth->TxDesc)->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET)
  {  
    /* OWN bit set */
    heth->State = HAL_ETH_STATE_BUSY_TX;
   
    /* Process Unlocked */
    __HAL_UNLOCK(heth);
   
    return HAL_ERROR;
  }
  
  /* Get the number of needed Tx buffers for the current frame */
  if (FrameLength > ETH_TX_BUF_SIZE)
  {
    bufcount = FrameLength/ETH_TX_BUF_SIZE;
    if (FrameLength % ETH_TX_BUF_SIZE)
    {
      bufcount++;
    }
  }
  else
  {  
    bufcount = 1U;
  }
  if (bufcount == 1U)
  {
    /* Set LAST and FIRST segment */
    heth->TxDesc->Status |=ETH_DMATXDESC_FS|ETH_DMATXDESC_LS|ETH_DMATXDESC_DP;//有修改,帧小于64byte时,自带补齐64B数据,原来为:heth->TxDesc->Status |=ETH_DMATXDESC_FS|ETH_DMATXDESC_LS;
    /* Set frame size */
    heth->TxDesc->ControlBufferSize = (FrameLength & ETH_DMATXDESC_TBS1);
    /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
    heth->TxDesc->Status |= ETH_DMATXDESC_OWN;
    /* Point to next descriptor */
    heth->TxDesc= (ETH_DMADescTypeDef *)(heth->TxDesc->Buffer2NextDescAddr);
  }
  else
  {
    for (i=0U; i< bufcount; i++)
    {
      /* Clear FIRST and LAST segment bits */
      heth->TxDesc->Status &= ~(ETH_DMATXDESC_FS | ETH_DMATXDESC_LS);
      
      if (i == 0U)
      {
        /* Setting the first segment bit */
        heth->TxDesc->Status |= ETH_DMATXDESC_FS;  
      }
      
      /* Program size */
      heth->TxDesc->ControlBufferSize = (ETH_TX_BUF_SIZE & ETH_DMATXDESC_TBS1);
      
      if (i == (bufcount-1U))
      {
        /* Setting the last segment bit */
        heth->TxDesc->Status |= ETH_DMATXDESC_LS;
        size = FrameLength - (bufcount-1U)*ETH_TX_BUF_SIZE;
        heth->TxDesc->ControlBufferSize = (size & ETH_DMATXDESC_TBS1);
      }
      
      /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
      heth->TxDesc->Status |= ETH_DMATXDESC_OWN;
      /* point to next descriptor */
      heth->TxDesc = (ETH_DMADescTypeDef *)(heth->TxDesc->Buffer2NextDescAddr);
    }
  }
  
  /* When Tx Buffer unavailable flag is set: clear it and resume transmission */
  if (((heth->Instance)->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET)
  {
    /* Clear TBUS ETHERNET DMA flag */
    (heth->Instance)->DMASR = ETH_DMASR_TBUS;
    /* Resume DMA transmission*/
    (heth->Instance)->DMATPDR = 0U;
  }
  
  /* Set ETH HAL State to Ready */
  heth->State = HAL_ETH_STATE_READY;
  
  /* Process Unlocked */
  __HAL_UNLOCK(heth);
  
  /* Return function status */
  return HAL_OK;
}

出0入0汤圆

 楼主| 发表于 2019-10-21 15:41:32 | 显示全部楼层
自己顶下

出0入0汤圆

 楼主| 发表于 2019-10-21 16:03:05 | 显示全部楼层
有没人帮忙用wiresharp侦听下,LWIP入网时,发送的arp广播包长度是多少?

出0入0汤圆

发表于 2019-10-21 18:32:41 来自手机 | 显示全部楼层
MAC有帧自动填充功能吧,看下开启了没有。

出0入0汤圆

 楼主| 发表于 2019-10-22 10:18:06 | 显示全部楼层
lingdianhao 发表于 2019-10-21 18:32
MAC有帧自动填充功能吧,看下开启了没有。

就是默认情况下时开了,自动填充功能,我现在想把它去掉,在DMA发送描述符中把自动填充关了,却发现没wiresharp中侦听不到数据,估计是CRC没加上去,,,,

出0入0汤圆

 楼主| 发表于 2019-10-23 12:08:16 | 显示全部楼层
结贴,原来是mac设置成了组播地址,开启自动帧填充,最小长度为64BYTE的报文,路由器也会解析!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 06:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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