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);

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。(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要调整,继续肝。。。。。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/355987.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 交换排序 快速排序 hoare版代…

前端qrcode生成二维码详解

文章目录 前言1、浏览器支持2、优点3、缺点4、相关方法5、安装及使用示例 前言 qrcode 是一个基于JavaScript的二维码生成库,主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库。 官方文档:https://www.npm…

NetExec:一款功能强大的自动化网络安全评估与漏洞测试工具

关于NetExec NetExec是一款功能强大的自动化网络安全评估与漏洞测试工具,该工具可以帮助广大研究人员以自动化的形式测试大型网络的安全,并通过利用网络服务漏洞来评估目标网络的安全态势。 支持的协议 1、SMB协议 2、LDAP协议 3、WinRM协议 4、MSSQL协…

二叉树--199. 二叉树的右视图/medium 理解度C

199. 二叉树的右视图 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出…

IT问题解答类型网站源码,多用户博客文章程序

问答网是一款为IT工程师提供的问答平台,旨在帮助用户在线获取专业知识和相关问题的答案。在问答网,用户可以轻松找到其他人的问答问题,并在这里寻求解答。如果您有任何想要解决的问题,都可以在此发布问题并得到其他同行的解答。 该平台提供多项功能,支持支付宝在线付款,…

数字艺术展厅有什么好处,搭建数字艺术展厅要注意什么

引言: 数字艺术展厅是一种利用数字科技手段搭建的艺术展览空间,通过数字化展示艺术品,能够为观众带来全新的艺术体验。那么数字艺术展厅有什么好处,搭建数字艺术展厅要注意什么呢? 一、数字艺术展厅的好处 1.创新艺术…

STM32连接阿里云物联网平台

文章目录 引言一、STM32连接阿里云物联网平台思路二、ESP8266烧录固件三、使用AT指令连接阿里云物联网平台四、STM32环形串口缓冲区驱动程序五、STM32连接阿里云驱动程序 引言 连续写了两篇关于阿里云连接的文章,都是使用Arduino ESP8266 & Arduino ESP32的方式…

MG7050VAN 基于声表的差分多输出 晶体振荡器(LVDS)

MG7050VAN的LVDS输出是一款差分多输出晶体振荡器,具有极低的抖动和超强的稳定性。该振荡器适用于多种应用场景,如服务器、存储器和网络仪器等。作为一款高端的LVDS输出设备,该振荡器在输出性能上具有明显优势。其超低抖动水平可以达到0.3ps M…

子窗口的qss应该放在,它构造函数里

子窗口 构造函数 加载qss QFile qss(QString(":/simulator/resources/main_theme.qss")); if (qss.open(QIODevice::ReadOnly)) {auto content qss.readAll();this->setStyleSheet(content);qss.close(); }黑色样式 放在main_theme.qss #init_scene{ backgro…

NPDP证书:让你的职业生涯飞升!

🌟没错!NPDP证书正在成为产品经理们的“新宠”!越来越多的同行们纷纷选择考取NPDP证书,为什么这么火爆?一起来探究下吧! 🚀NPDP认证:产品经理的国际通行证 📍NPDP&#x…

Java 数据结构篇-实现二叉搜索树的核心方法

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 二叉搜索树的概述 2.0 二叉搜索树的成员变量及其构造方法 3.0 实现二叉树的核心接口 3.1 实现二叉搜索树 - 获取值 get(int key) 3.2 实现二叉搜索树 - 获取最小…

MyBatis框架-ResultMap

文章目录 ResultMapsqlUser.java解决方案**方案一:为列名指定别名 , 别名和java实体类的属性名一致(自动映射)**UserMapper.xmlUserTest.java测试结果 **方案二:使用结果集映射->ResultMap 【推荐】(手动映射)**测试结果 Resul…

linux安装 黑方容灾备份与恢复系统软件v6.0 代理

1.环境准备 1.1硬件环境 内存>4G,cpu最低双核 1.2把SElinux状态改为Disabled (1)查看SElinux状态 输入getenforce命令 SELinux共有3个状态: enforcing (执行中)、permissive (不执行但…

如何在Win系统安装Jupyter Notbook并实现无公网ip远程访问本地笔记

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中,使用最多的无疑就是各种函数、图表、…

YoloV8改进策略:Conv改进|DCNv4最新实践|高效涨点|多种改进教程|完整论文翻译

摘要 涨点效果:在我自己的数据集上,mAP50 由0.986涨到了0.993,mAP50-95由0.737涨到0.77,涨点明显! DCNv4是可变形卷积的第四版,速度和v3相比有了大幅度的提升,但是环境搭建有一定的难度,对新手不太友好。如果在使用过程遇到编译的问题,请严格按照我写的环境配置。 …

论文笔记:TimeGPT-1

时间序列的第一个基础大模型 1 方法 最basic的Transformer架构 采用了公开可用的最大时间序列数据集进行训练,包含超过1000亿个数据点。 训练集涵盖了来自金融、经济、人口统计、医疗保健、天气、物联网传感器数据、能源、网络流量、销售、交通和银行业等广泛领域…

自定义BeanNameGenerator生成规则

通过点进ComponentScan注解进入源码可以看到 追随BeanNameGenerator进入源码可以看到该类是个借口且只有一个方法 点击上面黑色箭头出现两个实现方法 点击第一个方法 进入determineBeanNameFromAnnotation方法中 通过上诉自定义一个生成beanName方法 先创建一个CustomeBeanN…

Docker本地部署APITable结合内网穿透实现公网访问

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台,是一款面向 API 的智能多维表格。它将复杂的可视化数据库、电子表格、实时在线协同、低代码开发技术四合为一&am…

QT+VS实现Kmeans++

1、Kmeans的原理如下: (1)首先选取样本中任一数据点作为第一个聚类中心; (2)计算样本每一个数据点至现所有聚类中心的最近距离,并记录下来; (3)逐一挑选所…

【C++】引用、内联函数、auto关键字等

前言:在前面我们讲解了C入门基础的一些学习例如命名空间、缺省参数、函数重载等。今天我们将进一步的学习,跟着博主的脚步再次往前迈一步吧。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:高质量C学习…