Как получить IP для stm32? - PullRequest
       79

Как получить IP для stm32?

0 голосов
/ 16 января 2019

Я хочу получить IP-адрес для моего STM32. Поэтому я использую ARP ethernet protocole frame.

X-> см. Мой MAC Y-> см. IP-адрес

Я подключил Ethernet-кабель между stm32 и компьютером, поэтому MAC-адрес для них обоих одинаков. Я выбираю пустые IP-адреса для STM32 (пример yy.yy.yy.3) И затем я использую командную строку «ping yy.yy.yy.3» на терминале, поэтому запускаю ARP-запросы. И я хочу ответить на этот запрос, но любой ответ не может увидеть на Wireshark. Где моя ошибка?

Отправьте ответ этой строкой

   while (1)
            {
                enc28_packetSend(ARP_req, 42);
            }

Это пакет ARP Ethernet:

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;
    }
}
...