色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32F10x_SPI (硬件接口 + 軟件模擬)讀寫Flash(25Q16)

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 2020-03-25 13:59 ? 次閱讀

Ⅰ、寫在前面

SPI(Serial Perripheral Interface)串行外設通信接口,主要實現設備(主從)之間的通信。硬件上由CS、SCK、MISO、MOSI四根通信線連接而成。關于SPI更多介紹不再詳細描述,本文主要以STM32F103為主機、W25Q16為從機進行SPI通信實驗。

本文將提供STM32硬件SPI、軟件模擬SPI兩實例工程代碼供大家參考、掌握兩種方式的區別。

STM32硬件SPI:控制簡單、運行效率高、使用方便等。

軟件模擬SPI:移植性強,只需要簡單修改接口,就能在其他MCU芯片(如:51、430等)上使用。

實例實驗效果:

兩個實例SPI通信控制方式不一樣,但實驗效果是一樣的。

W25Q16設備ID:

上電,讀取W25Q16設備ID,并通過串口打印出來;

寫數據:

SFLASH_WriteNByte((uint8_t*)"ABCDEF",0, 6); 通過該函數在W25Q16的0地址處 連續寫入6字節“ABCDEF”數據。(測試的時候:第一次下載之后讓程序運行一次,即寫入W25Q16數據。再將該函數屏蔽、下載。斷電重新讓程序運行看讀出來的數據是否是前面寫入的數據)

讀數據:

SFLASH_ReadNByte(read_buf,0, 6); 通過該函數從W25Q16的0地址連續讀取6字節數據,保存在read_buf里面。(地址、數據及數據長度都可以修改,但讀寫的地址要相同,讀出來的數據才是寫入的數據)

關于本文的更多詳情請往下看。

Ⅱ、實例工程下載

筆者針對于初學者提供的例程都是去掉了許多不必要的功能,精簡了官方的代碼,對初學者一看就明白,以簡單明了的工程供大家學習。

筆者提供的實例工程都是在板子上經過多次測試并沒有問題才上傳至360云盤,歡迎下載測試、參照學習。

提供下載的軟件工程是基于Keil(MDK-ARM) V5版本、STM32F103ZE芯片,但F1其他型號也適用(適用F1其他型號:關注微信,回復“修改型號”)。

STM32F10x_SPI(硬件接口)讀寫Flash(25Q16)實例源代碼工程:

https://yunpan.cn/c6mfRJWva6AJ2 訪問密碼 4bc4

STM32F10x_SPI(軟件模擬)讀寫Flash(25Q16)實例源代碼工程:

https://yunpan.cn/c6mf6zyzCaMwd 訪問密碼 cf45

STM32F1資料

https://yunpan.cn/crBUdUGdYKam2 訪問密碼 ca90

Ⅲ、STM32硬件SPI

STM32所有系列芯片都帶有SPI硬件控制器,根據芯片型號不同,SPI數量也不同,有些有一個SPI,有些有3個SPI。STM32的SPI控制器功能也是很強大的,只需要簡單的配置就能高效的進行SPI通信。

1.SPI原理


上面是SPI的系統框圖,來自STM32F1的參考手冊.

A.引腳

MOSI:主設備輸出/從設備輸入引腳。該引腳在主模式下發送數據,在從模式下接收數據。

MISO:主設備輸入/從設備輸出引腳。該引腳在從模式下發送數據,在主模式下接收數據。

SCK:串口時鐘,為通信提供時鐘。(作為主設備的輸出,從設備的輸入)。

NSS:從設備選擇。這是一個可選的引腳,用來選擇主/從設備。它的功能是用來作為“片選引腳”,讓主設備可以單獨地與特定從設備通訊,避免數據線上的沖突。

B.緩沖區SPI->DR

發送緩沖區:只要往SPI1->DR寫入數據,它自動將存入發送緩沖區,并執行發送操作。這就是高效的一點,而不像模擬SPI,還需要我們控制時鐘,控制MOSI引腳輸出高低電平。

接收緩沖區:原理和發送緩沖區差不多,只是這個是接收數據。接收滿了,才通知我們需要去讀取數據。

C.波特率發生器

STM32的硬件SPI還可以通過配置來控制通信的速度。

2.SPI引腳


該函數位于spi.c文件下面;

使用的SPI需與引腳對應,CS片選信號我們這里是通過普通IO來控制的,若不同請在spi.h里面修改為你開發板上的引腳。

3.SPI配置


該函數位于spi.c文件下面;

該函數是文章的重要一項,主要是對硬件SPI進行的一些初始化配置。

SPI為主模式,時鐘線平時為高,上升沿采集數據,8位數據格式,軟件控制片選,數據高位在前。

1.傳輸方向:SPI_Direction =SPI_Direction_2Lines_FullDuplex;

總共有四個方式:

兩線全雙工:SPI_Direction_2Lines_FullDuplex

兩線只接收:SPI_Direction_2Lines_RxOnly

單線只接收:SPI_Direction_1Line_Rx

單線只發送:SPI_Direction_1Line_Tx

2.模式:SPI_Mode = SPI_Mode_Master;

總共有兩種模式:

主機模式:SPI_Mode_Master

從機模式:SPI_Mode_Slave

3.數據:SPI_DataSize = SPI_DataSize_8b;

8位數據長度:SPI_DataSize_8b

16位數據長度:SPI_DataSize_16b

4.時鐘極性:SPI_CPOL = SPI_CPOL_High;

也就是我們平時不操作時,時鐘的電平。

低電平:SPI_CPOL_Low

高電平:SPI_CPOL_High

5.時鐘相位:SPI_CPHA = SPI_CPHA_2Edge;

也就是我們需要等多少個“時鐘”操作通信口MOSI、MISO。

1個時鐘:SPI_CPHA_1Edge

2個時鐘:SPI_CPHA_2Edge

6.片選信號:SPI_NSS = SPI_NSS_Soft;

也就是我們如果控制NSS片選引腳;

軟件控制:SPI_NSS_Soft

硬件控制:SPI_NSS_Hard

7.波特率(時鐘)分頻:SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;

也就是我們控制SPI通信的速率,和USART串口的波特率類似。

這里的參數有很多種,請見源代碼。

8.第一位傳輸數據:SPI_FirstBit = SPI_FirstBit_MSB;

在一根通信線上一字節(8Bit)數據分8次傳輸才能完成,這里是高位先傳輸,還是低位先傳輸的意思。

高位:SPI_FirstBit_MSB

低位:SPI_FirstBit_LSB

9.校驗:SPI_CRCPolynomial = 7;

校驗的數據位長度。

4.SPI讀寫數據


函數位于spi.c文件下面;

這兩個函數就是我們使用到的接口,在上面SPI配置好之后,操作這兩個函數就可以控制其引腳讀寫了。

這兩個函數就是我們上面說的“發送緩沖區”和“接收緩沖區”所需要使用到的部分。

這里需要注意:發送和接收數據都是通過SPI->DR寄存器,讀、寫操作會控制數據的流向。

Ⅳ、軟件模擬SPI

從51學習過來的朋友就應該知道,51的資源很少,沒有SPI硬件控制器,要想使用SPI通信方式,就需要使用IO口模擬的方式來實現SPI通信。只需要按照通信的時序就能控制其通信。

使用軟件模擬SPI通信有優點,也有缺點。

優點:移植很方便,代碼只需要簡單修改就可以使用在其他芯片上;

缺點:控制IO麻煩,對時序要求高;

1.模擬SPI引腳


該函數位于spi.c文件下面;

這個主要配置模擬SPI引腳。(如果你板子上使用的引腳不同,請修改spi.h文件的定義即可)

2.模擬SPI初始化


該函數位于spi.c文件下面;

這里初始化需要把狀態定好,不然第一次操作會有問題。

3.模擬SPI寫函數(時序)


該函數位于spi.c文件下面;

這種時序的寫法在學習過51的朋友來看再熟悉不過了。

注意:

1、高字節在前,說以上面紅色標記的的部分就是將高位先輸出,依次移位輸出。

2、在時鐘的上升沿將數據輸出,所以在“時鐘-高”之前將數據輸出。

4.模擬SPI讀函數(時序)


該函數位于spi.c文件下面;

讀時序和寫時序原理類似,但還是存在差異。

注意:

1、高位先輸出來(從機輸出),所以,需要將讀取的數據依次移向高位。

2、在時鐘的下降沿讀出數據,所以,我紅色標記的部分可以看得出來,是在時鐘為低之后才去讀取數據。

Ⅴ、修改代碼,適應開發板

看見這篇文章,你可能覺得芯片型號(STM32F103ZE)不是你的芯片芯片型號,硬件接口(SPI1)、(USART1)也不是板子上的接口,那怎么辦呢,其實很簡單,適當修改一下就行。

1.修改芯片型號

該工程適合STM32F1系列的所有芯片,只需要修改一下型號。修改芯片型號,可以看我的另外一篇文章:

如何將工程(修改來)運行在自己開發板上

當然,其他系列(F0、F2、F3、F4等)也可以使用該配置,但需要更換外設庫。

2.修改硬件接口

筆者提供的工程源代碼,在個人看來整理的還算比較整潔(名稱清晰、排版整齊、文件分類明確)、相比很多開發板賣家提供的例程來說,要好的多。所以,看了之后,你應該知道如何修改。

1、LED燈的IO,位于bsp.h下,修改為你的LED燈IO口就行了。

2、USART,本文是使用USART1,如果你使用USART2的話,需要usart.c文件下“USART_GPIO_Configuration”引腳配置、USART_Configuration串口配置、發送接收函數USART1 改為USART2等。

3、SPI接口

這個在上面講述中都提及了修改,就是修改spi.c和spi.h文件里面的配置。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FlaSh
    +關注

    關注

    10

    文章

    1635

    瀏覽量

    148080
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1707

    瀏覽量

    91627
  • STM32F10x
    +關注

    關注

    1

    文章

    81

    瀏覽量

    20696
收藏 人收藏

    評論

    相關推薦

    Air780E開發板SPI接口:實現W25Q64讀寫不是事兒!

    一直有人向我咨詢開發板的SPI接口,對W25Q64進行讀寫操作很難,今天我便做一個詳細解析,讓你下回覺得這都不是事兒。
    的頭像 發表于 11-02 11:56 ?402次閱讀
    Air780E開發板<b class='flag-5'>SPI</b><b class='flag-5'>接口</b>:實現W<b class='flag-5'>25Q</b>64<b class='flag-5'>讀寫</b>不是事兒!

    STM32CUBEMX(13)--SPI,W25Q128外部Flash移植

    開發板,這里我準備的是NUCLEO-F030R8的開發板: Flash就是淘寶上SPI接口的W25Q128模塊。 視頻教學 選擇芯片型
    發表于 09-30 14:41

    物聯網行業中Nor Flash軟件設計分享_W25Q128的軟件設計方案

    一 概述 W25Q128是一種NOR Flash芯片,掉電后數據不丟失的特點。 W25Q128FV陣列被組織成65,536個可編程頁面,每個頁面256字節。每次最多可編程256字節。可以以16
    的頭像 發表于 09-26 11:20 ?543次閱讀
    物聯網行業中Nor <b class='flag-5'>Flash</b>的<b class='flag-5'>軟件</b>設計分享_W<b class='flag-5'>25Q</b>128的<b class='flag-5'>軟件</b>設計方案

    STM32CUBEMX(10)--Flash讀寫

    概述 本例程主要講解如何對芯片自帶Flash進行讀寫,用芯片內部Flash可以對一些需要斷電保存的數據進行保存,無需加外部得存儲芯片,本例程采用的是STM32F030R8T6,64K大
    發表于 09-10 15:36

    【GD32 MCU 移植教程】9、從 STM32F10x 系列移植到 GD32F30x 系列

    GD32F30x 系列 MCU 是基于 Arm? Cortex?-M4 處理器的 32 位通用微控制器,與 STM32F10x 系列 MCU 保持高度兼容。本文主要從以下三個方面進行介紹:硬件資源
    的頭像 發表于 09-07 09:57 ?744次閱讀
    【GD32 MCU 移植教程】9、從 <b class='flag-5'>STM32F10x</b> 系列移植到 GD32<b class='flag-5'>F30x</b> 系列

    ESP32外部flashspi外設沖突怎么解決?

    硬件: ESP32 ,W25Q128 SPI顯示器 庫:IDF4.0.1 使用hspi掛載了外部16MB的W25Q128,并同時掛載了
    發表于 06-25 06:19

    【GD32F303紅楓派開發板使用手冊】第二十講 SPI-SPI NAND FLASH讀寫實驗

    通過本實驗主要學習以下內容: ?SPI通信協議,參考19.2.1東方紅開發板使用手冊 ?GD32F303 SPI操作方式,參考19.2.2東方紅開發板使用手冊 ?NAND FLASH
    的頭像 發表于 06-20 09:50 ?917次閱讀
    【GD32<b class='flag-5'>F</b>303紅楓派開發板使用手冊】第二十講 <b class='flag-5'>SPI-SPI</b> NAND <b class='flag-5'>FLASH</b><b class='flag-5'>讀寫</b>實驗

    【GD32H757Z海棠派開發板使用手冊】第十一講 SPI-SPI NOR FLASH讀寫實驗

    通過本實驗主要學習以下內容: ?SPI簡介 ?GD32H7 SPI簡介 ?SPI NOR FLASH——GD25Q128ESIGR簡介 ?使
    的頭像 發表于 06-04 11:42 ?1023次閱讀
    【GD32H757Z海棠派開發板使用手冊】第十一講 <b class='flag-5'>SPI-SPI</b> NOR <b class='flag-5'>FLASH</b><b class='flag-5'>讀寫</b>實驗

    【GD32F470紫藤派開發板使用手冊】第十一講 SPI-SPI NOR FLASH讀寫實驗

    通過本實驗主要學習以下內容: ?SPI簡介 ?GD32F470 SPI簡介 ?SPI NOR FLASH——GD
    的頭像 發表于 05-17 09:57 ?1811次閱讀
    【GD32<b class='flag-5'>F</b>470紫藤派開發板使用手冊】第十一講 <b class='flag-5'>SPI-SPI</b> NOR <b class='flag-5'>FLASH</b><b class='flag-5'>讀寫</b>實驗

    如何使用SPI的DMA模式讀寫FLASH

    環境:HAL庫 + USB + W25Q64 + Fatfs 硬件stm32f103c8t6 + MX25L64 我使用普通模式,完成在W25Q
    發表于 04-16 07:59

    STM32H7 SPI使用DMA模式,W25Q256數據讀寫不正確的原因?

    主芯片是 STM32H743XSPI-FLASH是 W25Q256,使用HAL庫(V1.8)。 如果SPI不使用DMA模式,則 W25Q2
    發表于 04-11 06:34

    STM32F103ZET6將SPI+W25QXX的程序移植后,步進電機均轉速轉慢的原因?

    本人學機械出身,現遇一問題,打不到突破辦法,還請各位大蝦相助。 CPU:STM32F103ZET6功能:多個步進電機控制,數據讀寫,串口收發等 原程序:采取內部FLASH, 現程序:增加
    發表于 04-02 08:30

    關于STM32F103從外設到存儲器DMA通道數據格式的問題

    在基于STM32F103開發過程中遇到了一個瓶頸,就是圖片取模后的數據放在W25Q64當中,通過硬件SPI+DMA的方式直接將數據發送給FSMC,FSMC被用來驅動
    發表于 03-07 07:11

    STM32F407ZGT6 spi flash片選引腳無法被拉低的原因?怎么解決?

    我用的芯片是STM32F407ZGT6,RTThread版本5.0.2,spi flash掛載在spi1總線,設備號是spi10 int
    發表于 02-20 07:13

    stm32f103 flash模擬eeprom

    STM32F103的Flash存儲器可以模擬EEPROM的功能,在本文中我們將詳細介紹如何使用STM32F103的Flash存儲器來實現E
    的頭像 發表于 01-09 11:21 ?2062次閱讀
    主站蜘蛛池模板: 彭丹吃奶门| 久久免费电影| 果冻传媒独家原创在线观看 | 亚洲伊人久久网| 高H各种PLAY全肉NP| 欧美jizz19性欧美| 97人妻无码AV碰碰视频| 久久精品视频91| 国产乱人视频在线观看| 日韩a视频在线观看| ppypp午夜限制不卡影院私人| 美女被免费喷白浆视频| 中文字幕AV亚洲精品影视| 久久国产精品人妻中文| 亚洲一卡二卡三卡四卡无卡麻豆| 果冻传媒在线观看高清完整免费 | seyeye在清在线| 墨西哥美女主播| AV亚洲精品少妇毛片无码| 女人和男人插曲视频大全| 99热久久爱五月天婷婷| 内射气质御姐视频在线播放| 99爱在线精品视频网站| 女人十八毛片水真多啊| SAO货腿张开JI巴CAO死我| 翘臀少妇被扒开屁股日出水爆乳| 把内衣脱了把奶露出来| 色www精品视频在线观看| 国产99RE在线观看69热| 午夜男女爽爽羞羞影院在线观看| 国产午夜精品视频在线播放| 亚洲精品不卡视频| 久久足恋网| 啊…嗯啊好深男男高h文总受| 日韩精品无码久久一区二区三| 国产成人在线视频观看| 亚洲国产日韩欧美视频二区| 久久精品亚洲AV中文2区金莲| 99RE6这里只有精品国产AV | 手机看片国产免费久久网| 国产精品无码人妻99999|