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.pswp.cn/news/904334.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904334.shtml
英文地址,請注明出處:http://en.pswp.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;主…