F407开发板ETH_Rx_Packet()函数让我困惑了

2019-07-21 03:56发布

先贴上原子407开发板  的 LAN8720.c 里的一个函数代码:(请注意加初涂红的部分)
//===========================================
//接收一个网卡数据包
//返回值:网络数据包帧结构体
FrameTypeDef ETH_Rx_Packet(void)

u32 framelength=0;
FrameTypeDef frame={0,0};   
//检查当前描述符,是否属于ETHERNET DMA(设置的时候)/CPU(复位的时候)
if((DMARxDescToGet->Status&ETH_DMARxDesc_OWN)!=(u32)RESET)
{
frame.length=ETH_ERROR; 
if ((ETH->DMASR&ETH_DMASR_RBUS)!=(u32)RESET)  

ETH->DMASR = ETH_DMASR_RBUS;//清除ETH DMA的RBUS位 
ETH->DMARPDR=0;//恢复DMA接收
}
return frame;//错误,OWN位被设置了
}  
if(((DMARxDescToGet->Status&ETH_DMARxDesc_ES)==(u32)RESET)&& 
((DMARxDescToGet->Status & ETH_DMARxDesc_LS)!=(u32)RESET)&&  
((DMARxDescToGet->Status & ETH_DMARxDesc_FS)!=(u32)RESET))  
{       
framelength=((DMARxDescToGet->Status&ETH_DMARxDesc_FL)>>ETH_DMARxDesc_FrameLengthShift)-4;//得到接收包帧长度(不包含4字节CRC)
  frame.buffer = DMARxDescToGet->Buffer1Addr;//得到包数据所在的位置
}else framelength=ETH_ERROR;//错误  
frame.length=framelength; 
frame.descriptor=DMARxDescToGet;  
//更新ETH DMA全局Rx描述符为下一个Rx描述符
//为下一次buffer读取设置下一个DMA Rx描述符
DMARxDescToGet=(ETH_DMADESCTypeDef*)(DMARxDescToGet->Buffer2NextDescAddr);   
return frame;  
}
//===========================================
让我困惑的是,得到帧长度为什么是Status 里取的,按照参考手册应该是从ControlBufferSize里取啊。

附上描述符结构体:
typedef struct  {
  __IO uint32_t   Status;                /*!< Status */
  uint32_t   ControlBufferSize;     /*!< Control and Buffer1, Buffer2 lengths */
  uint32_t   Buffer1Addr;           /*!< Buffer1 address pointer */
  uint32_t   Buffer2NextDescAddr;   /*!< Buffer2 or next descriptor address pointer */
/* Enhanced ETHERNET DMA PTP Descriptors */
#ifdef USE_ENHANCED_DMA_DESCRIPTORS
  uint32_t   ExtendedStatus;        /* Extended status for PTP receive descriptor */
  uint32_t   Reserved1;             /* Reserved */
  uint32_t   TimeStampLow;          /* Time Stamp Low value for transmit and receive */
  uint32_t   TimeStampHigh;         /* Time Stamp High value for transmit and receive */
#endif /* USE_ENHANCED_DMA_DESCRIPTORS */
} ETH_DMADESCTypeDef;
//====================================================
另外我查了ST官方的库函数,也是类似,请大侠们告诉我,为什么呀?
ST的:
/* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
      framelength = (((heth->RxDesc)->Status & ETH_DMARXDESC_FL) >> ETH_DMARXDESC_FRAMELENGTHSHIFT) - 4;

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。