在使用eth不适用上层协议,例如tcp/udp这些的时候,初始化ETH_LibInit这个函数后就开始使用phy进行收发,发送使用ETH_TxPktChainMode,接收使用WCHNET_ETHIsr中断
void WCHNET_ETHIsr( void )
{
uint8_t eth_irq_flag, estat_regval;
eth_irq_flag = R8_ETH_EIR;
if(eth_irq_flag&RB_ETH_EIR_RXIF) //Receive complete
{
R8_ETH_EIR = RB_ETH_EIR_RXIF;
/* Check if the descriptor is owned by the ETHERNET DMA */
if( DMARxDescToGet->Status & ETH_DMARxDesc_OWN )
{
estat_regval = R8_ETH_ESTAT;
if(estat_regval & \
(RB_ETH_ESTAT_BUFER | RB_ETH_ESTAT_RXCRCER | RB_ETH_ESTAT_RXNIBBLE | RB_ETH_ESTAT_RXMORE))
{
return;
}
if( ((ETH_DMADESCTypeDef*)(DMARxDescToGet->Buffer2NextDescAddr))->Status& ETH_DMARxDesc_OWN )
{
DMARxDescToGet->Status &= ~ETH_DMARxDesc_OWN;
DMARxDescToGet->Status &= ~ETH_DMARxDesc_ES;
DMARxDescToGet->Status |= (ETH_DMARxDesc_FS|ETH_DMARxDesc_LS);
DMARxDescToGet->Status &= ~ETH_DMARxDesc_FL;
DMARxDescToGet->Status |= ((R16_ETH_ERXLN+4)<<ETH_DMARxDesc_FrameLengthShift);
/* Update the ETHERNET DMA global Rx descriptor with next Rx descriptor */
/* Selects the next DMA Rx descriptor list for next buffer to read */
DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr);
R16_ETH_ERXST = DMARxDescToGet->Buffer1Addr;
接收的长度为R16_ETH_ERXLN
接收的数据为DMARxDescToGet->Buffer1Addr
gEtherCatPara.receiveLen =R16_ETH_ERXLN;
memcpy((u8 *)gEtherCatPara.receiveBuffer, (u8 *)DMARxDescToGet->Buffer1Addr, gEtherCatPara.receiveLen);
这样获取接收的数据
通过网络抓包工具,发现发送出来的东西抓不到,也可能是未发出来,中断有提示发送成功。
在用其它设备的PHY进行接收,有数据但是数据与发送的不同。
请哪位大神分析下是什么原因。
更多回帖