STM32 + CubeMX + 硬件SPI + W5500 +TcpClient

  这篇文章记录一下STM32+W5500+TCP_Client的调试过程,实现TCP客户端数据的接收与发送。

目录

  • 一、W5500模块介绍
  • 二、Stm32CubeMx配置
  • 三、Keil代码编写
    • 1、添加W5500驱动代码到工程(添加方法不赘述,驱动代码可以在官网找)
    • 2、在工程中增加代码
      • (1)MyTcpClient.h
      • (2)MyTcpClient.c
    • 3、修改CubeMx已生成的代码
      • (1)main.c
  • 四、硬件连接
  • 五、运行效果

一、W5500模块介绍

(后面补上)

二、Stm32CubeMx配置

1、RCC开启外部高速时钟(略)
2、配置STLink调试口(略)
3、配置串口方便调试输出(略)
4、配置工程名、生成路径,之后生成工程(略)
(1-4步的基础配置可以参考前面的文章《STM32基础工程模板创建》)
5、SPI 配置,配置PA4为CS片选引脚
在这里插入图片描述
6、配置PB4为W5500的RST引脚,PB5为INT引脚
在这里插入图片描述

三、Keil代码编写

1、添加W5500驱动代码到工程(添加方法不赘述,驱动代码可以在官网找)

2、在工程中增加代码

(1)MyTcpClient.h

#ifndef MYTCPCLIENT_H
#define MYTCPCLIENT_H
#include "main.h"
#include "w5500.h"
#include "socket.h"
#include "wizchip_conf.h"
#include "spi.h"
#include <string.h>  // memcmp
#define SOCK_TCPS  0
extern  uint8_t buff[128];   //定义缓冲区   
extern uint8_t TCP_send_buff[128];   //定义UDP发送缓冲区                                            
extern uint8_t remote_ip[4]; //远程IP地址
extern uint16_t remote_port; //远程端口号void TcpClientInit(void);
void do_tcp_client(void);
void Analysis(uint8_t *buf);
#endif // MYTCPCLIENT_H

(2)MyTcpClient.c

#include "MyTcpClient.h"
#include "main.h"
#include "w5500.h"
#include "socket.h"
#include "wizchip_conf.h"
#include "spi.h"
#include <string.h>  // memcmpuint8_t buff[128];  
uint8_t TCP_send_buff[128]; uint8_t remote_ip[4] = {192, 168, 1, 2}; //远程IP地址
uint16_t remote_port = 5002; //远程端口号//片选
void W5500_Select(void) {HAL_GPIO_WritePin(W5500_CS_GPIO_Port, W5500_CS_Pin, GPIO_PIN_RESET);
}
void W5500_Unselect(void) {HAL_GPIO_WritePin(W5500_CS_GPIO_Port, W5500_CS_Pin, GPIO_PIN_SET);
}
void W5500_Restart(void) {HAL_GPIO_WritePin(W5500_RST_GPIO_Port, W5500_RST_Pin, GPIO_PIN_RESET);HAL_Delay(1);  // delay 1msHAL_GPIO_WritePin(W5500_RST_GPIO_Port, W5500_RST_Pin, GPIO_PIN_SET);HAL_Delay(1600);  // delay 1600ms
}void W5500_ReadBuff(uint8_t* buff, uint16_t len) {HAL_SPI_Receive(&hspi1, buff, len, HAL_MAX_DELAY);
}void W5500_WriteBuff(uint8_t* buff, uint16_t len) {HAL_SPI_Transmit(&hspi1, buff, len, HAL_MAX_DELAY);
}uint8_t W5500_ReadByte(void) {uint8_t byte;W5500_ReadBuff(&byte, sizeof(byte));return byte;
}void W5500_WriteByte(uint8_t byte) {W5500_WriteBuff(&byte, sizeof(byte));
}//配置W5500网络信息
wiz_NetInfo gSetNetInfo = {.mac  = {0x00, 0x08, 0xdc, 0x11, 0x11, 0x11},.ip   = {192, 168, 1, 10},.sn   = {255, 255, 255, 0},.gw   = {192, 168, 1, 1},.dns  = {144, 144, 144, 144},.dhcp = NETINFO_STATIC};wiz_NetInfo gGetNetInfo;enum Status
{Failed = 0,Success = 1
};/*** @brief valid the result of set net info* @return 1: Success*         0: Failed
*/
uint8_t validSetNetInfoResult(wiz_NetInfo* _set, wiz_NetInfo* _get)
{return (!memcmp(_set, _get, sizeof(wiz_NetInfo)));  // if same, memcmp return 0
}void TcpClientInit(void)
{reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit);	//注册临界区函数reg_wizchip_cs_cbfunc(W5500_Select, W5500_Unselect);reg_wizchip_spi_cbfunc(W5500_ReadByte, W5500_WriteByte);W5500_Restart();  // hardware restart through RESET pinctlnetwork(CN_SET_NETINFO, (void*)&gSetNetInfo);  // set net info// maybe need delayctlnetwork(CN_GET_NETINFO, (void*)&gGetNetInfo);  // get net info// W5500 has 8 channel, 32k buffer, 2 means 2KBytesuint8_t buffer_size_8channel_tx_rx[16] = {2, 2, 2, 2, 2, 2, 2, 2,  // 8 channel tx2, 2, 2, 2, 2, 2, 2, 2}; // 8 channel rxif(ctlwizchip(CW_INIT_WIZCHIP,(void*)buffer_size_8channel_tx_rx)){// failed}uint8_t sta = getSn_SR(SOCK_TCPS);if(sta == SOCK_CLOSED){socket(SOCK_TCPS, Sn_MR_TCP, 5001, 0x00);}HAL_Delay(100);}void do_tcp_client(void)
{uint16_t len=0;switch(getSn_SR(SOCK_TCPS))														// 获取socket0的状态{case SOCK_INIT:															// Socket处于初始化完成(打开)状态	connect(SOCK_TCPS,remote_ip,remote_port);break;case SOCK_ESTABLISHED:											// Socket处于连接建立状态if(getSn_IR(SOCK_TCPS) & Sn_IR_CON)   					{setSn_IR(SOCK_TCPS, Sn_IR_CON);								// Sn_IR的CON位置1,通知W5500连接已建立}// 数据回环测试程序:数据从上位机服务器发给W5500,W5500接收到数据后再回给服务器len=getSn_RX_RSR(SOCK_TCPS);										// len=Socket0接收缓存中已接收和保存的数据大小					if(len){recv(SOCK_TCPS,buff,len);		send(SOCK_TCPS,buff,len);							}											break;case SOCK_CLOSE_WAIT:												  // Socket处于等待关闭状态disconnect(SOCK_TCPS);	break;case SOCK_CLOSED:														// Socket处于关闭状态socket(SOCK_TCPS,Sn_MR_TCP,5001,0x00);		// 打开Socket0,打开一个本地端口break;}
}//分析数据
void Analysis(uint8_t *buf)
{}

3、修改CubeMx已生成的代码

(1)main.c

#include <stdio.h>
#include "MyTcpClient.h"int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();MX_SPI1_Init();UDPinit();while (1){do_tcp_client();}
}

四、硬件连接

STM32开发板W5500模块
5V5V
GNDGND
PA4SCS
PA6MISO
PA5SCK
PA7MOSI
PB4RST
PB5INT

五、运行效果

(1)、将W5500和电脑通过网线直连
(2)、将电脑IP配置为192.168.1.2
(3)、ping 192.168.1.10(W5500的IP),能ping通。再使用网络调试助手给192.186.1.10的5001端口发送数据,之后网络调试助手能收到返回的数据。
在这里插入图片描述

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

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

相关文章

微信小程序中,点击视频,没有跳转播放,可能是因为没有在app.json中正确注册视频播放页面的路径

const customMethodMap {handlePreview(e) {const { item: { url } } e?.currentTarget?.datasetconsole.log(Clicked item URL:, url); // 输出URLconst type url.split(.)[url.split(.)?.length - 1]console.log(File type:, type); // 输出文件类型console.log(isDoc(…

软件体系结构

第一章 构件 具有某种功能的 可复用的软件结构单元,为组装服务,可部署,具有规范的接口规约和显式的语境依赖 构件模型 构件模型是对构件本质特征的抽象描述&#xff0c;可以把它想象成一个类的组合&#xff0c;它封装了多个类&#xff0c;并具有一个或多个服务而提供了简单…

什么是垃圾回收(Garbage Collection)?

垃圾回收&#xff08;Garbage Collection&#xff09;是一种自动管理内存的机制&#xff0c;在编程语言中&#xff0c;它负责自动检测和释放不再被程序使用的内存&#xff0c;以避免内存泄漏和内存碎片的问题。 以下是一段示例代码&#xff1a; public class Example {public…

Spark 的Standalone集群环境安装与测试

目录 一、Standalone 集群环境安装 &#xff08;一&#xff09;理解 Standalone 集群架构 &#xff08;二&#xff09;Standalone 集群部署 二、打开监控界面 &#xff08;一&#xff09;master监控界面 &#xff08;二&#xff09;日志服务监控界面 三、集群的测试 &a…

react的antd-mobile使用Steps显示物流

antd-mobile的图标&#xff0c;是需要安装依赖的 step如果只有一个步骤是不会展示的&#xff0c;代码里面的标题那块可以看出来 尝试了很多遍测试发现一直不显示&#xff0c;查询后发现是这个组件的本身设置的原因 那么就算你只展示一个那么也要写两个step&#xff0c;第二个…

基于鸟类AI识别的果园智能物联网解决方案

1. 项目背景 我国拥有广阔的果园种植面积&#xff0c;但每年因鸟类造成的损失高达数亿元。传统的防鸟害措施&#xff0c;如建立防护网和使用物理化学方法&#xff0c;效果并不理想&#xff0c;且成本较高。为了解决这一问题&#xff0c;深圳快瞳科技有限公司的提出基于鸟类AI识…

uniapp 使用vue/pwa

vue add vue/pwa src下创建service-worker.js /* eslint-disable no-undef*/ importScripts(https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-sw.js) if (workbox) {console.log(Yay! Workbox is loaded &#x1f389;) } else {console.log(Boo! Workbo…

Java 实现接口幂等的九种方法:确保系统稳定性与数据一致性

摘要&#xff1a; 在分布式系统中&#xff0c;接口的幂等性至关重要&#xff0c;它能确保重复请求不会导致意外的副作用。本文深入探讨了 Java 实现接口幂等的九种方法&#xff0c;包括数据库唯一约束、状态机、分布式锁等&#xff0c;并通过详细的代码示例和实际应用场景&…

让Erupt框架支持.vue文件做自定义页面模版

Erupt是什么&#xff1f; Erupt 是一个低代码 全栈类 框架&#xff0c;它使用 Java 注解 动态生成页面以及增、删、改、查、权限控制等后台功能。 零前端代码、零 CURD、自动建表&#xff0c;仅需 一个类文件 简洁的注解配置&#xff0c;快速开发企业级 Admin 管理后台。 提…

如何优雅处理异常?处理异常的原则

前言 在我们日常工作中&#xff0c;经常会遇到一些异常&#xff0c;比如&#xff1a;NullPointerException、NumberFormatException、ClassCastException等等。 那么问题来了&#xff0c;我们该如何处理异常&#xff0c;让代码变得更优雅呢&#xff1f; 1 不要忽略异常 不知…

OCR与PaddleOCR介绍

OCR技术与PaddleOCR的介绍 在数字化时代&#xff0c;光学字符识别&#xff08;OCR&#xff0c;Optical Character Recognition&#xff09;技术变得越来越重要。OCR技术可以将图像中的文本转换为可编辑和可搜索的文本格式&#xff0c;广泛应用于文档数字化、自动化数据输入、车…

DBAPI连接阿里云 maxcompute 报错

使用正确的驱动包 访问以下链接寻找驱动包 https://github.com/aliyun/aliyun-odps-jdbc/releases/tag/v3.4.3 注意要使用odps-jdbc-3.4.3-jar-with-dependencies.jar &#xff0c;这个是完整的jar包 不要使用odps-jdbc-3.4.3.jar&#xff0c;这个不是完整的&#xff0c;它还…

2024最新Python安装教程+Pycharm安装教程【附安装包】

Python安装 1.首先下载好Python安装包 获取方式&#xff1a;点击这里&#xff08;扫描神秘②薇码免下载&#xff09;完全免费&#xff01;&#xff01;&#xff01; 2.打开安装包&#xff0c;先勾选最下面两个选项&#xff0c;再选择第二个自定义安装 3.这里默认全选&#xff…

Fatal error: Uncaught Error: Call to undefined function mysql_connect() 解决办法详细

情况一 Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /www/wwwroot/www.ygwzjs.cn/dg_upload/class/db_sql.php:72 Stack trace: #0 /www/wwwroot/www.ygwzjs.cn/dg_upload/class/combakfun.php(192): do_dbconnect_common(localhost, , guiz…

【数据库】elasticsearch

1、架构 es会为每个索引创建一定数量的主分片和副本分片。 分片&#xff08;Shard&#xff09;&#xff1a; 将索引数据分割成多个部分&#xff0c;每个部分都是一个独立的索引。 主要目的是实现数据的分布式存储和并行处理&#xff0c;从而提高系统的扩展性和性能。 在创建索…

Oracle 第19章:高级查询技术

在Oracle数据库中&#xff0c;高级查询技术是数据库管理员和开发人员必须掌握的重要技能。这些技术能够帮助优化查询性能&#xff0c;简化复杂的查询逻辑&#xff0c;并提高数据处理的效率。本章将重点讨论两个关键概念&#xff1a;子查询和连接与并集操作。 子查询 定义: 子…

JAVA基础:数组 (习题笔记)

一&#xff0c;编码题 1&#xff0c;数组查找操作&#xff1a;定义一个长度为10 的一维字符串数组&#xff0c;在每一个元素存放一个单词&#xff1b;然后运行时从命令行输入一个单词&#xff0c;程序判断数组是否包含有这个单词&#xff0c;包含这个单词就打印出“Yes”&…

pytoch单卡改多卡ddp训练

参考&#xff1a;https://blog.csdn.net/weixin_44966641/article/details/121872773 单卡代码&#xff0c;启动代码 python train.py&#xff1a; import torch import torch.nn as nn from torch.optim import SGD from torch.autograd import Variable from torch.utils.da…

【学习】使用webpack搭建react项目

前言 在日常工作中&#xff0c;我大多是在已有的项目基础上进行开发&#xff0c;而非从头构建项目。因此&#xff0c;我期望通过本次学习能填补我在项目初始化阶段知识的空白&#xff0c;与大家共同进步。在此过程中&#xff0c;我欢迎并感激任何指正或建议&#xff0c;无论是…

什么是人工智能体?

人工智能体&#xff08;AI Agent&#xff09;是指能够感知环境、做出决策并采取行动以实现特定目标的自主实体。以下是对人工智能体的具体介绍&#xff1a; 定义与核心概念 智能体的定义&#xff1a;智能体&#xff0c;英文名为Agent&#xff0c;是指具有智能的实体&#xff0…