打印
[技术问答]

M487以太网正常工作一段时间,就没网了,求助大家!!!!!!!!

[复制链接]
679|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fst20220608|  楼主 | 2022-6-8 18:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用的是M487开发板,把官网给的EMAC_TxRx例程烧录,然后接入网线到以太网接口,以太网旁边的灯是亮的,但过了一段时间以太网的灯灭了,ping IP也不成功,我连代码都没修改,刚开始也能获取到IP,这不懂是啥原因了,是代码问题还是以太网的接口有问题
void EMAC_TX_IRQHandler(void)
{
    // Clean up Tx resource occupied by previous sent packet(s)
    EMAC_SendPktDone();
}

/**
  * @brief  EMAC Rx interrupt handler.
  * @param  None
  * @return None
  */
void EMAC_RX_IRQHandler(void)
{
    int i=0;
    while(1)
    {
        printf("u32PktLen =%d\r\n",u32PktLen);
        // Check if there's any packets available
        if(EMAC_RecvPkt(auPkt, &u32PktLen) == 0)
            break;
        // Process receive packet
        process_rx_packet(auPkt, u32PktLen);
        for(i=0;i<u32PktLen;i++)
        {
            if(auPkt==192)
            {
                printf("IP address: %d.%d.%d.%d\n", auPkt, auPkt[i+1],auPkt[i+2], auPkt[i+3]);
            }
        }
        // Clean up Rx resource occupied by previous received packet
        EMAC_RecvPktDone();
    }
}

void SYS_Init(void)
{

    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Set XT1_OUT(PF.2) and XT1_IN(PF.3) to input mode */
    PF->MODE &= ~(GPIO_MODE_MODE2_Msk | GPIO_MODE_MODE3_Msk);

    /* Enable External XTAL (4~24 MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

    /* Waiting for 12MHz clock ready */
    CLK_WaitClockReady( CLK_STATUS_HXTSTB_Msk);

    /* Switch HCLK clock source to HXT */
    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HXT,CLK_CLKDIV0_HCLK(1));

    /* Set core clock as PLL_CLOCK from PLL */
    CLK_SetCoreClock(FREQ_192MHZ);

    /* Set both PCLK0 and PCLK1 as HCLK/2 */
    CLK->PCLKDIV = CLK_PCLKDIV_APB0DIV_DIV2 | CLK_PCLKDIV_APB1DIV_DIV2;

    /* Enable IP clock */
    CLK_EnableModuleClock(UART0_MODULE);
    CLK_EnableModuleClock(EMAC_MODULE);

    /* Select IP clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HXT, CLK_CLKDIV0_UART0(1));

    // Configure MDC clock rate to HCLK / (127 + 1) = 1.5 MHz if system is running at 192 MHz
    CLK_SetModuleClock(EMAC_MODULE, 0, CLK_CLKDIV3_EMAC(127));

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
    SystemCoreClockUpdate();

    /* Set GPB multi-function pins for UART0 RXD and TXD */
    SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk);
    SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);
    // Configure RMII pins
    SYS->GPA_MFPL |= SYS_GPA_MFPL_PA6MFP_EMAC_RMII_RXERR | SYS_GPA_MFPL_PA7MFP_EMAC_RMII_CRSDV;
    SYS->GPC_MFPL |= SYS_GPC_MFPL_PC6MFP_EMAC_RMII_RXD1 | SYS_GPC_MFPL_PC7MFP_EMAC_RMII_RXD0;
    SYS->GPC_MFPH |= SYS_GPC_MFPH_PC8MFP_EMAC_RMII_REFCLK;
    SYS->GPE_MFPH |= SYS_GPE_MFPH_PE8MFP_EMAC_RMII_MDC |
                     SYS_GPE_MFPH_PE9MFP_EMAC_RMII_MDIO |
                     SYS_GPE_MFPH_PE10MFP_EMAC_RMII_TXD0 |
                     SYS_GPE_MFPH_PE11MFP_EMAC_RMII_TXD1 |
                     SYS_GPE_MFPH_PE12MFP_EMAC_RMII_TXEN;

    // Enable high slew rate on all RMII TX output pins
    PE->SLEWCTL = (GPIO_SLEWCTL_HIGH << GPIO_SLEWCTL_HSREN10_Pos) |
                  (GPIO_SLEWCTL_HIGH << GPIO_SLEWCTL_HSREN11_Pos) |
                  (GPIO_SLEWCTL_HIGH << GPIO_SLEWCTL_HSREN12_Pos);

    /* Lock protected registers */
    SYS_LockReg();

}


// This sample application can response to ICMP ECHO packets (ping)
// IP address is configure with DHCP, but if a lease cannot be acquired, a static IP will be used.
int main(void)
{

    SYS_Init();
    UART_Open(UART0, 115200);
    Led_init();
    key_init();
    TIM_init();

    // Select RMII interface by default
    EMAC_Open(g_au8MacAddr);

    // Init phy
    EMAC_PhyInit();

    NVIC_EnableIRQ(EMAC_TX_IRQn);
    NVIC_EnableIRQ(EMAC_RX_IRQn);

    EMAC_ENABLE_RX();
    EMAC_ENABLE_TX();
    printf("emaec enable rx dfksa \r\n");
//    if (dhcp_start() < 0)
//    {
//        // Cannot get a DHCP lease, use static IP.
//        printf("DHCP failed, use static IP 192.168.10.10\n");
//        g_au8IpAddr[0] = 0xC0;
//        g_au8IpAddr[1] = 0xA8;
//        g_au8IpAddr[2] = 0x0A;
//        g_au8IpAddr[3] = 0x0A;
//    }
    if (dhcp_start() > 0)
    {
        printf(" IP is %d.%d.%d.%d\n",g_au8IpAddr[0],g_au8IpAddr[1],g_au8IpAddr[2],g_au8IpAddr[3]);
    }
    while(1);

}

使用特权

评论回复
沙发
daichaodai| | 2022-6-9 08:38 | 只看该作者
说明代码有bug啊

使用特权

评论回复
板凳
fst20220608|  楼主 | 2022-6-9 09:28 | 只看该作者
刚开始时获取到的IP可以ping成功,过了一段时间之后以太网接口不亮了,IP也没法ping成功,我重新烧录发现以太网也是一样,获取不到IP,等了一段时间(大概1个半小时)烧录板子,发现以太网恢复正常了,IP也能获取到,这是代码问题吗?

使用特权

评论回复
地板
fst20220608|  楼主 | 2022-6-9 13:48 | 只看该作者

看不出来哪里有bug

使用特权

评论回复
5
caoqing| | 2022-6-9 21:52 | 只看该作者
这个程序自动获取IP,过段时间就ping延长,直至不通,改为固定IP试试

使用特权

评论回复
6
caoqing| | 2022-6-9 21:57 | 只看该作者
该程序使用了中断的方式接收网卡数据包,在每次中断中只读取网卡的一个数据包。如果一次中断发生,而网卡内事实上可能存在有多个数据包,这样如果只读一个,最终导致网卡内数据包积压,所以会出现ping延迟的现象。如果数据包长期积压,还可能出现因网卡缓冲区满而无法接收数据的情况,由于无接收中断产生,控制器也不会处理积压数据的现象,从而发生网卡假死的现象,系统无法接收数据。

使用特权

评论回复
7
sparrow054| | 2022-6-12 21:14 | 只看该作者
是固定IP么

使用特权

评论回复
8
fst20220608|  楼主 | 2022-6-13 09:54 | 只看该作者
没有固定IP,是自动获取的

使用特权

评论回复
9
tpgf| | 2022-7-4 11:05 | 只看该作者
作为哪个端啊

使用特权

评论回复
10
nawu| | 2022-7-4 11:13 | 只看该作者
ip地址是灵活的还是固定的啊

使用特权

评论回复
11
aoyi| | 2022-7-4 11:31 | 只看该作者
卡在什么地方了呢

使用特权

评论回复
12
aoyi| | 2022-7-4 11:38 | 只看该作者
是卡了还是断网了啊

使用特权

评论回复
13
zljiu| | 2022-7-4 11:47 | 只看该作者
每次会改变ip地址吗

使用特权

评论回复
14
tfqi| | 2022-7-4 11:55 | 只看该作者
另一端是什么

使用特权

评论回复
15
match007| | 2022-7-20 19:11 | 只看该作者
不稳定?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

11

帖子

0

粉丝