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

article/2025/11/5 13:50:44

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实现以太网通信的功能就讲到这里了。

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


http://chatgpt.dhexx.cn/article/rR1xrLn0.shtml

相关文章

如何使用Arduino Web服务器连接ENC28J60以太网模块

在本篇文章中,我们将学习如何将ENC28J60以太网模块与Arduino Web服务器进行连接,以在LAN局域网或无线网络中的计算机与Arduino之间建立通信。我们将ENC28J60以太网控制器与Arduino连接,以便我们的Arduino成为该网络的成员之一。一旦完成&…

ENC28J60学习

ENC28J60符合IEEE802.3的全部规范,采用了一系列包过滤机制以对传入数据包进行限制,内部有一个NMA模块,与主控制器通过两个中断脚和SPI实现通信。 寄存器: 共有三种不同形式的寄存器——控制寄存器,以太网寄存器 和PH…

STM32开源代码——ENC28J60程序

正点原子精英开发板 模块化封装,入口函数简明,易上手操作 展示main.c代码,完整代码请下载 网路调试工具与库函数讲解已放在压缩包中 点击下载代码 开机检测ENC28J60,如果检测不成功,则提示报错。在成功检测到ENC2…

51单片机 ENC28J60 TCP/IP通信

转载地址 https://blog.csdn.net/a_a666/article/details/78277628 51单片机 ENC28J60 TCP/IP通信 单片机:STC90C516RDENC28J60模块:mini(3.3V供电)设备:PC、开发板、两个网线、路由器 首先先介绍一下本文的移植针对于单片机做…

STM32+ENC28J60+UIP协议栈实现WEB服务器示例

一、环境介绍 MCU: STM32F103ZET6 网卡: ENC28J60 协议栈: UIP 开发软件: Keil5 二、功能介绍 完整项目源码下载链接:https://download.csdn.net/download/xiaolong1126626497/18617694 STM32控制ENC28J60UIP协议栈创建TCP服务器(WEB服务器),支持…

ENC28J60+STM32F103在STM32CubeIDE上移植lwIP2.1.2

ENC28J60STM32F103在STM32CubeIDE上移植lwIP2.1.2 为了学习lwIP,网购了一块正点原子的Mini STM32开发板和一个ENC28J60以太网模块,发现正点原子所给的示例代码是基于lwIP1.4.1的,有点偏老,最新版本的lwIP是2.1.2,使用的…

RT-Thread—STM32—enc28j60

!!! 本文已同步到码云 - 点击此链接获取最新 - 可进入码云提交修改 !!! 概述 本教程主要是讲解如何使用ENC28J60模块介入以太网 本例程的模板使用通用模板环境搭建里面的模板RT-Thread—STM32—环境搭建 文末也有我移植好的例程,不过建议大家从头开始移植&#xf…

GD32F4xx 以太网芯片(enc28j60)驱动移植

1、enc28j60 简介 ENC28J60 是带有行业标准串行外设接口(SPI)的独立以太网控制器。 主要特性: (1)SPI最高通信速率:10Mb/s。只支持SPI的模式0,0,且SPI端口要求SCK在空闲状态时为低电平。 (2)支持全双工和半双工模式。 (3)8KB 发送/接收数据包双端口RAM.,可配置发送…

enc28j60 linux 驱动_linux enc28j60网卡驱动移植(硬件spi和模拟spi)

本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因。。。刚好手上有一个enc28j60的网卡模块,于是就着手移植enc28j…

lwip-2.1.3在STM32F103ZE+ENC28J60有线网卡上无操作系统移植(使用STM32 HAL库)

程序下载链接:百度网盘 请输入提取码(提取码:k6tz) 【重要说明】 连接方式一(推荐): 电脑有线网卡断开,无线网卡连无线路由器,无线网卡配置成自动获取IP地址。 板子的E…

enc28j60是带SPI接口的独立以太网控制器(即网卡),兼容IEEE 802.3,集成MAC和10 BASE-T PHY.而KSZ8081只是PHY芯片和网口扫盲三:以太网芯片MAC和PHY的关系

百度百科中介绍以太网控制器也称以太网适配器,就是我们通常称的“网卡”。电脑中网卡通过PCI和CPU相连,网卡上RJ45插网线水晶头。教程中的ENC28J60通过SPI和单片机相连,ENC28J60模块的RJ45插网线的水晶头 以太网控制器_百度百科 1.概述 enc2…

基于enc28j60的学习心得

1.概述 enc28j60是带SPI接口的独立以太网控制器,兼容IEEE 802.3,集成MAC和10 BASE-T PHY,最高速度可达10Mb/s。基于enc28j60控制器的理解可阅读文章: ENC28J60学习笔记,在该文章内详细介绍控制器的使用方法&#xff0c…

单片机学习:手把手教你移植LWIP(ENC28J60)

这里只是移植,所以LWIP那么多的协议都不需要管,只要知道哪里需要我们修改,为什么修改就可以了。 上图就是整个移植的基本思路,非常清晰的三个层次。其实想想,本质上就是收发数据,只是LWIP协议通过对数据的…

单片机 STM32 HAL 网络模块 ENC28J60

文章目录 一、 简介二、特性三、示例代码 一、 简介 ENC28J60 是带有行业标准串行外设接口(Serial Peripheral Interface,SPI)的独立以太网控制器。它可作为任何配备有 SPI 的控制器的以太网接口。ENC28J60 符合IEEE 802.3的全部规范&#x…

ENC28J60 简介

单片机以太网方案 单片机想要使用以太网的话,通常有以下几种方案: 如果 MCU 内部集成 MAC 控制器,则只需外接一个 PHY 芯片就可以了如果 MCU 内部没有 MAC 控制器,需要外接 MAC 芯片和 PHY 芯片,这两颗芯片可以分立也…

c语言程序设计 国外教材,标准C程序设计(第7版国外计算机科学经典教材)

导语 内容提要 E.巴拉古路萨米著李周芳译的《标准C程序设计(第7版国外计算机科学经典教材)》专门用于满足渴望成为程序员的学生,最新版按照Bloom分类法所定的学习目标来呈现主题,支持基于学习的成果。本书解释了基本概念和高级内容,且主要关注…

学习C语言的教材

作者: 阮一峰 日期: 2011年9月18日 我的C语言是自学的,这些年看过不少教材。 下面,我对其中一些教材做个点评。 1. How to Think Like a Computer Scientist: C version 这是我读过最易懂的C语言教材。 虽然它只讲解最基本的语法&…

新概念c语言周二强07答案,新概念C语言能力教程(普通高等教育十二五规划教材)...

导语 内容提要 周二强编写的《新概念C语言能力教程(普通高等教育十二五规划教材)》以先进的教学理念为指导,以培养编程能力与学习能力为目标,从全新的角度解析了C语言,高屋建瓴地阐释了C语言学习中的诸多难点,对序列点、指针等概念…

计算机程序c语言教材,全国计算机等级考试二级C语言程序设计教材(2018年版)...

2018年计算机二级教材:C语言程序设计 简介 书名:全国计算机等级考试二级教程——C语言程序设计(2018年版) 作者:教育部考试中心 出版社:高等教育出版社 出版时间:2017年11月 ISBN:9787040488524 定价&#…

树莓派(0)C语言教材学习

学习日记的功能主要是记录学习C语言的知识还有难上手的地方,之后会记录配置树莓派环境还有设计linux环境下C语言的实验题目 目前在K&R的《C语言程序设计》教材学习,前面的内容没有难度,基本上和高级程序设计语言的学习思路一样&#xff0…