STM32 SPI實戰篇:驅動W25Q64 Flash存儲器的技巧與方法

摘要

在嵌入式系統開發中,非易失性存儲是必不可少的一部分。W25Q64作為SPI Flash存儲器的一種,以其較高的存儲密度和擦寫次數受到廣泛應用。本文將深入探討STM32通過SPI驅動W25Q64的實戰技巧和方法,包括硬件連接、SPI配置、讀寫操作,以及實際代碼示例。

1. SPI通信基礎

SPI是一種串行通信協議,其特點包括:

  • 同步通信:數據傳輸由時鐘信號控制。
  • 主從模式:一個主設備控制多個從設備。
  • 全雙工:可以同時發送和接收數據。

2. W25Q64 Flash存儲器特性

W25Q64是一款8Mbit的SPI Flash存儲器,主要特性包括:

  • 容量:8Mbit,相當于1MB。
  • 組織:分為128個扇區,每個扇區包含16頁,每頁256字節。
  • 接口:SPI。
  • 擦寫次數:高達100萬次。

3. 硬件連接

W25Q64與STM32的硬件連接如下:

  • CS(片選)連接到STM32 GPIO(如PA4)。
  • SCK(時鐘)連接到STM32 SPI時鐘引腳(如PA5)。
  • MOSI(數據發送)連接到STM32 SPI數據發送引腳(如PA7)。
  • MISO(數據接收)連接到STM32 SPI數據接收引腳(如PA6)。
  • VCC連接到3.3V。
  • GND連接到地。

4. SPI配置

4.1 SPI初始化

SPI初始化是SPI通信的第一步,需要配置SPI的工作模式、數據大小、時鐘極性、時鐘相位等。

void SPI_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI1, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_Init(SPI1, &SPI_InitStructure);SPI_Cmd(SPI1, ENABLE);
}

5. W25Q64操作

5.1 W25Q64初始化

W25Q64初始化主要包括SPI初始化和片選信號的配置。

void W25Q64_Init(void) {SPI_Init(); // 初始化SPI// 其他W25Q64特定初始化代碼...
}
5.2 讀取W25Q64 ID

讀取W25Q64的ID是一個簡單的操作,可以用來驗證設備是否連接正確。

uint16_t W25Q64_ReadID(void) {uint16_t id = 0;SPI_CS_Low(); // 選中W25Q64SPI_SendByte(0x90); // 發送讀ID指令id = SPI_ReceiveByte() << 8; // 接收高字節id |= SPI_ReceiveByte(); // 接收低字節SPI_CS_High(); // 取消選中W25Q64return id;
}
5.3 寫入W25Q64

寫入W25Q64之前,需要先發送寫使能指令,然后執行頁編程。

void W25Q64_WriteByte(uint32_t addr, uint8_t data) {SPI_CS_Low(); // 選中W25Q64SPI_SendByte(0x06); // 發送寫使能指令SPI_SendByte(0x02); // 發送頁編程指令SPI_SendByte(addr >> 16); // 發送地址高字節SPI_SendByte(addr >> 8);  // 發送地址中字節SPI_SendByte(addr);       // 發送地址低字節SPI_SendByte(data);       // 發送數據SPI_CS_High(); // 取消選中W25Q64// 等待寫入完成...
}
5.4 從W25Q64讀取數據

從W25Q64讀取數據是一個直接的過程,通過發送讀數據指令和地址即可。

uint8_t W25Q64_ReadByte(uint32_t addr) {uint8_t data;SPI_CS_Low(); // 選中W25Q64SPI_SendByte(0x03); // 發送讀數據指令SPI_SendByte(addr >> 16); // 發送地址高字節SPI_SendByte(addr >> 8);  // 發送地址中字節SPI_SendByte(addr);       // 發送地址低字節data = SPI_ReceiveByte(); // 接收數據SPI_CS_High(); // 取消選中W25Q64return data;
}

6. 完整示例代碼

以下是STM32通過SPI讀寫W25Q64的完整示例代碼。

int main(void) {// 系統初始化SystemInit();// 初始化W25Q64W25Q64_Init();// 讀取W25Q64 IDuint16_t id = W25Q64_ReadID();printf("W25Q64 ID: 0x%X\r\n", id);// 測試寫入和讀取uint32_t testAddr = 0x000000; // 測試地址uint8_t testData = 0xAA;       // 測試數據W25Q64_WriteByte(testAddr, testData); // 寫入數據// 延遲一段時間,等待數據寫入完成for (volatile int i = 0; i < 0x100000; i++);// 讀取數據uint8_t readData = W25Q64_ReadByte(testAddr);if (readData == testData) {printf("Write and Read Test Passed.\r\n");} else {printf("Write and Read Test Failed.\r\n");}while(1) {// 其他應用代碼}
}

7. 結論

本文詳細介紹了STM32通過SPI接口驅動W25Q64 Flash存儲器的實戰技巧和方法。通過硬件連接、SPI配置、讀寫操作的詳細步驟和代碼示例,讀者可以快速掌握SPI通信的實現,并能夠應用到自己的項目中。在實際開發中,根據具體的硬件配置和需求進行適當的調整和優化。

?作者簡介:熱愛科研的嵌入式開發者,修心和技術同步精進

?歡迎關注我的知乎:對error視而不見

代碼獲取、問題探討及文章轉載可私信。

? 愿你的生命中有夠多的云翳,來造就一個美麗的黃昏。

🍎獲取更多嵌入式資料可點擊鏈接進群領取,謝謝支持!👇

點擊領取更多詳細資料

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

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

相關文章

競賽選題 python+深度學習+opencv實現植物識別算法系統

0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度學習的植物識別算法研究與實現 &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) 難度系數&#xff1a;4分工作量&#xff1a;4分創新點&#xff1a;4分 &#x1f9ff; 更多…

基于Java微信小程序自駕游拼團設計和實現(源碼+LW+調試文檔+講解等)

&#x1f497;博主介紹&#xff1a;?全網粉絲10W,CSDN作者、博客專家、全棧領域優質創作者&#xff0c;博客之星、平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰?&#x1f497; &#x1f31f;文末獲取源碼數據庫&#x1f31f;感興趣的可以先收藏起來&#xff0c;還…

27. 高級特性(下)

目錄 一、為了類型安全和抽象而使用 newtype 模式二、使用類型別名創建類型同義詞2.1 使用type關鍵賦予現有類型一個別名2.2 減少重復2.3 與Result<T, E>結合使用2.4 從不返回的 never type 三、高級函數和閉包3.1 函數指針3.2 返回閉包 四、宏4.1 宏和函數的區別4.2 mac…

python基礎語法 003-3 數據類型元組

1 元組 1.1 元組含義 1.1.1 元組的表示 #元組的表示方法:() names ("xiaoyun", "xiaoming") print(names)--結果------- (xiaoyun, xiaoming) 1.1.2 空元組 #空元組 names () print(type(names)) print(len(names))----------------結果--------- &l…

安裝vue開發者工具

瀏覽器控制臺提示&#xff1a; 打開網址 GitHub - vuejs/devtools: ?? Browser devtools extension for debugging Vue.js applications. 點擊添加 上圖地址&#xff1a;Installation | Vue Devtools 安裝好了

Spring Boot中如何使用Flyway進行數據庫版本控制

Spring Boot中如何使用Flyway進行數據庫版本控制 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;在現代的軟件開發中&#xff0c;數據庫版本控制是保證應用程序…

群體優化算法---石墨烯優化算法介紹以及在期權定價上的應用(Black-Scholes模型來計算歐式期權的理論價格)

介紹 石墨烯算法是一種新興的優化算法&#xff0c;靈感來自于石墨烯的結構和特性。石墨烯是一種由碳原子構成的二維蜂窩狀晶格結構&#xff0c;具有優異的機械、電學和熱學性能。石墨烯算法通過模擬石墨烯原子之間的相互作用和遷移&#xff0c;來求解復雜的優化問題 基本概念…

K8S -理解StatefulSet - 部署有狀態應用

什么是 有狀態服務和 無狀態服務 有狀態服務&#xff08;Stateful Service&#xff09;&#xff1a; 有狀態服務是指在處理請求期間維護和跟蹤用戶狀態或會話信息的服務。這意味著服務在多個請求之間保持狀態&#xff0c;并且需要在請求之間共享和使用這些狀態信息。通常&…

Websocket在Java中的實踐——握手攔截器

在《Websocket在Java中的實踐——最小可行案例》一文中&#xff0c;我們看到如何用最簡單的方式實現Websocket通信。本文中&#xff0c;我們將介紹如何在握手前后進行干涉&#xff0c;以定制一些特殊需求。 在《Websocket在Java中的實踐——最小可行案例》的基礎上&#xff0c;…

PID原理及控制算法詳解

文章目錄 1. 概念 1.1 PID框圖 1.2 具體示例&#xff1a;無人機高度控制 2. PID原理 3. 常用術語 4. 計算過程 4.1 比例控制&#xff08;Proportional&#xff09; 4.2 積分控制&#xff08;Integral&#xff09; 4.3 微分控制&#xff08;Derivative&#xff09; 5.…

windows@文件高級共享設置@網絡發現功能@從資源管理器網絡中訪問遠程桌面

文章目錄 高級共享設置常用選項其他選項操作界面說明 網絡類型檢查和設置(專用網絡和公用網絡)&#x1f47a;Note 高級共享設置和防火墻&#x1f47a;命令行方式使用圖形界面方式配置 網絡發現網絡發現功能的詳細介紹網絡發現的作用&#x1f47a;網絡發現的工作原理啟用和配置網…

SOC和SOH聯合估計 | 基于集成ELM的鋰離子電池充電截止電壓下的SOC和SOH聯合估計

目錄 研究概述研究內容研究路線研究介紹研究概述 充電截止電壓是大多數電動汽車用戶充電都會經歷的電壓點。針對傳統安時積分法忽略初始容量誤差和電池老化等一系列待優化的問題,提出了雙層集成極限學習機(extreme learning machine, ELM)算法,實現鋰離子電池充電截止電壓下…

【Python實戰因果推斷】2_因果效應異質性2

目錄 CATE with Regression Evaluating CATE Predictions CATE with Regression 我想你可能已經預料到了&#xff1a;與應用因果推理中的大多數情況一樣&#xff0c;答案往往從線性回歸開始。但在走這條路之前&#xff0c;讓我們把事情變得更具體一些。假設你在一家遍布全國的…

[A133]uboot啟動流程

[A133]uboot啟動流程 hongxi.zhu 2024-6-21 1. 第一階段 lds描述 從u-boot.lds中能找到程序的匯編入口ENTRY(_start) brandy/brandy-2.0/u-boot-2018/u-boot.lds OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUT…

Spring Boot中的異步編程技巧

Spring Boot中的異步編程技巧 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討在Spring Boot應用程序中如何使用異步編程技巧&#xff0c;以提升性…

LeetCode題練習與總結:單詞拆分--139

一、題目描述 給你一個字符串 s 和一個字符串列表 wordDict 作為字典。如果可以利用字典中出現的一個或多個單詞拼接出 s 則返回 true。 注意&#xff1a;不要求字典中出現的單詞全部都使用&#xff0c;并且字典中的單詞可以重復使用。 示例 1&#xff1a; 輸入: s "l…

vant組件 頂部下拉刷新和頁面底部下拉獲取數據+頂部搜索框

1.html部分&#xff08;頂部tab切換無&#xff0c;只有主體list部分&#xff09; <div class"yd" ><!-- yd端 --><!-- 搜索框 --><van-searchv-model"ydsearchvalue"show-actionplaceholder"請輸入搜索關鍵詞"search"…

JavaEE之HTTP協議(1)_HTTP基礎知識,HTTP 請求、響應格式,方法,狀態碼

一、HTTP協議 1.1 基本概念: HTTP全稱超文本傳輸協議&#xff0c;是一種無狀態的、應用層的協議&#xff0c;它基于請求/響應模型。客戶端&#xff08;通常是Web瀏覽器&#xff09;通過發送HTTP請求到服務器來獲取或發送信息&#xff0c;服務器則返回HTTP響應作為回應。HTTP協…

shell (三)shell腳本

SHELL腳本 編程語言的分類 解釋型語言&#xff1a;shell&#xff0c;Python&#xff0c;需要解析器 編譯型語言&#xff1a;C語言&#xff0c;C&#xff0c;需要編譯器 shell腳本 操作系統的結構 shell&#xff08;貝殼&#xff09; 應用層 app&#xff0c;代碼 應用層需要通…

2024年軟件測試面試題大全【答案+文檔】

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 一、面試基礎題 簡述測試流程&#xff1a; 1、閱讀相關技術文檔&#xff08;如產品PRD、UI設計…