STM32高级 以太网通讯案例1:网络搭建(register代码)

需求描述

驱动W5500芯片,设置好IP,测试网络是否连通。

思考:

驱动W5500芯片是通过spi协议,所以和spi相关的有四个引脚,MOSI(主出从入)MISO(主入从出)SCK(时钟线)CS(片选线)。RST(复位引脚,对于32来说是输出)INT(中断引脚对于32来说是输入)。

 W5500-RST:重置硬件,重置(Reset)低电平有效;该引脚需要保持低电平至少500us,才能重置W5500;(正常使用应该高电平,需要重置芯片的时候置为低电平不少500us)。连接的是PG7。

W5500-INT:中断输出(Interrupt output),低电平有效。低电平,W5500的中断生效;高电平,无中断。连接的是PG6。

W5500-CS片选引脚。连接的是PD3

W5500与STM32使用SPI协议进行通讯,连接的是STM32的SPI2外设。 

第一步:导入文件(官方库、SPI、自己驱动的主文件)

W5500有官方库:导入以太网文件夹下的W5500、socket.c、socket.h、wizchip_conf.c、wizchip_conf.h文件,        放入Interface下的Ethernet文件下。

SPI:spi.c和spi.h(之前的spi文件)        文件放入Handware(驱动层)下。

自己驱动的主文件:新建eth.c和eth.h        放入Interface下的Ethernet文件下。

第二步:配置spi.h文件

宏定义的高低引脚要换成PD3

第三步:配置wizchip_conf.h文件

75行----改变当前使用芯片信号

153行---选择VDM,选择可变长度模式

61行---引入spi.h

第四步:配置wizchip_conf.c文件

里面许多函数的空实现

名词:

        Cris:Critical region临界区-指的是共享的资源

        enter:进入

        exit:退出

        select:选择

83行:片选使能        CS_LOW

91行:取消片选        CS_HIGH

最后一行自定义函数,注册spi操作的回调函数,记得.h引入原型

void user_register_function(void)
{reg_wizchip_cris_cbfunc(wizchip_cris_enter,wizchip_cris_exit);reg_wizchip_cs_cbfunc(wizchip_cs_select,wizchip_cs_deselect);reg_wizchip_spi_cbfunc(wizchip_spi_readbyte,wizchip_spi_writebyte);
}

第五步:配置spi.c文件

按照上面思考的图片修改初始化函数中的各种引脚。

第六步:书写eth.h和eth.c文件

eth.h

#ifndef __ETH_H__
#define __ETH_H__#include "w5500.h"//初始化
void ETH_Init(void);#endif /* __ETH_H__ */

eth.c

#include "eth.h"
#include "delay.h"// 定义W5500的IP地址、MAC地址、子网掩码和网关地址
uint8_t ip[4] = {192,168,44,250};
uint8_t mac[6] = {78,11,22,33,44,55};
uint8_t submask[4] = {255,255,255,0};
uint8_t gateway[4] = {192,168,44,1};// 复位W5500
static void ETH_Reset(void);
// 设置 MAC 地址
static void ETH_SetMac(void);
// 设置 IP 地址(包括网关和子网掩码)
static void ETH_SetIP(void);// 初始化
void ETH_Init(void)
{// 0. SPI 初始化SPI_Init();// 1. 注册自定义回调函数user_register_function();// 2. 复位W5500ETH_Reset();// 3. 设置 MAC 地址ETH_SetMac();// 4. 设置 IP 地址(包括网关和子网掩码)ETH_SetIP();
}// 复位W5500
static void ETH_Reset(void)
{// 1. 配置RST引脚-PG7// 1.1 开启时钟RCC->APB2ENR |= RCC_APB2ENR_IOPGEN;// 1.2 设置工作模式:通用推挽输出,MODE - 11,CNF - 00GPIOG->CRL |= GPIO_CRL_MODE7;GPIOG->CRL &= ~GPIO_CRL_CNF7;// 2. 拉低RST,保持500us以上GPIOG->ODR &= ~GPIO_ODR_ODR7;Delay_us(800);GPIOG->ODR |= GPIO_ODR_ODR7;printf("W5500 复位完成!\n");
}// 设置 MAC 地址
static void ETH_SetMac(void)
{printf("开始设置 MAC 地址:\n");setSHAR(mac);printf("MAC 地址设置完成: %X-%X-%X-%X-%X-%X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}// 设置 IP 地址(包括网关和子网掩码)
static void ETH_SetIP(void)
{printf("开始设置 IP 地址:\n");// 设置IPsetSIPR(ip);// 设置子网掩码setSUBR(submask);// 设置网关地址setGAR(gateway);printf("IP 地址设置完成: %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
}

spi.h

#ifndef __SPI_H__
#define __SPI_H__#include "stm32f10x.h"#define CS_HIGH (GPIOD->ODR |= GPIO_ODR_ODR3)
#define CS_LOW (GPIOD->ODR &= ~ GPIO_ODR_ODR3)void SPI_Init(void);void SPI_Start(void);void SPI_Stop(void);uint8_t SPI_SwapByte(uint8_t byte);#endif /* __SPI_H__ */

spi.c

#include "spi.h"void SPI_Init(void){// 1. GPIOB// 1.1 先放时钟RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;// 1.2 PA5 时钟 复用推挽GPIOB->CRH &= ~GPIO_CRH_CNF13;GPIOB->CRH |= GPIO_CRH_CNF13_1;GPIOB->CRH |= GPIO_CRH_MODE13;// 1.3 PA6 输入信号 浮空输入GPIOB->CRH &= ~GPIO_CRH_CNF14_1;GPIOB->CRH |= GPIO_CRH_CNF14_0;GPIOB->CRH &= ~GPIO_CRH_MODE14;// 1.4 PA7 数据输出 复用推挽GPIOB->CRH &= ~GPIO_CRH_CNF15_0;GPIOB->CRH |= GPIO_CRH_CNF15_1;GPIOB->CRH |= GPIO_CRH_MODE15;// 2. GPIOC// 2.1 放GPIOD的时钟RCC->APB2ENR |= RCC_APB2ENR_IOPDEN;CS_HIGH;// 2.2. PC13 片选使能信号 通用推挽GPIOD->CRL &= ~GPIO_CRL_CNF3;GPIOD->CRL |= GPIO_CRL_MODE3;//配置硬件SPI//0.1放时钟RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;//0.2 设置DFF位来定义8位或者16位数据格式 当前8位SPI2->CR1 &= ~SPI_CR1_DFF;//0.3 设置高位优先SPI2->CR1 &= ~SPI_CR1_LSBFIRST;//0.4 工作模式为主模式SPI2->CR1 |= SPI_CR1_MSTR;//0.5 波特率的配置 APB2 72M 如果是 000 就是2分频 36MSPI2->CR1 &= ~SPI_CR1_BR;//0.6 mode0 模式SPI2->CR1 &= ~SPI_CR1_CPOL;SPI2->CR1 &= ~SPI_CR1_CPHA;//0.7 SSOE 配0 这样的话 会关闭SS引脚的输出 同时 会被迫进入//多主模式(NSS 会变成一个输入引脚)SPI2->CR2 &= ~SPI_CR2_SSOE;//0.8 NSS 进入软件模式//          SSM 配1 那就是NSS信号 由SSI位来决定SPI2->CR1 |= SPI_CR1_SSM;//          SSI 配1 再多主模式里 一直处于可通讯状态SPI2->CR1 |= SPI_CR1_SSI; // 使能位SPI2->CR1 |= SPI_CR1_SPE;
}void SPI_Start(void){CS_LOW; 
}void SPI_Stop(void){CS_HIGH;
}uint8_t SPI_SwapByte(uint8_t byte){while (!(SPI2->SR & SPI_SR_TXE)){}SPI2->DR = byte;while (!(SPI2->SR & SPI_SR_RXNE)){}uint8_t receive_byte = SPI2->DR;return receive_byte;
}

main.c

#include "usart1.h"
#include "eth.h"int main(void)
{// 1. 初始化Usart1_Init();printf("尚硅谷以太网实验:测试网络搭建\n");ETH_Init();printf("\n以太网初始化完成!\n");while (1){}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497286.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解VHDL如何编写Testbench

1.概述 仿真测试平台文件(Testbench)是可以用来验证所设计的硬件模型正确性的 VHDL模型,它为所测试的元件提供了激励信号,可以以波形的方式显示仿真结果或把测试结果存储到文件中。这里所说的激励信号可以直接集成在测试平台文件中,也可以从…

【数据结构】单链表的使用

单链表的使用 1、基本概念2、链表的分类3、链表的基本操作a、单链表节点设计b、单链表初始化c、单链表增删节点**节点头插:****节点尾插:****新节点插入指定节点后:**节点删除: d、单链表修改节点e、单链表遍历,并打印…

浅谈某平台多场景下反爬虫与风控业务

文章目录 1. 写在前面2. 内容反爬3. 账号风控3. 接口验签 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

如何在网页端使用 IDE 高效地阅读 GitHub 源码?

如何在网页端使用 IDE 高效地阅读 GitHub 源码? 前言什么是 GitHub1s?使用 GitHub1s 阅读 browser-use 项目源码步骤 1: 打开 GitHub 项目页面步骤 2: 修改 URL 使用 GitHub1s步骤 3: 浏览文件结构步骤 4: 使用代码高亮和智能补全功能步骤 5: 快速跳转和…

Web Bluetooth API 开发记录

搞了一天的蓝牙串口协议被几个软件和AI带沟里面去了。 1.00001101-0000-1000-8000-00805f9b34fb 是spp协议。但是我用的称是使用的49535343-fe7d-4ae5-8fa9-9fafd205e455蓝牙低功耗spp协议 2.推荐一款软件Android-nRF-Connect github地址:https://github.com/Nor…

使用VS Code开发ThinkPHP项目

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 ThinkPHP 8开发环境安装-CSDN博客 安装ThinkPHP项目的IDE 常用的集成开发环境(IDE)包括P…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

Windows上缺少xaudio2_9.dll是什么原因?

一、文件丢失问题:Windows上缺少xaudio2_9.dll是什么原因? xaudio2_9.dll是DirectX音频处理库的一个组件,它支持游戏中的音频处理功能。当你在Windows系统上运行某些游戏或音频软件时,如果系统提示缺少xaudio2_9.dll文件&#xf…

缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布

近期,JuiceFS 企业版推出了 Cache Group Operator,用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具,它能够自动化应用程序的生命周期管理任务,使部署、扩展和运维更加高效。 在推出 Operator 之前…

SCSA:探索空间与通道注意力之间的协同效应

文章目录 摘要1 引言2 相关工作2.1 多语义空间信息2.2 注意力分解 3 方法3.1 共享多语义空间注意力:空间与通道分解3.2 渐进式通道自注意力3.3 协同效应3.4 注意力机制的整合 4 实验4.1 实验设置4.2 图像分类4.3 目标检测4.4 分割4.5 消融研究 5 可视化与分析5.1 注…

Grok 2.0:马斯克的大模型挑战ChatGPT,AI竞争再升级

引言:马斯克Grok 2.0的横空出世 在人工智能(AI)领域,竞争从未停止。随着大型语言模型(LLM)的快速发展,各大科技巨头纷纷推出自己的AI模型,试图在激烈的竞争中占据领先地位。最近&am…

基于Spring Boot的宠物领养系统的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领…

安卓15预置第三方apk时签名报错问题解决

有同事反馈集成apk时安装失败 PackageManager: Failed to scan /product/app/test: No APK Signature Scheme v2 signature in package /product/app/test/test.apk 查看编译后的apk签名信息 DOES NOT VERIFY ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.SF indi…

从0入门自主空中机器人-2-1【无人机硬件框架】

关于本课程: 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让…

实现某海外大型车企(T)Cabin Wi-Fi 需求的概述 - 4

大家好,我是Q,邮箱:1042484520qq.com。 今天我们在上几讲的基础上再扩展下 Cabin Wi-Fi 的功能需求,讲讲如何使能 5G TCU Wi-Fi STA Bridge 模式。 参考: 实现某海外大型车企(T)Cabin Wi-Fi 需求…

2024 年最新 windows 操作系统搭建部署 nginx 服务器应用详细教程(更新中)

nginx 服务器概述 Nginx 是一款高性能的 HTTP 和 反向代理 服务器,同时是一个 IMAP / POP3 / SMTP 代理服务器。Nginx 凭借其高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。 浏览 nginx 官网:https://nginx.org/ Nginx 应用场景 静态…

C 实现植物大战僵尸(二)

C 实现植物大战僵尸(二) 前文链接,C 实现植物大战僵尸(一) 五 制作启动菜单 启动菜单函数 void startUI() {IMAGE imageBg, imgMenu1, imgMenu2;loadimage(&imageBg, "res/menu.png");loadimage(&am…

Android笔记(四十一):TabLayout内的tab不滚动问题

背景 假设二级页面是上面图片的布局,当进来时TabLayout和ViewPager2绑定完就马上调setCustomItem,跳转到最后一个tab页面时,会发现tab不滚动,手动滑一下ViewPager2时才会滚动tab到正确的位置 原因分析 调用TabLayoutMediator.at…

域内的三种委派方式

域委派:使得上游服务能使用用户凭据访问下游服务,使得下游服务根据域用户判断权限,例如: web 用户 hack ---------------访问------------------> web 服务器 ( www-data 域服务账户运行)-------------…

GEE云计算、多源遥感、高光谱遥感技术蓝碳储量估算;红树林植被指数计算及提取

大气温室气体浓度不断增加,导致气候变暖加剧,随之会引发一系列气象、生态和环境灾害。如何降低温室气体浓度和应对气候变化已成为全球关注的焦点。海洋是地球上最大的“碳库”,“蓝碳”即海洋活动以及海洋生物(特别是红树林、盐沼和海草&…