RT-Thread—STM32—enc28j60

article/2025/11/5 15:18:40

!!! 本文已同步到码云 - 点击此链接获取最新 - 可进入码云提交修改 !!!


概述

本教程主要是讲解如何使用ENC28J60模块介入以太网
本例程的模板使用通用模板环境搭建里面的模板RT-Thread—STM32—环境搭建
文末也有我移植好的例程,不过建议大家从头开始移植,加深印象^_^


配置

  • 打开工程目录,在ENV下输入menuconfig进入图形化配置界面
  • 配置SPI2
  • 使用ENC28J60软件包
  • 使用lwIP 2.0.2
  • 使能socket
  • 使能network相关组件
  • 保存配置并且退出ENV

代码修改

  • 添加drv_enc28j60.c,drv_enc28j60.h,m_udp.h,m_udp.c文件
  • drv_enc28j60.c文件中添加ENC28J60和SPI相关的初始化
#include <rtthread.h>
#include <enc28j60.h>
#include <drivers/pin.h>
#include "spi_flash.h"
#include <rtdevice.h>
#include "drv_spi.h"
#include "enc28j60.h"
#include <board.h>#define ENC28J60_BUS          "spi2"
#define ENC28J60_DEVICE       "qspi20"#define ENC28J60_CS             GET_PIN(B,8)//14      // PA0 for STM32F103RC defined in drv_gpio.c
#define ENC28J60_INT            GET_PIN(B,9)//15      // PA1 for STM32F103RC defined in drv_gpio.c
#define ENC28J60_RESET      	GET_PIN(B,10)//20      // PA4 for STM32F103RC defined in drv_gpio.c/* 接线相关* GND--------接地* VCC--------接电源* CS---------PB8(可自定义)* INT--------PB9(可自定义)* RST--------PB10(可自定义)* SCK--------PB13(SPI2的SCK)* MOSI(SI)---PB15(SPI2的MOSI)* MISO(SO)---PB14(SPI2的MISO)**/void enc28j60_int_handler(void *args)
{/* enter interrupt */rt_interrupt_enter();enc28j60_isr();/* leave interrupt */rt_interrupt_leave();
}/* 设备初始化 */
static int rt_hw_enc28j60_init(void)
{/* Configure SPI */rt_hw_spi_device_attach("spi2", "qspi20", GPIOB, GPIO_PIN_8);/* Configure Reset */rt_pin_mode(ENC28J60_RESET, PIN_MODE_INPUT_PULLUP);rt_pin_write(ENC28J60_RESET,0);rt_thread_delay(1);rt_pin_write(ENC28J60_RESET,1);enc28j60_attach(ENC28J60_DEVICE);/* Configure Interrupt */rt_pin_mode(ENC28J60_INT, PIN_MODE_INPUT_PULLUP);rt_pin_attach_irq(ENC28J60_INT, PIN_IRQ_MODE_FALLING, enc28j60_int_handler, (void*)"callbackargs");rt_pin_irq_enable(ENC28J60_INT, PIN_IRQ_ENABLE);return RT_EOK;
}
INIT_DEVICE_EXPORT(rt_hw_enc28j60_init);
  • m_udp.c文件里面添加了通过代码实现UDP server的简单功能
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include "m_udp.h"#include <sys/socket.h> //使用BSD socket,需要包含sockets.h头文件
#include <netdb.h>
#include <string.h>
#include <finsh.h>#define BUFSZ   1024
const char send_data1[] = "I'm a client.\n"; /* 发送用到的数据 */void thread_udp_entry(void *param)
{int sock;int bytes_read;char *recv_data;socklen_t addr_len;struct sockaddr_in server_addr, client_addr;/* 分配接收用的数据缓冲 */recv_data = rt_malloc(BUFSZ);if (recv_data == RT_NULL){/* 分配内存失败,返回 */rt_kprintf("No memory\n");return;}/* 创建一个socket,类型是SOCK_DGRAM,UDP类型 */if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1){rt_kprintf("Socket error\n");/* 释放接收用的数据缓冲 */rt_free(recv_data);return;}/* 初始化服务端地址 */server_addr.sin_family = AF_INET;server_addr.sin_port = htons(5000);				//设置自己的端口号server_addr.sin_addr.s_addr = INADDR_ANY;rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));/* 绑定socket到服务端地址 */if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1){/* 绑定地址失败 */rt_kprintf("Bind error\n");/* 释放接收用的数据缓冲 */rt_free(recv_data);return;}addr_len = sizeof(struct sockaddr);rt_kprintf("UDPServer Waiting for client on port 5000...\n");while(1){bytes_read = recvfrom(sock, recv_data, BUFSZ - 1, 0,(struct sockaddr *)&client_addr, &addr_len);recv_data[bytes_read] = '\0';/* 输出接收的数据 */rt_kprintf("\n(%s , %d) said : ", inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));rt_kprintf("%s", recv_data);/* 发送数据 */sendto(sock, send_data1, strlen(send_data1), 0,(struct sockaddr *)&client_addr, sizeof(struct sockaddr));rt_thread_mdelay(500);}
}/* 初始化任务 */
static int m_udp_sample(void)
{rt_thread_t tid_udp = rt_thread_create("m_udp",thread_udp_entry,RT_NULL,1024,20, 5);if (tid_udp != RT_NULL){rt_thread_startup(tid_udp);}
}INIT_APP_EXPORT(m_udp_sample);

测试

  • 烧录代码,连接上网线,通过Xshell调试
  • 查看自己IP
  • 使用 DNS Ping 百度的服务器
  • 在同一个路由下面,模拟UDP client发数据 如图:
  • 如果结果和我一样就说明你已经成功了

小结

很多智能设备都需要接入互联网,本节就通过ENC28J60模块让单片机通过有线网接入了互联网,大家可能会问,如何通过无线WIFI接入互联网,这里推荐一个乐鑫的ESP8266WIF模块.乐鑫官网


源代码获取

源码已放到码云 ! ! ! ( 请点击文首链接进入仓库 )


备注



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

相关文章

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网卡的驱动&#xff0c;无奈硬件出了点问题&#xff0c;通过杜邦线链接开发板和DM9000网卡模块&#xff0c;系统上电&#xff0c;还没加载网卡驱动就直接崩溃了&#xff0c;找不到原因。。。刚好手上有一个enc28j60的网卡模块&#xff0c;于是就着手移植enc28j…

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

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

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

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

基于enc28j60的学习心得

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

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

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

单片机 STM32 HAL 网络模块 ENC28J60

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

ENC28J60 简介

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

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

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

学习C语言的教材

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

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

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

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

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

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

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

国内C语言教材中几种值得商榷的说法

作者&#xff1a;巨同升 “C语言程序设计”这门课程在国内高校普遍开设已有近三十年&#xff0c;课程的建设和研究取得了长足的进步&#xff0c;涌现出了数量众多、各具特色的C语言教材。尽管如此&#xff0c;在许多C语言教材中还或多或少地存在着一些不准确甚至是值得商榷的说…

既然谭浩强的C语言教材不好,那应该选什么书作C语言教材?

易道云学院C语言/C语法学习不在于你看了多少书&#xff0c;而在于你实实在在写了多少有效代码。易道云学院 回到这个问题&#xff0c;其实我个人认为&#xff0c;看什么样的书&#xff0c;也是需要应对不一样的场景易道云学院去有目的地涉猎。我暂时想到了几种情况&#xff0c;…

c语言课本答案解析宋士银,c语言教材

22.40定价&#xff1a;28.00(8折) /2007-02-01 根据教育部高等学校计算机科学与技术教学指导委员会提出的《关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求》的有关要求&#xff0c;编者组织了一批多年工作在教学一线且有丰富教学经验的教师编写了《…

C语言的环境变量配置

一、编辑器选择与安装 这边选用的编辑器是比较常见的devc&#xff0c;当然vscode和vc也都可以用来学习C语言&#xff0c;要软件和C语言环境变量的话可以加QQ群&#xff1a;373270625 第一步全部默认勾选就行无脑下一步 第二步选择一个放软件的文件夹&#xff0c;我这边选择的…

Jmeter环境变量配置

解压后 电脑桌面----》“计算机”图标----》鼠标右键选择“属性”----》点击高级系统设置----》高级---》环境变量页面 1.在系统变量框&#xff0c;点击“新建”&#xff0c;建立一个变量&#xff1a;JMETER_HOME,值为你解压的jmeter安装路径 2.配置classpath变量&#xff0c…

java设置环境变量jre_JRE环境变量配置图解

JRE(Java Runtime Environment,Java运行环境),运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。如果大家需要查看JRE环境变量配置图解过程,看完本文你的问题也就迎刃而解了。 我们这里使用jre-7u67-windows-i586的32位JRE安装包,大小只有20多M,比JDK7小了…

Anaconda环境变量配置

Anaconda Anaconda环境变量配置 学习自用 解决问题 例如在VSCode中使用虚拟环境运行python代码导致的问题 *ImportError: DLL load failed while importing win32gui*新建系统变量&#xff0c;添加Anaconda安装路径 以后想用其他环境直接修改变量值就可以了 新建环境变量 变…