我想获得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;
}
}