0 工具准备
1.野火 stm32f407霸天虎开发板
2.LAN8720数据手册
3.STM32F4xx中文参考手册
4.Wireshark
1 以太网数据接收测试
1.1 以太网数据接收测试(轮询)
我们在主循环内轮询RX DMA描述符标志位查看是否接收到了数据,如果接收到了则将数据大小及内容打印出来,相关语句如下:
if (ETH_CheckFrameReceived())
{
frame = low_level_input();
printf("Len : %d\r\n", frame.length);
for (i = 0; i < frame.length; i++)
{
printf("%02X ", ((u8 *)frame.buffer)[i]);
}
printf("\r\n");
}
给开发板上电后,将开发板接入到和PC相连的局域网内,然后随便ping一个局域网的ip,例如192.168.101.123:
开发板接收到的数据如下:
长度为60,数据内容如上。
使用Wireshark抓取到的报文如下:
可以看到开发板接收到的报文和PC发出的报文内容一致,测试成功。
1.2 以太网数据接收测试(中断)
我们在ETH接收中断内检查RX DMA描述符标志位查看是否接收到了数据,如果接收到了则将数据大小及内容打印出来,相关语句如下:
void ETH_IRQHandler(void)
{
int i;
FrameTypeDef frame;
while(ETH_CheckFrameReceived() != 0) // 检测是否收到数据包
{
frame = low_level_input();
printf("Len : %d\r\n", frame.length);
for (i = 0; i < frame.length; i++)
{
printf("%02X ", ((u8 *)frame.buffer)[i]);
}
printf("\r\n");
}
ETH_DMAClearITPendingBit(ETH_DMA_IT_R);
ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);
}
给开发板上电后,将开发板接入到和PC相连的局域网内,然后随便ping一个局域网的ip,例如192.168.101.123:
开发板接收到的数据如下:
长度为60,数据内容如上。
使用Wireshark抓取到的报文如下:
可以看到开发板接收到的报文和PC发出的报文内容一致,测试成功。
2 以太网数据发送测试
我们构造一个ARP报文,然后发送到局域网内,查看PC是否内接收到该报文。相关语句如下:
uint8_t arpBuff[60] =
{
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x14,
0x99,0x30,0x08,0x06,0x00,0x01,0x08,0x00,0x06,0x04,
0x00,0x01,0x00,0x00,0x00,0x14,0x99,0x30,0xc0,0xa8,
0x65,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xa8,
0x65,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
int sendarp(int argc, char *argv[])
{
low_level_output(arpBuff, 60);
return 0;
}
Wireshark捕获到的报文如下:
和我们发送的ARP报文内容一致,测试成功。