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网管收发功能)

相关推荐
铅笔小新z12 小时前
【stm32】WWDG(窗口看门狗)
stm32·单片机·嵌入式硬件
La Pulga13 小时前
【FreeRTOS源码学习笔记】任务创建
笔记·stm32·mcu·学习·嵌入式·freertos·实时操作系统
Hello-FPGA13 小时前
基于RFSOC FPGA ZCU216 的CoaXPress 采集demo
fpga开发
9527华安15 小时前
FPGA基于ADV7182解码PAL视频,Video Processing Subsystem去隔行,提供6套工程源码和技术支持
fpga开发·音视频·pal·adv7182
hahaha601615 小时前
数字图像时域滤波或者3D降噪算法FPGA实现
算法·计算机视觉·fpga开发
无敌贵点大王15 小时前
从寄存器层面重学STM32(5)——串口USART理论部分
stm32·单片机·嵌入式硬件
GateWorld15 小时前
Xilinx 7系列FPGA时钟网络详解
fpga开发·时钟网络·xilinx 7系列
szxinmai主板定制专家1 天前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
糖糖单片机设计2 天前
基于 STM32 的智能电蚊香控制系统
stm32·单片机·嵌入式硬件
szxinmai主板定制专家2 天前
AMR 项目落地:机器人控制器硬件定制化需求复盘
arm开发·单片机·fpga开发·系统架构·机器人·am62x