如何获取stm32的IP?

Posted

技术标签:

【中文标题】如何获取stm32的IP?【英文标题】:How to get IP for stm32? 【发布时间】:2019-06-10 14:58:27 【问题描述】:

我想为我的 STM32 获取 IP 地址。所以我正在使用 ARP 以太网协议帧。

X-> 参考我的 MAC Y->参考IP地址

我在stm32和计算机之间连接了以太网电缆,所以它们的mac地址相同。我为 STM32 选择空 IP 地址(yy.yy.yy.3 示例) 而不是我在终端使用“ping yy.yy.yy.3”命令行,所以启动 ARP 请求。我想回答这个请求,但在wireshark上看不到任何答案。我的错在哪里?

用这一行发送答案

   while (1)
            
                enc28_packetSend(ARP_req, 42);
            

这是 ARP 以太网数据包:

unsigned char ARP_req[42] = 
    0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, /* ff:ff:ff:ff:ff:ff dst mac */
    0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, /* src mac */
    0x08, 0x06,                         /* ETH_P_ARP */
    0x00, 0x01,                         /*  ANSWER  */
    0x08, 0x00,                         /* ETH_P_IP */
    0x06,                               /* ETH_ALEN */
    0x04,                               /* 4 */
    0x00, 0x02,                         /* ARPOP_REQUEST */
    0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx /* ar_sha */
    0xyy, 0xyy, 0xyy, 0x03,             /* i
    0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, /* ff:ff:ff:ff:ff:ff ar_tha */
    0x0a, 0x2a, 0x00, 0x01              /* */
;

这是 enc28j60 的发送函数

void enc28_packetSend(unsigned char *packet, unsigned int len)



    uint8_t retry = 0;

    while (1)
    
        enc28_writeOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRST);
        enc28_writeOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_TXRST);
        enc28_writeOp(ENC28J60_BIT_FIELD_CLR, EIR, EIR_TXERIF | EIR_TXIF);
        if (retry == 0)
        
            enc28_write(EWRPTL, TXSTART_INIT & 0xFF);
            enc28_write(EWRPTH, TXSTART_INIT >> 8);

            enc28_write(ETXNDL, (TXSTART_INIT + len) & 0xFF);
            enc28_write(ETXNDH, (TXSTART_INIT + len) >> 8);

            enc28_writeOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);

            enc28_writeBuf(packet, len);
        
        enc28_writeOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRTS);
        uint16_t count = 0;
        while ((enc28_read(EIR) & (EIR_TXIF | EIR_TXERIF)) == 0 && ++count < 1000U)
            //  GPIO_SetBits(GPIOE, GPIO_Pin_9);

            ;
        if (!(enc28_read(EIR) & EIR_TXERIF) && count < 1000U)
        

            //no error start new trasnmission
            // GPIO_SetBits(GPIOE, GPIO_Pin_9);
            break;
        
        enc28_writeOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_TXRTS);
        break;
    

【问题讨论】:

以太网协议类型ETH_P_ARP遵循硬件地址类型,是0x0001(以太网),而不是0x0002。 我在这里写了 0x02 但我使用的是 0x01 但又不能成功 ARP 为您提供来自 IP 的 MAC,而不是来自 MAC 的 IP。除非目标有目标IP,否则它不应该应答。 如何使用 enc28j60 获取 Stm32 的 IP? 具有相同 MAC 的两台设备无法通信。你怎么知道你正在寻址哪个设备? 【参考方案1】:

如果您想获取主机提供的嵌入式客户端 IP 地址,您应该检查 DHCP。

【讨论】:

以上是关于如何获取stm32的IP?的主要内容,如果未能解决你的问题,请参考以下文章

stm32 RTC如何获取ms计时

如何从stm32f30x中的cortex-m-rt获取中断重新导出以运行

如何设置 stm32f4 实时时钟(RTC)以在亚秒寄存器中获取有效值?

如何在stm32上实现tcp/ip协议

如何在STM32上获得时间间隔?

过来人和你谈谈如何学STM32?