【STM32+cubemx】0020 HAL库开发:以太网ENC28J60芯片和TCP、UDP简单应用

2023-11-10

MCU通过以太网通信有很多种方式,有的内部自带以太网接口(如stm32f107的某些型号);如果没有,也可以在外围连接以太网芯片来实现。外接的以太网芯片,又分为带网络协议栈和不带协议栈的,带网络协议栈的典型如W5500,不带网络协议栈的典型的如EN28J60、DM9000等。

使用自带以太网接口、或是使用不带网络协议栈的芯片时,都要由软件来实现网络协议栈。通常来讲,自带网络协议栈的芯片使用简单,但灵活性差一些,由软件实现网络协议栈灵活性高,但实现复杂。

本节我们来学习使用ENC28J60芯片来实现以太网通信,网络协议栈使用一套极其精简的代码,只实现基本的ping、TCP、UDP通信功能。

本节的例子使用的开发环境是cubemx 6.1.0,pack版本是1.8.0;硬件使用的是stm32f103VET6和ENC28J60。

1)cubemx工程配置

先看一下硬件连接图:

ENC28J60这款芯片可实现10M的以太网通信,与MCU是使用SPI接口,接在SPI1口上,使用软件控制CS线,另外还连接了RST复位引脚、INT中断引脚。

配置SPI接口时,在cubemx中如下图设置:

选择全双工,配置为速率为不大于20M(因为ENC28J60的SPI接口时钟最大20M)

配置GPIO,PB7为输出CS、PE1为输出RST、PA6为输入INT:

把堆栈设置大一些,因为后面在代码中会申请比较大的内存变量:

到这里,cubemx里的设置就已经完成了,现在可以生成keil的代码工程了。

2)keil中的代码编写

打开生成的keil工程,添加一些代码源文件:

(可在文末关注公众号获取完整代码)

添加完成后,我们来看这里的代码实现过程。

这一套函数最早是老外在AVR单片机上实现的,代码以及其精简的函数实现了网络协议栈。

spi_enc28j60.c中实现了芯片和硬件SPI的接口;

enc28j60.c实现了芯片的初始化、网络数据包的收发等函数;

ip_arp_udp_tcp.c实现了网络协议栈;

web_sever.c则是实现了应用层的使用函数。

移植到我们的硬件环境中,只需要修改spi_enc28j60.c这个文件相关的函数即可。

spi_enc28j60.c文件里实现的是spi接口的初始化和访问enc28j60的基本读写函数:

初始化函数中,由于cubemx自动生成的代码中已有GPIO和SPI接口的初始化,所以这里可以跳过,只拉低一下复位线PE1即可。

SPI1_ReadWrite这个函数,需要实现的是一个字节的读写,我们直接调用HAL库函数HAL_SPI_TransmitReceive实现。

另外,在enc28j60.h文件中,实现片选线的拉高和拉低定义:

这样就移植完毕了。

Main函数中,只需要先调用初始化函数SPI_Enc28j60_Init,就可以调用应用层的函数了。

应用层的函数是在web_sever.c文件中的Web_Server函数实现的,它的主要处理过程如下:

先设置MAC地址、IP地址,然后进入while(1)循环,在循环中判断enc28j60是否收到数据,如果收到,则通过下面的几个if去判断收到的是什么类型的数据,再对应处理。

以收到UDP数据包处理为例,讲解处理过程:

收到数据后,先判断ip是否相符,不一致则返回;

接收的数据被存放在 buf 数组中,软件通过判断 buf 数组里的IP_PROTO_P这个字段来确定是否是UDP数据包,如果是,则再判断是否是1200端口收到的;

都符合则需要处理,处理过程就是把发来的数据都返回:先获取数据长度,再缓存,最后通过make_udp_reply_from_request函数发送回去。

Tcp的处理是实现了一个网页,可以通过计算机端访问,代码较长,这里就不放了,有兴趣可以获取源码了解。

3)运行测试程序

将代码编译、下载到开发板运行,开发板通过网线连接到计算机。

计算机端设置IP地址为192.168.1.18(只要和开发板的ip地址192.168.1.15在一个网段就行)。

测试网络是否连通:

在终端上输入ping 192.168.1.15:

可以看到ping有回复,说明网络已经可以通信了。

测试udp通信:

使用网络调试助手,设置udp连接,远端ip为192.168.1.15,远程端口为1200,本地端口也设置为1200。

连接后,发送数据,可以看到接收到同样的数据回复。

测试TCP功能(实现网页):

在计算机上用浏览器打开网址:192.168.1.15/123456,可以打开一个网页,如下图所示,点击打开LED/关闭LED,网址后会多出现一个 /0或/1,通过这个网址的变化可以控制开发板上的灯亮灭。该网页是应用层通过tcp按http协议格式发送的数据,所以tcp通信也是成功的。

4)注意事项

a) enc28j60的功耗不小,在使用时需要供电能力足够,如果仅使用usb接口的5v给开发板供电,有可能会通信不成功;

b) 本节中的例子,是用软件实现了一个极其精简的网络协议栈,有很多功能缺失,也有很多容错处理不完善,只能用于演示试验,做产品时建议移植相对完善的网络协议栈,如LwIP、uIP等都适用于小资源的MCU,本系列文章后续会有讲解。

好了,本节使用enc28j60实现以太网通信的功能就讲到这里了。

欢迎关注我的公众号,可留言“资料”获取相关源码和资料:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32+cubemx】0020 HAL库开发:以太网ENC28J60芯片和TCP、UDP简单应用 的相关文章

  • 对 C# 中 UDP 协议的套接字感到困惑

    我刚刚开始通过各种 Google 搜索学习套接字 但在弄清楚如何在 C 中正确使用套接字时遇到一些问题 我需要一些帮助 我有一个测试应用程序 Windows 窗体 和一个不同的类 实际上在它自己的 dll 中 但这无关紧要 我有我的套接字代
  • 在 iOS 中跨应用程序(后台/前台或分屏多任务处理)共享 UDP 数据

    我正在编写一个研究应用程序 该应用程序利用通过 UDP 广播数据的特定传感器 有各种商业应用程序使用此传感器 我们希望能够同时运行我们的应用程序和现有应用程序 在过去 iOS 8 及更低版本 我们会在后台运行应用程序来记录数据 并在前台运行
  • 丢包纠错码 (UDP)

    我不知道要寻找什么 因为我从 纠错代码 中得到的只是与您不知道错误位置的情况相关的内容 因此 这些代码比我需要的要复杂得多 而且效率低下 在下文中 请注意位等于数据包 因为只有整个数据包可能会丢失 因此位类比非常适合 是否有 ECC 考虑到
  • Android 无法通过互联网从 PC 服务器接收 UDP 数据

    我目前正在探索用Java 进行UDP 数据包传输 以在Android 上创建多人游戏 我使用通常的 127 0 0 1 成功地在 Nexus 4 内交换数据包 并且还成功地在本地网络中的 PC 服务器和 Android 客户端之间交换数据包
  • Android udp 多播与以太网

    大家好 我正在开发一个使用 udp 多播的项目 我有一台服务器通过以太网电缆发送多播 udp 数据包 我花了几周的时间阅读有关 android 上多播的所有帖子 但我仍然无法在我的 Asus Transformer Tablet 4 1 上
  • 简单的udp代理解决方案

    我正在寻找可以代理我的 udp 数据包的解决方案 我有一个客户端向服务器发送 udp 数据包 它们之间的连接非常糟糕 导致大量数据包丢失 一种解决方案是使用一个新的代理服务器 它将所有数据包从客户端重定向到目标服务器 新的代理服务器与这两个
  • 我应该使用哪个高级 API 来管理 iOS 上的 UDP 套接字? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在章节 使用套接字和流 https developer apple com library mac d
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 错误的 UDP 校验和没有效果:为什么?

    我正在尝试测试 UDP 程序 如果它接收到 UDP 校验和错误的数据 会发生什么情况 奇怪的是 它似乎没有任何效果 并且有效负载被成功接收 至少在 OS X 上是通过环回接口成功接收的 下面是一个示例 其中使用以下方式发送数据SOCK RA
  • 如果客户端在服务器之后启动,则 GStreamer v1.0 UDP 多播流无法正确解码

    我正在尝试使用 GStreamer 进行 UDP 多播屏幕流传输 我的投屏服务器应该在 Windows 上运行 and my 客户端应在 Linux 上运行 如果我在服务器之前启动客户端 一切都很好 问题是当我启动客户端并且服务器已经启动时
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • C#/Unity - 无法从异步方法调用 Unity 方法

    我正在使用Unity3D 这是我的异步方法 private void Receive IAsyncResult ar try IPEndPoint ipEndPoint null byte data udpClient EndReceive
  • 如何在QT中发送和接收UDP数据包

    我正在 QT 中编写一个小型应用程序 它通过本地网络发送广播 UDP 数据包 并等待来自网络上的一个或多个设备的 UDP 响应数据包 创建套接字并发送广播数据包 udpSocketSend new QUdpSocket this udpSo
  • 互联网上的 UDP 多播?

    我不确定如何最好地解决我的问题 我有一个在远程计算机上运行的服务 用于接收和处理 UDP 数据包 我希望该服务能够将这些数据包重新发送给任何需要它们的人 可能是任何人 通常是一台机器 但也可能更多 我认为 UDP 多播将是理想的 该服务可以
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • 接收UDP数据包

    假设我的程序通过网络 UDP 发送 1000 字节 它是否保证接收方将 一批 接收 1000 个字节 或者他可能需要执行多次 读取 直到收到完整的消息 如果后者为真 我如何确保同一消息的数据包顺序不会 混淆 按顺序 或者协议可能保证这一点
  • 在 macOS 10.12 上绑定到套接字时出现 NSPOSIXErrorDomain

    我正在玩CocoaAsyncSocket https github com robbiehanson CocoaAsyncSocket在 Swift 中绑定到 UDP 套接字并通过本地网络接收消息 我正在初始化一个套接字 并尝试绑定到一个端
  • 在 PowerShell 中通过 UDP 发送和接收数据

    我正在尝试编写一个脚本来使用 PowerShell 进行测试和应用 测试应包括通过 UDP 向远程服务器发送字符串 然后读取该服务器的响应并对结果执行某些操作 我需要的唯一帮助是脚本的中间两个步骤 发送字符串 然后 接收响应 在端口 UDP
  • 为什么 SNMP 通常在 UDP 上运行而不是 TCP/IP 上?

    今天早上 工作中出现了大问题 因为 SNMP 陷阱没有 通过 因为 SNMP 是通过 UDP 运行的 我记得在大学网络课上 UDP 不能像 TCP IP 那样保证传输 维基百科说 SNMP 可以在 TCP IP 上运行 但 UDP 更常见
  • recvfrom() 中的 addrlen 字段有何用途?

    我在程序中使用 recvfrom 从我在 src addr 中指定的服务器获取 DGRAM 数据 但是 我不确定为什么需要初始化并传入addrlen 我读了手册页 但不太明白它的意思 如果src addr不为NULL 并且底层协议提供了源地

随机推荐

  • Linux SELinux

    Security Enhanced Linux SELinux 是一种Linux系统的安全体系结构 允许管理员对系统访问权限进行更精细的控制 它最初由美国国家安全局 NSA 开发 使用Linux安全模块 LSM 对Linux内核打了一系列补
  • emd分解MATLAB自带函数

    matlab 2018开始自带了emd和hht函数 现将emd函数用法总结如下 imf residual info emd x Interpolation pchip 或者 emd x Interpolation pchip 输入参数 x
  • DataWhale Linux——Task01 Linux简介

    目录 什么是Linux Linux的优点 常用发行版 什么是Linux Linux 全称为GNU Linux 是一种免费使用和自由传播的类UNIX操作系统 我们常说的Linux 是指Linux内核 Linux的优点 开源免费 多用户 多任务
  • 预备1-window常用快捷键

    window常用快捷键 快捷键有很多很多 开发程序 刚入门只需要掌握简单的 菜单键 和书本一样的按键 鼠标的右键 1 查看 菜单 v gt gt gt gt 常用于 隐藏桌面图标 gt gt gt 菜单 v d 2 刷新 菜单键 E 3 新
  • 多功能透明屏,在智能家居领域中,有哪些功能特点?显示、连接

    多功能透明屏是一种新型的显示技术 它能够在透明的表面上显示图像和视频 并且具有多种功能 这种屏幕可以应用于各种领域 如商业广告 智能家居 教育等 为用户提供更加便捷和多样化的体验 首先 多功能透明屏可以用于商业广告 传统的广告牌通常是单一的
  • 一文教你如何用C代码解析一段网络数据包?【含代码】

    本文的目的是通过随机截取的一段网络数据包 然后根据协议类型来解析出这段内存 学习本文需要掌握的基础知识 网络协议 C语言 Linux操作 抓包工具的使用 其中抓包工具的安装和使用见下文 一文包你学会网络数据抓包 视频教学链接如下 教你如何抓
  • shell编写监控httpd服务80端口脚本.间隔3秒监控端口如果服务关闭自动重启

    bin bash 实时每隔3秒监控HTTP服务状态 服务异常输出报警信息 并尝试启动 服务正常时提示正常运行 web netstat ant grep 80 awk print 4 awk F print 4 apachelog var l
  • Redis在项目中的应用

    在aop模式下使用redis 的方式 1 添加依赖
  • 设计模式之美(王争)摘录总结

    经过八个月的学习 极客时间中王争的设计模式之美 最近又重读两遍 读书百遍其义自现 真是遍受益匪浅啊 学习之后才知道代码可以这样设计这样优美的编写 觉得自己有摘录一些在学习中认为比较好的精华 以备自己以后的查用和复习 设计模式要干的事情就是解
  • javaweb-时间格式Date的各种转换

    文章目录 package util import org junit Test import java text DateFormat import java text ParseException import java text Sim
  • 数据库原理之如何设计一个ER模型

    数据库原理之如何设计一个ER模型 前言 这里是 数据库系统原理 系列文章 主要介绍数据库系统理论以及数据库实用技术 数据库技术是计算机学科中的一个重要分支 它的应用非常广泛 几乎涉及所有的应用领域 关于作者 小白 Libra 计算机兴趣爱好
  • gazebo_ros_control plugin: GazeboRosControlPlugin missing DefaultRobotHWSim

    运行gazebo ros control出现了这个错误 只要在对应的 gazebo文件中添加一行
  • gis怎么提取水系_arcgis水系提取流程(dem)

    内容来自用户 2527092 以鸭绿江流62616964757a686964616fe78988e69d8331333433646365域为例 DEM文件名为YLJdem img 研究区域矢量边界为ylj Output evf 统一处理得到
  • Java UUID生成4位8位16位20位24位32位长度的随机字符串 UUIDUtil工具类

    import sun misc BASE64Encoder public class UUIDUtil 采用URL Base64字符 即把 换成 static private char alphabet ABCDEFGHIJKLMNOPQR
  • 无线ap ntp服务器,我有一优科 ZoneFlex 7982 的无线AP,怎样可以进AP系统进行设置...

    满意答案 zisedeL 2015 10 09 采纳率 49 等级 7 已帮助 308人 1 用手机或笔记本连上优科 产品反面MAC地址后6位 的无线信号 2 1 xp系统 右击网络邻居选择属性 看到无线网络连接再右击选择属性 选择Inte
  • pygame游戏模块详解

    目录 一 下载pygame第三方模块 二 pygame模块知识点化 把模块分为n多个知识点 1 使用pygame知识制作一个可以关闭的空白窗体 这里我就不用文字说明了 直接上代码 简洁明了 2 使用精灵显示背景 背景的循环展示 3 使用精灵
  • Win11:软件图标丢失

    问题描述 Win11 软件图标丢失 有空白的 也有带图案的 问题截图 开始页面 桌面 问题原因 文件路径权限丢失 权限异常 解决方案 有用 添加权限 文件夹右键 属性 安全 高级 更改 高级 立即查找 选择当前登录账户 一路点击确定 应用即
  • PFR简介---Cisco技术

    什么是 PfR Performance Routing PfR 是 Cisco Systems 的最新 WAN 线路优化技术 能够发挥现有 Cisco 设备的作用 该技术可以优化两条或更多条 WAN 连接之间的流量 既可以节省带宽成本 又能
  • 恶意流量监测开源系统:Maltrail

    20210309 0 引言 一般来说 通过IDS来监测一些攻击流量 或者说恶意流量也是可以的 但是现在看到的这个开源软件 1 是专门利用IOC来识别恶意流量 具体细节我没有深入去研究 例如流量捕获部分到底是什么引擎来启动的 1 系统简介 在
  • 【STM32+cubemx】0020 HAL库开发:以太网ENC28J60芯片和TCP、UDP简单应用

    MCU通过以太网通信有很多种方式 有的内部自带以太网接口 如stm32f107的某些型号 如果没有 也可以在外围连接以太网芯片来实现 外接的以太网芯片 又分为带网络协议栈和不带协议栈的 带网络协议栈的典型如W5500 不带网络协议栈的典型的