问题遇到的现象和发生背景
问题出现在arp阶段,MCU可以正常接收arp数,并且使用UIP解析正常,但是向电脑端响应arp请求时,通过Wireshark发现接收到的响应arp包数据格式不正常!
问题相关代码,请勿粘贴截图
#define UIP_BUF ((struct uip_eth_hdr *)&uip_buf[0])
tapdev_init();//初始化enc28j60
print("init enc28j60 success!");
uip_init();
uip_ipaddr_t ipaddr;
uip_ipaddr(ipaddr, 192, 168, 1, 8);
uip_sethostaddr(ipaddr);
uip_ipaddr(ipaddr, 192, 168, 1, 1);
uip_setdraddr(ipaddr);
uip_ipaddr(ipaddr, 255, 255, 252, 0);
uip_setnetmask(ipaddr);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
uip_len = tapdev_read();//uip_len在uip.c中声明
if(uip_len == 0){
continue;
}
print("ok");
if(UIP_BUF->type == htons(UIP_ETHTYPE_ARP)) {
uip_arp_arpin();
if(uip_len>0){
print("rarp package send!!!");
print3((char*)uip_buf, uip_len);
tapdev_send();
}
}
/* USER CODE BEGIN 3 */
}
tapdev.c 实现enc28j60收发代码:
#include <tapdev.h>
#include "enc28j60.h"
#include <uip.h>
//引用uip.c中声明的uip_ethaddr
extern struct uip_eth_addr uip_ethaddr;
//MAC
unsigned char my_mac[6] = {0x29, 0x7C, 0x07, 0x37, 0x24, 0x63};
void tapdev_init(void)
{
enc28j60Init(my_mac);
for (int i = 0; i < 6; i++)
{
uip_ethaddr.addr[i] = my_mac[i];
}
}
unsigned int tapdev_read(void)
{
enc28j60PacketReceive(MAX_FRAMELEN, uip_buf);
}
void tapdev_send(void)
{
enc28j60PacketSend(uip_len, uip_buf);
}
更详细代码已上上传到蓝奏云,如果不愿下载,请评论通知我,我会尽快回复!
怀疑是用cubemx 生成代码时,SPI配置有问题,请帮忙确认, 非常感谢!
全部代码:
https://wwb.lanzouw.com/iNiJSxx0bah 密码:e5bk
使用cubemx + keil5
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
目前就想用uip ,实现电脑可以ping通的效果。
本人第一次使用SPI接口,非常希望各位能给一些解决办法的思路,非常感谢!