GD32F470+CH395Q

第一步:资料下载

以太网协议栈芯片 CH395 - 南京沁恒微电子股份有限公司

第二步:准备工程

(1) 首先准备一个编译无报错、可以正常打印和延时的工程文件,官方例程采用STM32F1芯片,但本文采用GD32F470芯片

(2)将例程代码中的PUB文件夹加入,keil工程添加CH395CMD.c文件和CH395SPI_HW.c文件

(3)将例程代码中的main.c内容全部加入到自己的main.c文件中,如果觉得函数较多,可以自己放置到CH398CMD.c函数中

(4)例程代码使用SPI_DMA,看个人需要,使用则配置,不使用则屏蔽

(5)此时编译有很多错误,继续下一步

第三步:引脚配置

ch395Q支持SPI和串口通信,本文采用SPI通信,我们需要配置6个GPIO口,分别如下

一、SPI通信基础引脚

  1. CS(片选引脚)
    • 功能:用于使能CH395的SPI通信,低电平有效。
    • 配置:需连接到STM32的GPIO引脚,并在代码中控制其电平12。
  2. SCK(时钟引脚)
    • 功能:提供SPI通信的时钟信号,由主设备(如STM32)控制。
    • 配置:需连接到STM32的SPI外设时钟线(如SPI1_SCK),并设置时钟频率(如36MHz)13。
  3. MOSI(主出从入引脚)
    • 功能:主设备向CH395发送数据。
    • 配置:需连接到STM32的SPI外设MOSI线(如SPI1_MOSI)
  4. MISO(主入从出引脚)
    • 功能:CH395向主设备返回数据。
    • 配置:需连接到STM32的SPI外设MISO线(如SPI1_MISO)

二、辅助控制引脚

  1. INT(中断引脚)
    • 功能:用于CH395通知主设备事件(如数据接收完成、错误状态)。
    • 配置:需连接到STM32的外部中断引脚(如PA0),并设置为输入模式,同时启用中断服务程序14。
  2. RST(复位引脚)
    • 功能:硬件复位CH395,低电平有效。
    • 配置:需连接到STM32的GPIO引脚,初始化时拉低再拉高以完成复位
CH395_PORT_INIT();//SPI初始化
CH395_GPIO_INIT();//RST和INT引脚初始化
CH395Reset();//修改RST对应引脚
xCH395CmdStart();//修改CS对应引脚,CMD_START_HANDEL();可以删除,无作用
xEndCH395Cmd();//修改CS对应引脚,CMD_END_HANDEL();可以删除,无作用

第四步:延时函数配置

例程代码使用debug.c文件中配置的延时函数,本文采用自定义函数,或者直接全文替换 

void Delay_Us(uint32_t us)
{us *= 168;  // 72MHz下1us≈72个周期(每条循环指令约3周期)while (us--) {__NOP();  // 内联汇编NOP指令 }
}void Delay_Ms(uint32_t ms)
{delay_1ms(ms);
}

第五步:编译

此处编译后肯定会多处报错,比如UINT8没有定义,stm32f10x_dma.h文件找不到等等,这些都是正常的,按照自己的经验进行修改即可,直到编译无警告,无报错

第六步:ip修改

InitCH395InfParam() /* CH395 Related definition */
const uint8_t CH395IPAddr[4] = {192, 168, 1, 101}; /* CH395 IP  */
const uint8_t CH395GWIPAddr[4] = {192, 168, 1, 1}; /* CH395 gateway */
const uint8_t CH395IPMask[4] = {255, 255, 255, 0}; /* CH395 mask *//* Socket definitions */
const uint8_t Socket0DesIP[4] = {192, 168, 1, 123}; /* Destination IP address for Socket 0 */
const uint16_t Socket0DesPort = 1000;               /* Destination port for Socket 0 */
const uint16_t Socket0SourPort = 5000;              /* Source port for Socket 0 */

第七步:查看保活机制

keeplive_set()#define DEF_KEEP_LIVE_IDLE (15 * 1000)   /* Idle time */
#define DEF_KEEP_LIVE_PERIOD (20 * 1000) /* Send a KEEPALIVE packet every 20 seconds */
#define DEF_KEEP_LIVE_CNT 200            /* Number of retry attempts */DEF_KEEP_LIVE_IDLE:空闲时间,可能指的是在TCP连接建立后,如果在15秒内没有数据传输,则开始发送保活包。这与TCP的保活机制中的空闲时间类似,用于确定何时开始检测连接是否有效。
DEF_KEEP_LIVE_PERIOD:每隔20秒发送一次保活包。这个参数可能控制保活包的发送频率,确保在空闲期间定期检测连接状态。
DEF_KEEP_LIVE_CNT:重试次数200次。当保活包发送后未收到响应时,会进行重试,这个参数指定最大重试次数,超过后认为连接已断开。
  • 保活机制主要用于维持TCP连接的活跃状态,防止因网络中断或空闲导致连接被中间设备(如路由器、防火墙)主动断开
  • 应对网络环境不稳定:在工业控制、远程监控等场景中,网络可能因电磁干扰、信号衰减等问题出现瞬时中断。保活机制通过周期性发送心跳包(空数据包),可快速检测链路异常并触发重连,避免数据丢失。
  • 支持物联网长连接需求:CH395常用于MQTT、HTTP长连接等物联网协议,需保持设备与服务器持续通信。若长时间无数据传输,服务器或网关可能关闭连接,保活包能维持连接有效性

第八步:全局中断

 CH395GlobalInterrupt  --》  GINT_STAT_SOCK0

针对一个TCP连接,主要有以下几个中断

void CH395SocketInterrupt(uint8_t sockindex)
{sock_int_status[sockindex] |= CH395CMDGetSocketInt(sockindex); /* Gets the socket interrupt status */if (sock_int_status[sockindex] & SINT_STAT_RECV) /* Receive interruption */{//接收中断,接受到数据后会进来这里,但例程代码在Data_Loop函数中处理// Handle it in the main program}if (sock_int_status[sockindex] & SINT_STAT_SENDBUF_FREE) /* The send buffer is free and can continue writing data to be sent */{//发送缓冲区为空,可以发送数据,但例程代码在Data_Loop函数中处理// Handle it in the main program}if (sock_int_status[sockindex] & SINT_STAT_SEND_OK) /* Send completion interrupt */{//发送完成中断sock_int_status[sockindex] &= ~SINT_STAT_SEND_OK;}if (sock_int_status[sockindex] & SINT_STAT_CONNECT) /* The connection is interrupted, valid only in TCP mode */{//连接成功中断sock_int_status[sockindex] &= ~SINT_STAT_CONNECT;CH395CMDSetKeepLive(sockindex, 1); /* Enable the KEEPALIVE timer */LOG("SINT_STAT_CONNECT\r\n");}if (sock_int_status[sockindex] & SINT_STAT_DISCONNECT) /* Disconnect interrupt, valid only in TCP mode */{//断开连接中断sock_int_status[sockindex] &= ~SINT_STAT_DISCONNECT;LOG("SINT_STAT_DISCONNECT \r\n");}if (sock_int_status[sockindex] & SINT_STAT_TIM_OUT) /* Timeout interrupt, valid only in TCP mode */{//连接超时中断,比如服务器未打开sock_int_status[sockindex] &= ~SINT_STAT_TIM_OUT;LOG("SINT_STAT_TIM_OUT\r\n");}
}

Data_Loop函数,主要就是将接收到的数据发出去

第九步:测试

调试心得 

(1)当服务器主动关闭连接时,会进入TIME_WAIT状态(持续2*MSL,默认约60秒),导致原端口暂时无法复用,如果服务器没有做端口复用这个功能,可能会出现这个现象

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

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

相关文章

Linux 怎么使用局域网内电脑的网络访问外部

一次性 export http_proxy"http://192.168.0.188:7890" export https_proxy"http://192.168.0.188:7890"一直生效 写入 ~/.bashrc(或 ~/.bash_profile) nano ~/.bashrc加入这一行: export http_proxy"http://19…

Mysql进阶篇1_存储引擎、索引、SQL性能分析指令

文章目录 1.存储引擎InnoDBMyISAMMemory存储引擎选择和对比 2.索引索引结构索引分类索引语法索引使用(建议看完第3节后观看)!!!mysql如何使用索引查询数据(个人理解) 3.SQL性能分析SQL执行频率慢…

LeetCode 热题 100 118. 杨辉三角

LeetCode 热题 100 | 118. 杨辉三角 大家好,今天我们来解决一道经典的算法题——杨辉三角。这道题在 LeetCode 上被标记为简单难度,要求生成杨辉三角的前 numRows 行。杨辉三角是一个经典的组合数学问题,每一行的数字都是其正上方和正左上方…

修改或禁用Cursor的全局搜索默认快捷键

在 Cursor 中,默认情况下 双击 Shift 会打开 全局搜索(Quick Open),类似于 VS Code 的 CtrlP 功能。如果你想修改或禁用这个快捷键,可以按照以下步骤操作: 1. 打开快捷键设置 方法 1:按下 Ctrl…

HarmonyOS Device Connector(hdc)

它是为开发人员提供的用于调试的命令行工具,通过该工具可以在windows/linux/mac系统上与设备进行交互。 hdc分为三部分: client:运行在电脑端的进程,开发者在执行hdc命令时启动该进程,命令结束后进程退出。 server&…

开源PDF解析工具Marker深度解析

开源PDF解析工具Marker深度解析 检索增强生成(RAG)系统的第一步就是做 pdf 解析,从复杂多样的 pdf 中提取出干净准确的文本内容。现有的最优秀的开源工具有两个:Marker 和 MinerU。因为 Marker 是个人开发者做的,文档…

ARM子程序调用与返回

子程序(也叫过程、函数、方法)是一个能被调用和执行并返回到调用点那条指令的代码 段。 两个问题:如何将参数传递给子程序或从子程序中传递出来?怎么从子程序返回到调用点? 指令BSR Proc_A调用子程序Proc_A。 处理器将…

算力经济模型推演:从中心化到去中心化算力市场的转变(区块链+智能合约的算力交易原型设计)

一、算力经济的历史脉络与范式转移 1.1 中心化算力市场的演进困境 传统算力市场以超算中心、云计算平台为核心载体,其运营模式呈现强中心化特征。中国移动构建的"四算融合"网络虽实现百万级服务器的智能调度,但动态资源分配仍受制于集中式控…

小结: 接口类型和路由优先级

网络接口类型 1. Bridge-if&#xff08;桥接接口&#xff09; 作用&#xff1a;用于桥接网络&#xff0c;将多个接口或VLAN连接为一个广播域&#xff0c;实现二层数据转发。 常用指令&#xff1a; interface bridge-if <number> bridge <bridge-id> # 将接口加入…

mysql一些事

一.联合查询/多表查询 联合查询关键在于笛卡尔积的过程 笛卡尔坐标积的排列组合 首先它会将两个表用排列组合的方式进行排列组合。 表一 表二 进行排列组合 我们发现它的行是 两个表的行相乘&#xff0c;列是两表的列相加。 我们所看到的数据有合理的也有不合理的我们接下…

【工具】Open WebUI:本地化部署的AI交互平台

文章目录 一、Open WebUI 简介二、核心功能详解1. 多模型与多模态支持2. 本地RAG与文档集成3. 开发与定制化能力4. 安全与权限管理5. 用户体验优化 三、安装与部署指南1. 快速安装方式2. 高级配置3. 常见问题 四、实际应用场景1. 个人隐私助手2. 企业知识库3. 学术研究4. 创意工…

AutoGPT

一、简介 是一个基于openAI研发的GPT4模型的一个开源应用程序&#xff0c;根据用户指定的目标&#xff0c;自动生成所需的提示&#xff0c;并且执行需要多个步骤才能完成的项目&#xff0c;整个过程不需要人类干预和指导&#xff08;无监督学习&#xff09;&#xff0c;生成式…

[C++] 小游戏 决战苍穹

大家好&#xff0c;各位看到这个标题&#xff0c;斗破苍穹什么时候改叫决战苍穹了&#xff1f;其实&#xff0c;因为版权等一系列问题&#xff0c;斗破苍穹正式改名为决战苍穹&#xff0c;这个版本主要更新内容为解决了皇冠竞技场太过影响游戏平衡&#xff0c;并且提高了一些装…

Spring的数据库编程

本内容采用最新SpringBoot3框架版本,视频观看地址:B站视频播放 1. JdbcTemplate概述 针对数据库操作,Spring框架提供了JdbcTemplate类,JdbcTemplate是一个模板类,Spring JDBC中的更高层次的抽象类均在JdbcTemplate模板类的基础上创建。 JdbcTemplate类提供了操作数据库…

Debezium MySqlValueConverters详解

Debezium MySqlValueConverters详解 1. 类的作用与功能 1.1 核心作用 MySqlValueConverters是Debezium中负责MySQL数据类型转换的核心类,主要功能包括: 数据类型映射:将MySQL的数据类型映射到Kafka Connect的Schema类型值转换:将MySQL的原始值转换为Kafka Connect可用的…

进程与线程:06 操作系统之“树”

操作系统核心知识回顾与思维训练 在之前的学习中&#xff0c;我们深入探讨了CPU管理相关内容。 CPU管理内容回顾&#xff1a;我们学习了CPU直观管理方法&#xff0c;了解如何让简单程序执行&#xff0c;分析了CPU效率低下的原因及处理办法&#xff0c;即实现多程序执行。接着…

Android Studio Profiler

1.我们想要查看自己方法的调用链&#xff0c;或者分析方法耗时的情况&#xff0c;可以选择Android Studio的Profiler&#xff0c;比较方便快捷。如下&#xff1a; 2.基本的面板参数讲解&#xff1a; 3.可以通过搜索&#xff0c;查看对应的方法&#xff0c;以及方法的调用链…

33、VS中提示“以下文件中的行尾不一致。是否将行尾标准化?“是什么意思?

在Visual Studio&#xff08;VS&#xff09;中遇到提示“以下文件中的行尾不一致。是否将行尾标准化&#xff1f;”时&#xff0c;意味着当前打开或正在编辑的文件内部存在行尾符&#xff08;EOL&#xff0c;End-Of-Line&#xff09;格式不统一的情况。以下是详细解释和应对建议…

头歌实验 库、表、数据的创建管理与备份迁移

第1关&#xff1a;创建db_ebank数据库 drop database IF EXISTS db_ebank;/********** Begin **********/ create database db_ebank; /********** End **********/show databases; 第2关&#xff1a;创建数据表并设置约束 1.任务要求 在 db_ebank 数据库中创建相应8个数据…

同城跑腿小程序帮取帮送接单抢单预约取件智能派单同城配送全开源运营版源码优创

一、源码描述 这是一套同城跑腿小程序&#xff0c;基于FastadminUniapp框架&#xff0c;全开源无加密&#xff0c;可私有化部署&#xff0c;包含用户端、骑手端和运营端&#xff08;后端&#xff09;&#xff0c;支持帮取/帮送模式&#xff0c;支持一键接单/抢单&#xff0c;主…