【STM32-HAL】 SPI通信與Flash數據寫入實戰

文章目錄

  • 1.參考教程
  • 2. 4種時間模式
  • 3. 3個編程接口
    • 3.1 `HAL_StatusTypeDef HAL_SPI_Transmit(...)` :
      • 3.1.1 參數說明
      • 3.1.2 例子
    • 3.2 `HAL_StatusTypeDef HAL_SPI_Receive(...)` :
      • 3.2.1參數說明
      • 3.2.2 例子
    • 3.3 `HAL_StatusTypeDef HAL_SPI_TransmitReceive(...)` :
      • 3.3.1 參數說明
      • 3.3.2 例子
  • 4. spi應用-flash數據寫入
    • 4.1 flash數據寫入過程
    • 4.2 流程
    • 5. 流程實現
      • 5.1 寫使能
      • 5.2 扇區擦除
      • 5.3 頁編程
    • 6. 代碼實現
  • 5. spi應用-flash數據加載
    • 5.1 流程
    • 5.2 代碼實現

1.參考教程

[STM32 HAL庫][SPI]外部flash實驗
[STM32 HAL庫][SPI]外部flash數據存取

2. 4種時間模式

在這里插入圖片描述

3. 3個編程接口

3.1 HAL_StatusTypeDef HAL_SPI_Transmit(...)

用于通過 SPI 總線發送數據,返回 HAL_StatusTypeDef 類型狀態值 ,作用為“發送”。

HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi,uint8_t *pData,uint16_t Size,uint32_t Timeout)

3.1.1 參數說明

參數名說明
hspi填寫 SPI 句柄的指針
pData填寫要發送的數據
Size填寫要發送的數據的數量,以字節為單位
Timeout超時時間,單位是 ms;HAL_MAX_DELAY 表示無限長的超時時間

3.1.2 例子

在這里插入圖片描述

  • 通信場景:主機(單片機)向從機1發送數據 0x5a, 0x33
  • 硬件連接:涉及主機與從機的 MOSI(主機輸出從機輸入)、MISO(主機輸入從機輸出 ,從機1此處未動作 )、SCK(時鐘 )、NSS(從機選擇 ,NSS1 選中從機1 )引腳
  • 代碼邏輯
    • 定義發送數據數組 uint8_t dataToSend[] = {0x5a, 0x33};
    • 通過 HAL_GPIO_WritePin 函數拉低引腳選中從機1
    • 調用 HAL_SPI_Transmit 函數發送數據
    • 數據發送后,通過 HAL_GPIO_WritePin 函數拉高引腳取消選中從機1

3.2 HAL_StatusTypeDef HAL_SPI_Receive(...)

用于通過 SPI 總線接收數據,返回 HAL_StatusTypeDef 類型狀態值 ,作用為“接收”。

HAL_StatusTypeDef HAL_SPI_Receive(&hspi1, uint8_t *pData, uint16_t Size, uint32_t Timeout)

3.2.1參數說明

參數名說明
參數hspi填寫SPI句柄的指針
參數pData填寫接收緩沖區
參數Size填寫要發送的數據的數量,以字節為單位
參數Timeout超時時間,單位是ms;HAL_MAX_DELAY表示無限長的超時時間

3.2.2 例子

在這里插入圖片描述

  1. 功能描述:從從機1接收2個字節的數據
  2. 硬件連接:主機(單片機)與從機1通過MOSI、MISO、SCK、NSS1引腳連接,從機還有從機2、從機3,引腳連接邏輯同從機1
  3. 代碼邏輯
    • 定義接收緩沖區 uint8_t dataRcvd[] = {0xff, 0xff};
    • 通過 HAL_GPIO_WritePin(..., GPIO_PIN_RESET); 函數拉低引腳選中從機1
    • 調用 HAL_SPI_Receive(&hspi1, dataRcvd, 2, HAL_MAX_DELAY); 函數,參數含SPI句柄 &hspi1、接收緩沖區 dataRcvd、數據長度 2(字節)、超時時間 HAL_MAX_DELAY(無限超時 )
    • 數據接收后,通過 HAL_GPIO_WritePin(..., GPIO_PIN_SET); 函數拉高引腳取消選中從機1
  4. 時序圖:展示NSS1(低電平選中 )、SCK(時鐘信號 )、MOSI(發送 0xff0xff 波形 )、MISO(接收 0x1f0x27 波形 )的時序關系 ,呈現SPI接收數據時各信號的變化 。

3.3 HAL_StatusTypeDef HAL_SPI_TransmitReceive(...)

用于通過 SPI 總線同時進行發送和接收數據操作,返回 HAL_StatusTypeDef 類型狀態值 ,作用為“發送同時接收”。

HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)

發送數據的同時接收數據

3.3.1 參數說明

參數名說明
參數hspi填寫SPI句柄的指針
參數pTxData填寫要發送的數據
參數pRxData填寫接收數據緩沖區
參數Size發送數據的數量=接收數據的數量,以字節為單位
參數Timeout超時時間,單位是ms

3.3.2 例子

在這里插入圖片描述

  1. 功能描述:發送 {0x5a, 0x33} ,同時接收 2 個字節數據
  2. 硬件連接:主機(單片機)與從機 1 通過 MOSI(主機輸出從機輸入 )、MISO(主機輸入從機輸出 )、SCK(時鐘 )、NSS1(從機選擇 )引腳連接,從機還有從機 2、從機 3 ,引腳連接邏輯同從機 1
  3. 代碼邏輯
    • 定義發送數據數組 uint8_t txData[] = {0x5a, 0x33};
    • 定義接收緩沖區 uint8_t rxData[2];
    • 通過 HAL_GPIO_WritePin(..., GPIO_PIN_RESET); 函數拉低引腳選中從機 1
    • 調用 HAL_SPI_TransmitReceive(&hspi1, txData, rxData, 2, HAL_MAX_DELAY); 函數,參數含 SPI 句柄 &hspi1、發送數據數組 txData、接收緩沖區 rxData、數據長度 2(字節)、超時時間 HAL_MAX_DELAY(無限超時 )
    • 數據收發后,通過 HAL_GPIO_WritePin(..., GPIO_PIN_SET); 函數拉高引腳取消選中從機 1
  4. 時序圖:展示 NSS1(低電平選中 )、SCK(時鐘信號 )、MOSI(發送 0x5a0x33 波形 )、MISO(接收 0x1f0x27 波形 )的時序關系 ,呈現 SPI 同時收發數據時各信號的變化 。

4. spi應用-flash數據寫入

4.1 flash數據寫入過程

在這里插入圖片描述

4.2 流程

在這里插入圖片描述

5. 流程實現

5.1 寫使能

抽水機的寫使能是發送0x06
在這里插入圖片描述

5.2 扇區擦除

扇區擦除的指令碼是0x20,所以首先發送0x20,后面接著24位的扇區首地址

在這里插入圖片描述

5.3 頁編程

頁編程指令碼是0x02,后面跟著24位地址(往哪里寫地址就發誰的地址),再后面是發要寫入的數據,一次性可以寫多個數據
在這里插入圖片描述

6. 代碼實現

static void SaveLEDState(uint8_t ledState)
{// #1. 寫使能uint8_t writeEnableCmd[] = {0x06};HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);HAL_SPI_Transmit(&hspi1, writeEnableCmd, 1, HAL_MAX_DELAY);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);// #2. 扇區擦除uint8_t sectorErase[] = {0x20, 0x00, 0x00, 0x00};HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);HAL_SPI_Transmit(&hspi1, sectorErase, 4, HAL_MAX_DELAY);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);HAL_Delay(100);// #3. 寫使能HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);HAL_SPI_Transmit(&hspi1, writeEnableCmd, 1, HAL_MAX_DELAY);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);// #4. 頁編程uint8_t pageProgCmd[5];//要發送5個字節pageProgCmd[0] = 0x02; //頁編程指令碼是0x02pageProgCmd[1] = 0x00; //地址pageProgCmd[2] = 0x00; //地址pageProgCmd[3] = 0x00; //地址pageProgCmd[4] = ledState; //要發送的數據HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, pageProgCmd, 5, HAL_MAX_DELAY);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); HAL_Delay(10); }

在主函數寫上 SaveLEDState( ledState);就可以保存燈的狀態數據。

5. spi應用-flash數據加載

5.1 流程

讀取數據的指令碼是0x03,先發0x03,后面跟24位地址,再往后從總線上讀取數據。
首先聲明數組,用于存放要發送的數據。先發送讀取命令,然后接收數據。最后返回讀取的數據。
在這里插入圖片描述

5.2 代碼實現

// 函數:讀取LED狀態(從Flash等存儲設備)
// 功能:通過SPI總線發送讀命令,接收并返回存儲的LED狀態數據
static uint8_t LoadLEDState(void)
{// 讀命令及地址:0x03為讀數據指令,后三個0x00為起始地址uint8_t readDataCmd[] = {0x03, 0x00, 0x00, 0x00}; uint8_t ledState; // 用于存儲讀取到的LED狀態數據// 選通從設備:拉低GPIOA_PIN_4(SPI從設備片選信號)HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 通過SPI發送讀命令:向從設備發送讀數據指令及地址,長度4字節,無限超時等待HAL_SPI_Transmit(&hspi1, readDataCmd, 4, HAL_MAX_DELAY); // 通過SPI接收數據:從從設備接收1字節數據(LED狀態),存入ledState,無限超時等待HAL_SPI_Receive(&hspi1, &ledState, 1, HAL_MAX_DELAY); // 取消選通:拉高GPIOA_PIN_4,釋放從設備片選HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); return ledState; // 返回讀取到的LED狀態
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94146.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SNR-Aware Low-light Image Enhancement 論文閱讀

信噪比感知的低光照圖像增強 摘要 本文提出了一種新的低光照圖像增強解決方案,通過聯合利用信噪比(SNR)感知的變換器(transformer)和卷積模型,以空間變化的操作方式動態增強像素。對于極低信噪比&#xff0…

在 Vue3 中使用 Mammoth.js(在 Web 應用中預覽 Word 文檔)的詳解、常見場景、常見問題及最佳解決方案的綜合指南

一、Mammoth.js 簡介與核心功能 Mammoth.js 是一個專用于將 .docx 文檔轉換為 HTML 的庫,適用于在 Web 應用中預覽 Word 文檔。其核心特點包括: 語義化轉換:基于文檔樣式(如標題、段落)生成簡潔的 HTML 結構,忽略復雜樣式(如居中、首行縮進)。 輕量高效:適用于需要快…

2025 年 VSCode 插件離線下載硬核攻略

微軟 2025 年起關閉 VSCode 官方市場 .vsix 文件直接下載入口,給企業內網開發者帶來極大不便。不過別擔心,今天提供一個下載.vsix文件地址。 VSC插件下載 (dreamsoul.cn) 下載好的.vsix文件后,打開vscode的應用,選擇右上角...打開&#xff…

[leetcode] 位運算

位運算這類題目奇思妙招很多,優化方法更是非常考驗經驗積累。 常用小技能: bit_count():返回整數的二進制表示中1的個數,e.g. x 7 x.bit_count() # 32.bit_length():返回整數的二進制表示的長度,e.g. …

關于assert()函數,eval()函數,include

一.assert()函數例子assert("strpos($file, ..) false") or die("Detected hacking attempt!");assert("file_exists($file)") or die("That file doesnt exist!");第一個是會檢驗$file是否有.. ,如果有strpos會返回true&…

ICT模擬零件測試方法--電位器測試

ICT模擬零件測試方法–電位器測試 文章目錄ICT模擬零件測試方法--電位器測試電位器測試電位器測試配置電位器測試配置電位器測試注意事項電位器測量選項電位器測試 電位器測試測量從 0.1 歐姆到 10M 歐姆的電阻。 本節介紹: 電位器測試配置電位器測試注意事項電位…

wsl2使用宿主機網絡方法

在Windows的資源管理器的地址欄輸入: %UserProfile% ,即可打開當前用戶的主目錄,創建文件: .wslconfig 輸入[experimental]networkingModemirroredautoProxytrue之后重啟WSL 管理員身份運行PowerShell: 停止WSL&#x…

當Windows遠程桌面出現“身份驗證錯誤。要求的函數不受支持”的問題

當Windows遠程桌面出現“身份驗證錯誤。要求的函數不受支持”的問題時,可以參考以下方法解決:修改組策略設置適用于Windows專業版、企業版等有組策略編輯器的系統。1. 按下WinR組合鍵,輸入“gpedit.msc”,打開本地組策略編輯器。2…

零售新范式:開源AI大模型、AI智能名片與S2B2C商城小程序源碼驅動下的圈層滲透革命

摘要:在消費圈層化與渠道碎片化的雙重沖擊下,傳統零售渠道的"廣撒網"模式逐漸失效。阿里巴巴零售通、京東新通路、國美Plus等零售巨頭通過技術賦能重構小店生態,但其本質仍停留于供應鏈效率提升層面。本文創新性提出"開源AI大…

電池自動生產線:科技賦能下的高效制造新范式

在當今科技飛速發展的時代,電池作為眾多電子設備和新能源產業的核心部件,其生產效率與質量至關重要。電池自動生產線的出現,猶如一場及時雨,為電池制造行業帶來了全新的變革與發展機遇。自動化流程,開啟高效生產之門傳…

CS224n:Word Vectors and Word Senses(二)

目錄 一、共現矩陣 1.1 基于共現矩陣的詞向量 二、SVD分解 2.1 基于共現矩陣的詞向量 vs. Word2Vec詞向量 三、GloVe詞向量 3.1 GloVe詞向量的好處 3.2 GloVe的一些結果展示 部分筆記來源參考 Beyond Tokens - 知乎 (zhihu.com) NLP教程(1) - 詞向量、SVD分解與Word2V…

I Built an Offline-Capable App by Myself: React Native Frontend, C# Backend

This isn’t a story about gluing together a few UI components. It’s about how I, as a solo developer, built a complete mobile application that works offline, syncs data automatically when online, and shares a unified backend with a web-based admin panel. …

在Idea中,配置maven

? 哈嘍,屏幕前的每一位開發者朋友,你們好呀!?? 當你點開這篇文章時,或許正對著 IDE 里閃爍的光標發呆,或許剛解決一個卡了三天的 bug,正端著咖啡松口氣 —— 不管此刻的你在經歷什么,都想先和…

mac 字體遍歷demo

文章目錄邏輯字體類頭文件實現文件使用文件主程序CMakeLists文件腳本文件邏輯字體類 #ifndef LOGICAL_FONT_H #define LOGICAL_FONT_H#include <string> #include <memory> #include <CoreText/CoreText.h> #include <CoreFoundation/CoreFoundation.h&g…

2025牛客多校第六場 D.漂亮矩陣 K.最大gcd C.棧 L.最小括號串 個人題解

L.最小括號串 #數組操作 #貪心 題目 思路 感謝Leratiomyces大佬賽時的提示&#xff0c;否則估計還一直簽不了到&#xff08;&#xff09; 首先&#xff0c;貪心地構造出最優情況&#xff1a;數組左半部分全是(&#xff0c;右半部分全是)&#xff0c;隨后通過判斷給定的區間…

Ubuntu搭建PX4無人機仿真環境(5) —— 仿真環境搭建(以Ubuntu 22.04,ROS2 Humble 為例)

目錄前言1. 準備下載源碼方式一&#xff1a;方式二&#xff1a;安裝依賴安裝 Gazebo2. 安裝 Micro XRCE-DDS Agent3. 編譯4. 通信5. offboard 測試參考前言 本教程基于 ROS2 &#xff0c;在搭建之前&#xff0c;需要把 ROS2、QGC 等基礎環境安裝配置完成。但是這塊的資料相比較…

自動駕駛中的傳感器技術11——Camera(2)

1、自駕Camera關鍵技術點匯總 ADAS Camera 關鍵技術點摘選&#xff08;IEEE-P2020工作組&#xff09;如下&#xff1a; Ref &#xff1a; 5. IEEE 相關標準 - 圖像質量與色彩技術知識庫 https://www.image-engineering.de/content/library/white_paper/P2020_white_paper.pd…

福彩雙色球第2025088期籃球號碼分析

蔡楚門福彩雙色球第2025088期籃球號碼分析&#xff0c;上期開出籃球號碼數字08&#xff0c;數字形式是合數偶數2路球數字&#xff0c;小號區域&#xff0c;0字頭數字。本期籃球號碼分析&#xff0c;4尾數0414遺漏9期上次遺漏11期&#xff0c;2尾數0212遺漏4期上次遺漏27期&…

【兆易創新】單片機GD32F103C8T6系列入門資料

GD32F103xx 系列器件是一款基于ARM Cortex-M3 RISC內核的32位通用微控制器&#xff0c;在處理能力、降低功耗和外設方面具有超優的性價比。Cortex-M3是下一代處理器核心&#xff0c;它與嵌套矢量中斷控制器(NVIC)&#xff0c; SysTick計時器和高級調試支持緊密耦合。 GD32F103…

高效輕量的C++ HTTP服務:cpp-httplib使用指南

文章目錄httplib介紹與安裝使用案例httplib介紹與安裝 C HTTP 庫&#xff08;cpp-httplib&#xff09;是一個輕量級的 C HTTP 客戶端/服務器庫&#xff0c;它提供了簡單的 API 來創建 HTTP 服務器和客戶端&#xff0c;支持同步和異步操作。以下是一些關于cpp-httplib 的主要特…