STM32 Arp Paketi ile IP adresi alma

Başlatan robikod, 16 Ocak 2019, 15:53:50

robikod

Herkese merhaba,

Stm32 ile enc28j60 entegresi kullanıyorum. Stm32 için IP adresi almak istiyorum. Bunun için ARP kullanmayı düşündüm, istediğim IP adresi boş mu diye öncelikle kontrol ettim. Daha sonra, o adrese ping atıp ARP isteği oluşturdum. STM32 tarafında ise, arp paket yapım şu şekilde, x'ler mac adresim (eternet), y ler IP adresi temsil etsin. Ağ üzerinde ARP yayını yapan çok cihaz olduğu için sadece, bilgisayar ve enc28 cihazını eternet kablosuyla bağladım. Dolayısı ile KAynak MAc ve Cihaz MAC adreslerim aynı oldu. O yüzden aşağıda yazan xxler hep aynı MAC. IP adresi için ise 1 olan benim bilgisyarım, 3 olan ise stm32 için almak istediğim IP.

Ancak bu kodları aşağıdaki şekilde çağırdığım zaman wiresharkta hiç bir şey göremiyorum. IP adresi alma yöntemim yanlış mı ?
while (1)
        {
            enc28_packetSend(ARP_req, 42);
        }

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,                         /* Cevap verdiğim için   */
    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,             /* istediğim IP
    0xxx, 0xxx, 0xxx, 0xxx, 0xxx, 0xxx, /* ff:ff:ff:ff:ff:ff ar_tha */
    0x0a, 0x2a, 0x00, 0x01              /* İstek yollayan IP*/
};

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

robikod