问答

汇集网友智慧,解决技术难题

21ic问答首页 - AT32F407VGT6网络延迟问题

国产芯片 网络 AT32F407 产品 环境 pi

AT32F407VGT6网络延迟问题

scaler12242022-06-26
大佬,请教下,我在用AT32F407VGT6做IP广播产品,产品在自己的网络环境测试正常,局域网PING延迟都小于1毫秒。到一些客户的网络环境之后产品上电可能前一两小时PING延迟正常,后面就有上百毫秒延迟,一直解决不了这个问题
回答 +关注 6
928人浏览 2人回答问题 分享 举报
2 个回答
  • 客户用交换机一样?其他挂的设备也一样?
  • 系统采用FREERTOS8.2.3+LWIP2.0.2
    以太网PHY用RTL8201F
    初始化:
    #ifdef RTL8201F       
            RegValue = ETH_ReadPHYRegister(PHYAddress, 2);  //read ID 0x001C
            ETH_WritePHYRegister(PHYAddress,31, 7); //�л���page7
            ETH_WritePHYRegister(PHYAddress,16, 0x0ffB); //RMII  50M���ģʽ��CRS_DV
            ETH_WritePHYRegister(PHYAddress,19, 0xf014); //enable linkstatus intterupt
    #endif
    速度设置:
    #ifdef RTL8201F
            if ((RegValue & PHY_ANLPAR_100TXFD) || (RegValue & PHY_ANLPAR_10TXFD)){
                    ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
            }else{
                    ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
            }

            if (!((RegValue & PHY_ANLPAR_100TX) || (RegValue & PHY_ANLPAR_100TXFD)))        {
                    ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
            }else{
                    ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
            }
    #endif



    收数据信号量初始化:
        if (g_rx_semaphore == NULL){
            g_rx_semaphore = xSemaphoreCreateCounting(200,0);                                       
        }

    以太网收数据:
    void ethernetif_input( void * pvParameters )
    {
           
        struct pbuf *p;  
        for( ;; ){   
               if (xSemaphoreTake( g_rx_semaphore, LOWLEVEL_INPUT_WAITING_TIME)==pdTRUE)
                {       
                  p = low_level_input( low_netif );
                  if (ERR_OK != low_netif->input( p, low_netif))
                  {             
                    pbuf_free(p);
                    p=NULL;
                  }
                }
        }

    }
    EMAC中断:
    void ETH_IRQHandler(void)
    {       
        portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
        /* frame received */
        if(SET == ETH_GetDMAITStatus(ETH_DMA_INT_R)){
            /* give the semaphore to wakeup LwIP task */
            xSemaphoreGiveFromISR(g_rx_semaphore, &xHigherPriorityTaskWoken);
        }
        /* clear the enet DMA Rx interrupt pending bits */
        ETH_DMAClearITPendingBit(ETH_DMA_INT_R);
        ETH_DMAClearITPendingBit(ETH_DMA_INT_NIS);

        /* switch tasks if necessary */
        if(pdFALSE != xHigherPriorityTaskWoken){
            portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
        }
    }

您需要登录后才可以回复 登录 | 注册