STM32:SPI&w25qxx的配置與代碼


本文的話,我們首先了解一下SPI協議是什么,然后通過SPI的工作框圖了解原理,然后根據代碼對使用進行一下概括;

1 SPI協議

  1.1 工作模式

    SPI總線有四種工作模式,由CPOL和CPHA決定,模式xx = mode[CPOL:CPHA];不同模式的采樣點不同;

    CPOL(clock polarities時鍾極性):決定SCK的起始電平是0還是1,CPOL=0表示時鍾的起始電平為低;

    CPHA(clock phase時鍾相位):    決定數據采樣點是在SCK的第1個跳變沿還是第二個跳變沿,CPHA=0表示取樣點為第一個跳變沿;

    就像目前遇到過的串口協議都是1bit開始位,8bit數據位,1bit停止位,無校驗位;遇到的SPI協議也清一色是模式0;

  

  1.2 數據收發

    假設器件為主器件,工作在全雙工模式,然后工作模式為模式0;

    在SCK的上升沿時,需要MI,MO都是有效數據;所以數據應該在CS使能前或SCK采樣前的下降沿准備好;(意思是數據在下降沿變化,上升沿采樣)

    spi的數據幀為4-32bit,數據發送以數據幀為單位,先使能片選,然后發送數據幀,然后取消片選使能;以此循壞收發數據;

  1.3 注意事項

    SPI協議大部分用在EEPROM和FLASH存儲器上,作為板間通信協議較為常用;

    SPI協議對數據的收發時序要求不高,也沒有應答位;協議簡單,速度較快;只要SCK和CS使能,MI,MO就可以傳遞數據了;

    許多設備都更願意支持模式0和模式3,因為這樣的話取樣的數據點都是在上升沿取樣;

    (上升沿通常由D觸發器生成,較為穩定;下降沿的觸發器觸發時會有一些組合邏輯的延時,不如上升沿穩定;)  

2 SPI框圖

  各種外設的了解無非是首先了解該外設的時鍾,時鍾決定傳輸性能;然后了解該外設的工作模式和配置原理;然后根據代碼了解接口如何使用;

  

  2.1 SPI時鍾域

    SPI外設的時鍾域可以分為三個完全獨立的時鍾域,但是這些域之間的控制和狀態信號需要嚴格同步,確保收發數據的正確;

    2.1.1 spi_pclk時鍾域:APB總線的工作時鍾,用來訪問spi寄存器時使用;

    2.1.2 spi_ker_ck時鍾域:主器件的SCK工作時鍾,由rcc時鍾生成,hal庫函數中默認對其2分頻后作為sck時鍾;從器件的該時鍾域由主器件生成;

    2.1.3 串行接口時鍾域:由spi_ker_ckf分頻而來的時鍾,用來給收發數據的移位寄存器使用;

3 hal庫接口

  https://www.cnblogs.com/armfly/p/12523671.html

4 W25Q128FV特性總結,隨便看看 

    

  4.1 結構框圖

    /CS引腳:未使能前,引腳屬於高阻態,芯片待機狀態;片選使能,芯片電壓上來,芯片自動准備收發指令數據;

    /WP引腳:使能后,狀態寄存器不能被修改;目的是為了防止掉電狀態下的SR寄存器可能被噪音之類的修改;下面有圖;

    /HOLD引腳:使能CS后,如果使能HOLD,則DO為高阻態,DI,SCK信號無效;

          使用spi時,可以將引腳配置為通用IO口,然后拉高,高電平不使能該引腳;

    /RESET引腳:將/HOLD引腳的功能改為復位引腳,然后硬件配置復位;也可以使用復位指令軟件復位;

    /WP, /HOLD, /RESET引腳的功能都與QSPI的功能沖突,如果芯片配置成qspi模式,則引腳功能無效;

    WEL出廠默認為0,;當WEL為1時,/WP引腳可與SR寄存器的多bit一起決定block的寫保護;

    

    w25qxx只支持spi模式的模式0和模式3,為什么呢?先占個坑;

    w25qxx在SCK的上升沿讀取DI的數據,在SCK的下降沿發送數據到DO;

  4.2 狀態寄存器

    w25qxx一共有3個狀態寄存器;

    讀操作狀態寄存器可以知道各種指令操作之后寄存器的狀態,可以通過狀態寄存器判斷指令操作是否完成;

    寫操作狀態寄存器可以配置芯片的各種功能,如寫保護功能,QSPI模式,復位引腳復用等;

    4.2.1 SR1和SR2:初始化值為0x00;

  (S0)BUSY:當busy為1時,芯片正在執行指令,且不接收新的指令;當busy為0時,芯片不在執行指令,准備接收指令;

  (S1)       WEL:當wel為1時,芯片可以執行寫指令;當wel為0時,不能執行寫指令;上電后以及執行完各種指令后,wel會被置位為0;

  (S4-S2) BP[2:0]:當配置后,對應地址的擦寫操作受到保護,需要先取消保護才能修改;BP[2:0]默認初始化為0,即所有地址均可執行擦寫操作;

  (S5)      TB:同BP[2:0]一起決定block protected;默認初始化為0;//可以通過配置SRP[1:0]和WEL來配置TB bit;

  (S6)      SEC:當SEC為1時,BP[2:0]的寫保護單位是sector;當SEC為0時,寫保護單位是block;

  S[6:2]用來決定數據存儲區的非易失性存儲功能是否啟用;如果啟動,則特定block或sector不能直接擦寫操作;具體見數據手冊第七章末尾的表格;  

  (S8-S7) SRP[1:0]:決定/WP控制狀態寄存器的功能是否有效;是針對狀態寄存器操作的配置;如下圖所示:

  (S9)       QE:當置1后,表示為QSPI模式,且/WP引腳和/HOLD引腳功能無效,將對應引腳杜勇為QSPI數據引腳;

      當QE為0時,/WP和/HOLD引腳功能有效;

      QEbit需要先配置為1,然后執行Enter QPI(38h)指令,才能進入QPI模式;

  (S13-S11) LB[3:1]:當置1后,對應的256bytes的security register永久性只讀;是針對安全性寄存器的配置;

  (S14)    CMP:配合前面5bit一起配置非易失性保護;默認初始化為0;

  (S15)    SUS:當SUS為1時,表示執行完了擦寫操作75h;當SUS為0時,表示執行完了擦寫操作暫停指令7Ah;默認上電初始化為0;

 

  (S18)     WPS:當WPS為0時,決定存儲區域的非易失性寫保護由寄存器的5bit決定;

         當WPS為1時,表示存儲區域的寫保護通過發送指令來決定;具體見第7章末尾的表格;

  (S22-S21)DRV[1:0]:用來決定驅動輸出數據的強度,默認為11b,25%;

  (S23)    HOLD/RESET:默認為0,表示引腳功能為/HOLD;當配置為1時,表示引腳功能為/RESET;

  4.3指令操作

    芯片為SPI/DSPI/QSPI提供了45條基本指令。這些指令在CS拉低后便准備好接收了;數據傳輸高位在前先傳輸;

    芯片為QPI提供了32條基本指令;QSPI接口僅支持從SPI接口使用38h指令切換過去,然后使用FFh切換回QSPI;

    QSPI和QPI的主要差別在於QPI發送指令也是通過4線進行傳輸的,QSPI發送指令同SPI一樣是通過1線進行傳輸的;

    必須確保所寫的地址范圍內的數據全部為0XFF,否則在非0XFF處寫入的數據將失敗!

    SPI的解碼緩存是256字節,所以每次執行寫操作的時候,寫入數據的大小不大於256字節;

    所以執行讀寫操作數據的時候都要先使能WEL,然后等BUSY位為0;

5 源碼:https://gitee.com/caesura/stm32h7_demo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM