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


概述

本教程主要是讲解如何使用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模块.乐鑫官网


源代码获取

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


备注


RT-Thread—STM32—enc28j60相关推荐

  1. 正点原子delay函数移植到rt thread操作系统(HAL库)

    正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS. 下面将delay.c函数移植到rt thread中,使用的bsp是rt t ...

  2. Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32

    1.前言     [2014年4月重写该博文]     经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...

  3. LwIP学习笔记——STM32 ENC28J60移植与入门

    0.前言 去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一详解个别 ...

  4. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

  5. stm32f407单片机rt thread 片外spi flash OTA升级配置示例

    参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...

  6. 使用RT Thread设备框架封装一个I2C设备——DS3231

    使用RT Thread设备框架封装一个I2C设备--DS3231 前言 ENV配置 I2C测试 将ds3231封装成一个字符设备 结语 前言 学习rt thread的I2C的时候,恰巧手上的板子留了d ...

  7. STM32+enc28j60+uip 实现 单片机 ping PC端

    STM32+enc28j60+uip 实现单片机 ping PC端 1. 前言 2. 实验简介 3. uip简介 4. icmp简介 4.1 icmp介绍 4.2 请求回显或回显应答报文格式介绍 5. ...

  8. rt thread studio使用QBOOT和片外flash实现OTA升级

    我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...

  9. rt thread 使用FAL遇到fal_init() undefined reference

    rt thread FAL 0.5版,之前有没有不知道,遇到一个坑. 在main.cpp里面已经 #include <fal.h> fal_init() 编译报错,说 fal_init() ...

  10. RT Thread Free Modbus移植问题整理

    RT Thread Free Modbus移植问题整理 问题描述: 在读写寄存器中,写数据正常,只能读1个寄存器的值,多个值会异常. 在移植过程中发现串口(或RS485)数据接收长度异常. 一.环境描 ...

最新文章

  1. 阿里云华北区挂了。。。
  2. 对全局变量,static静态变量的理解
  3. ahjesus 获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome
  4. 基于html5 Canvas图表库 : ECharts
  5. 变分模态分解(VMD)-Python代码
  6. Java中的跨站请求伪造
  7. UIKit框架的介绍
  8. HDU 5442 (串的最大表示+KMP)
  9. wps html转换成pdf文件,wps怎么转换成pdf
  10. 美颜SDK多少钱一年?视频美颜SDK的价格由哪些因素影响?
  11. 运维工程师到底是个啥?
  12. AtCoder Beginner Contest 168 C~D题解
  13. 网页设计配色应用教程之各种色彩对比分析
  14. DataHub调研数据血缘
  15. java毕业设计宝马官网Mybatis+系统+数据库+调试部署
  16. 拿到大厂前端offer的前端开发是怎么回答面试题的
  17. 为什么土豆网王微会放弃自己原有的立场,跟优酷合并?合并后有何影响?
  18. linux p12 转 pem,p12转PEM供golang APNS使用
  19. TransmittableThreadLocal的简单使用 + 手写源码
  20. Unity配置安卓JDK方法

热门文章

  1. Mysql使用大全(MySQL架构与存储引擎 、事务 、业务设计 、索引 、数据结构 、执行计划 、数值类型)
  2. Windows 10 安装 Anaconda3 GPU版Tensorflow Cuda9 cudnn7
  3. IO Active将工业机器人变为“杀手”,以警示各大机器人公司
  4. 互联网金融大事件,从泛亚到e租宝敲响的警示钟?
  5. SNA中心论的相关概念
  6. Windows环境下视频文件转成RTSP视频流和RTMP流
  7. 树莓派 CM4 启动时 GPIO口输出
  8. Nuist ACM集训队寒假训练计划
  9. 第一次亲密接触IT技术(第一天)
  10. 高中教学有计算机课吗,谈高中信息技术课教学