RT-Thread—STM32—enc28j60
!!! 本文已同步到码云 - 点击此链接获取最新 - 可进入码云提交修改 !!!
概述
本教程主要是讲解如何使用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相关推荐
- 正点原子delay函数移植到rt thread操作系统(HAL库)
正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS. 下面将delay.c函数移植到rt thread中,使用的bsp是rt t ...
- Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32
1.前言 [2014年4月重写该博文] 经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...
- LwIP学习笔记——STM32 ENC28J60移植与入门
0.前言 去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一详解个别 ...
- 关于RT thread系统节拍时钟的配置
关于RT thread系统节拍时钟的配置 -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...
- stm32f407单片机rt thread 片外spi flash OTA升级配置示例
参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...
- 使用RT Thread设备框架封装一个I2C设备——DS3231
使用RT Thread设备框架封装一个I2C设备--DS3231 前言 ENV配置 I2C测试 将ds3231封装成一个字符设备 结语 前言 学习rt thread的I2C的时候,恰巧手上的板子留了d ...
- STM32+enc28j60+uip 实现 单片机 ping PC端
STM32+enc28j60+uip 实现单片机 ping PC端 1. 前言 2. 实验简介 3. uip简介 4. icmp简介 4.1 icmp介绍 4.2 请求回显或回显应答报文格式介绍 5. ...
- rt thread studio使用QBOOT和片外flash实现OTA升级
我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...
- rt thread 使用FAL遇到fal_init() undefined reference
rt thread FAL 0.5版,之前有没有不知道,遇到一个坑. 在main.cpp里面已经 #include <fal.h> fal_init() 编译报错,说 fal_init() ...
- RT Thread Free Modbus移植问题整理
RT Thread Free Modbus移植问题整理 问题描述: 在读写寄存器中,写数据正常,只能读1个寄存器的值,多个值会异常. 在移植过程中发现串口(或RS485)数据接收长度异常. 一.环境描 ...
最新文章
- 阿里云华北区挂了。。。
- 对全局变量,static静态变量的理解
- ahjesus 获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome
- 基于html5 Canvas图表库 : ECharts
- 变分模态分解(VMD)-Python代码
- Java中的跨站请求伪造
- UIKit框架的介绍
- HDU 5442 (串的最大表示+KMP)
- wps html转换成pdf文件,wps怎么转换成pdf
- 美颜SDK多少钱一年?视频美颜SDK的价格由哪些因素影响?
- 运维工程师到底是个啥?
- AtCoder Beginner Contest 168 C~D题解
- 网页设计配色应用教程之各种色彩对比分析
- DataHub调研数据血缘
- java毕业设计宝马官网Mybatis+系统+数据库+调试部署
- 拿到大厂前端offer的前端开发是怎么回答面试题的
- 为什么土豆网王微会放弃自己原有的立场,跟优酷合并?合并后有何影响?
- linux p12 转 pem,p12转PEM供golang APNS使用
- TransmittableThreadLocal的简单使用 + 手写源码
- Unity配置安卓JDK方法
热门文章
- Mysql使用大全(MySQL架构与存储引擎 、事务 、业务设计 、索引 、数据结构 、执行计划 、数值类型)
- Windows 10 安装 Anaconda3 GPU版Tensorflow Cuda9 cudnn7
- IO Active将工业机器人变为“杀手”,以警示各大机器人公司
- 互联网金融大事件,从泛亚到e租宝敲响的警示钟?
- SNA中心论的相关概念
- Windows环境下视频文件转成RTSP视频流和RTMP流
- 树莓派 CM4 启动时 GPIO口输出
- Nuist ACM集训队寒假训练计划
- 第一次亲密接触IT技术(第一天)
- 高中教学有计算机课吗,谈高中信息技术课教学