STM32与FPGA实现以太网功能--ping

方案:

①stm32与88E6320的一个RMII接口连接,实现网管功能。

②FPGA与88E6320的另一个RMII接口连接,使用UDP实现业务数据传输。

③stm32与FPGA中MAC地址不同,但是IP使用相同

结果:

1、在局域网点对点通信正常。

2、通过两台路由器后,UDP数据发送出去,另一端接收不到。

分析:FPGA中缺少ARP应答,路由器无法知道端口对应的MAC地址,路由器接收到UDP数据后不知道发送给谁(底层不太了解,大概是这问题)。这方案行不通(除非FPGA的IP与STM32不同,并且增加ARP协议),想偷懒失败(主要FPGA网络没怎么弄过,实在没把握)。

**修改方案:**FPGA接收网络数据,把业务数据过滤出来,其他网络帧保存在RAM中,通过中断通知STM32获取数据,实现网络ARP、 ICMP、tcp、udp等功能(FPAG模拟DM9000功能,很没把握,但目前只想到这种方案)

实现:

1、FPGA过滤业务数据,把其他网络数据保存到RAM_RX中。

2、STM32与FPGA通过FSMC并行总线通信,读取RAMRX数据,解析后发送数据到RAM_TX让FPGA发送出去。

STM32中lwip驱动实现:

1、直接通过STM32cubeMAX按连接以太网PHY芯片IP101做驱动(也可以百度DM9000驱动移植)。

2、去掉ETH驱动,保留LWIP,修改ethernetif.c文件

void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
{
  osSemaphoreRelease(s_xSemaphore);
}
屏蔽上面代码,更改为FPGA给的获取网络数据中断调用osSemaphoreRelease(s_xSemaphore);
s_xSemaphore是获取数据的信号量

3、以太网数据获取与发送接口

static err_t low_level_output(struct netif *netif, struct pbuf *p)
{
	fpga_SendPacket(p);
	return ERR_OK;
}
static struct pbuf * low_level_input(struct netif *netif)
{
	struct pbuf *p = NULL;
	p = fpga_Receive_Packet();
    ptr = p;
	return p;
}

找到low_level_output与low_level_input两个函数修改,我这使用的fsmc与FPGA通讯的,可以按自己需求修改

问题1:设备启动时候会发送2-3次ARP数据,后来就不发送数据了,但是仿真发现low_level_input有数据接收,搞了几天一直不知道哪里出问题,后来只接收发送给192.168.1.30(设备IP地址)的ARP包,其他过滤掉,low_level_output正常应答发送了(具体原因没找到?)

问题2:arp正常,但是ping包不通

解决:通过网络抓包工具发现有应答,与正常ping通数据对比,发现应答包中校验值都是0,找到ICMP处理函数icmp_input中发现CHECKSUM_GEN_IP与CHECKSUM_GEN_ICMP值是0,不会计算校验值,需要修改为1。

#define LWIP_TFTP 1
/*----- Value in opt.h for LWIP_STATS: 1 -----*/
#define LWIP_STATS 0
/*----- Value in opt.h for CHECKSUM_GEN_IP: 1 -----*/
#define CHECKSUM_GEN_IP 1
/*----- Value in opt.h for CHECKSUM_GEN_UDP: 1 -----*/
#define CHECKSUM_GEN_UDP 1
/*----- Value in opt.h for CHECKSUM_GEN_TCP: 1 -----*/
#define CHECKSUM_GEN_TCP 1
/*----- Value in opt.h for CHECKSUM_GEN_ICMP: 1 -----*/
#define CHECKSUM_GEN_ICMP 1

(ETH网络的,使用硬件实现校验,不能置1,否则会网络不通 )

static void low_level_init(struct netif *netif)
{
  HAL_StatusTypeDef hal_eth_init_status;

/* Init ETH */

   uint8_t MACAddr[6] ;
  heth.Instance = ETH;
  heth.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
  heth.Init.Speed = ETH_SPEED_100M;
  heth.Init.DuplexMode = ETH_MODE_FULLDUPLEX;
  heth.Init.PhyAddress = IP101GR_PHY_ADDRESS;
  MACAddr[0] = 0xC0;
  MACAddr[1] = 0x80;
  MACAddr[2] = 0xE1;
  MACAddr[3] = 0x00;
  MACAddr[4] = 0x00;
  MACAddr[5] = 0x00;
  heth.Init.MACAddr = &MACAddr[0];
  heth.Init.RxMode = ETH_RXINTERRUPT_MODE;
  heth.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;     // 硬件实现校验功能
  heth.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;

解决这两个问题后,能ping通,但是会断,不稳定,FPGA要调整,继续肝。。。。。。。。

(FPGA程序问题,ping成功,一晚上丢了1包,正常,下面测试web网管收发功能)

相关推荐
scan129 分钟前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
Mortal_hhh2 小时前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
DS小龙哥3 小时前
基于Zynq FPGA的雷龙SD NAND存储芯片性能测试
fpga开发·sd nand·雷龙·spi nand·spi nand flash·工业级tf卡·嵌入式tf卡
Mr.谢尔比3 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie4 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
鹿屿二向箔4 小时前
STM32外设之SPI的介绍
stm32
西瓜籽@4 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
极客小张7 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
m0_7393128710 小时前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件