《STM32从零开始学习历程》——SPI特性及架构
《STM32從零開始學(xué)習(xí)歷程》@EnzoReventon
SPI特性及架構(gòu)
相關(guān)鏈接:
SPI物理層及FLASH芯片介紹
SPI協(xié)議層
SPI固件庫
參考資料:
[野火EmbedFire]《STM32庫開發(fā)實(shí)戰(zhàn)指南——基于野火霸天虎開發(fā)板》
[正點(diǎn)原子]STM32F4開發(fā)指南-庫函數(shù)版本_V1.2
[ST]《STM32F4xx中文參考手冊(cè)》
SPI協(xié)議及總線協(xié)議介紹
W25Q128產(chǎn)品數(shù)據(jù)手冊(cè)
STM32的SPI外設(shè)簡(jiǎn)介
- STM32的SPI外設(shè)可用作通訊的主機(jī)及從機(jī),支持最高的SCK時(shí)鐘頻率為fpclk/2 (STM32F407型號(hào)的芯片默認(rèn)fpclk2為84MHz,fpclk1為42MHz),完全支持SPI協(xié)議的4種模式,數(shù)據(jù)幀長(zhǎng)度可設(shè)置為8位或16位,可設(shè)置數(shù)據(jù)MSB先行或LSB先行。
- 它還支持雙線全雙工、雙線單向(兩根數(shù)據(jù)線都做發(fā)送或者接收模式)以及單線模式。
- 本文為以STM32F407為實(shí)驗(yàn)對(duì)象,經(jīng)查閱手冊(cè),該芯片有3個(gè)SPI通訊接口,具體引腳請(qǐng)查閱手冊(cè)。
STM32的SPI架構(gòu)剖析
時(shí)鐘控制邏輯
SCK 線的時(shí)鐘信號(hào),由波特率發(fā)生器根據(jù)“控制寄存器CR1”中的BR[0:2] 位控制,該位是對(duì)fpclk時(shí)鐘的分頻因子,對(duì)fpclk 的分頻結(jié)果就是SCK 引腳的輸出時(shí)鐘頻率,計(jì)算方法見下表。
| 000 | fpclk/2 | 100 | fpclk/32 |
| 001 | fpclk/4 | 101 | fpclk/64 |
| 010 | fpclk/8 | 110 | fpclk/128 |
| 011 | fpclk/16 | 111 | fpclk/256 |
數(shù)據(jù)控制邏輯
SPI的MOSI及MISO都連接到數(shù)據(jù)移位寄存器上,數(shù)據(jù)移位寄存器的數(shù)據(jù)來源來源于接收緩沖區(qū)及發(fā)送緩沖區(qū)。
- 通過寫SPI的“數(shù)據(jù)寄存器DR”把數(shù)據(jù)填充到發(fā)送緩沖區(qū)中。
- 通過讀“數(shù)據(jù)寄存器DR”,可以獲取接收緩沖區(qū)中的內(nèi)容。
- 其中數(shù)據(jù)幀長(zhǎng)度可以通過“控制寄存器CR1”的“DFF位”配置成8位及16位模式;配置“LSBFIRST位”可選擇**MSB(高位先行)先行還是LSB(低位先行)**先行。
整體控制邏輯
- 整體控制邏輯負(fù)責(zé)協(xié)調(diào)整個(gè)SPI外設(shè),控制邏輯的工作模式根據(jù)“控制寄存器(CR1/CR2)”的參數(shù)而改變,基本的控制參數(shù)包括前面提到的SPI模式、波特率、LSB先行、主從模式、單雙向模式等等。
- 在外設(shè)工作時(shí),控制邏輯會(huì)根據(jù)外設(shè)的工作狀態(tài)修改“狀態(tài)寄存器(SR)”(TXE,RXNE),只要讀取狀態(tài)寄存器相關(guān)的寄存器位,就可以了解SPI的工作狀態(tài)了。
- 除此之外,控制邏輯還根據(jù)要求,負(fù)責(zé)控制產(chǎn)生SPI中斷信號(hào)、DMA請(qǐng)求及控制NSS信號(hào)線。
- 實(shí)際應(yīng)用中,一般不使用STM32 SPI外設(shè)的標(biāo)準(zhǔn)NSS信號(hào)線,而是更簡(jiǎn)單地使用普通的GPIO,軟件控制它的電平輸出,從而產(chǎn)生通訊起始和停止信號(hào)。
- SSM軟件從器件管理,SSM取1時(shí),使能軟件從器件管理,SSM取0時(shí),禁止軟件從器件管理。SSM為1時(shí),可以隨意指定一個(gè)GPIO引腳用來產(chǎn)生開始或者停止信號(hào)而非只能選用有SSM功能的引腳,使用靈活。
通訊過程
橙色:表示發(fā)送數(shù)據(jù)
黃色:表示發(fā)送標(biāo)志,TXE的狀態(tài)
紫色:表示接受標(biāo)志,RXNE的狀態(tài)
綠色:表示MISO輸入
- 內(nèi)核向數(shù)據(jù)寄存器SPI_DR寫入0xF1,數(shù)據(jù)寫入到發(fā)送緩沖區(qū),移位寄存器將數(shù)據(jù)一位一位的發(fā)送出去。
- TXE=1(由于第一次數(shù)據(jù)傳輸,移位寄存器為空,數(shù)據(jù)很快的能夠傳輸?shù)揭莆患拇嫫髦?#xff09;,表示數(shù)據(jù)寄存器為空,此時(shí)可以寫入第二個(gè)數(shù)據(jù)進(jìn)入發(fā)送緩沖區(qū),等待轉(zhuǎn)移至移位寄存器(此時(shí)TXE=0,表示移位寄存器還在發(fā)送數(shù)據(jù)中,非空),即等待TXE再次等于1。
- 接下來的數(shù)據(jù)傳輸按照上述步驟重復(fù)執(zhí)行,等待移位寄存器將數(shù)據(jù)發(fā)送結(jié)束,接受新的數(shù)據(jù),等待發(fā)送。
- 與發(fā)送過程一致,接收數(shù)據(jù)的標(biāo)志位為RXNE,當(dāng)RNXE為1時(shí)可以從數(shù)據(jù)寄存器中讀取接收到的數(shù)據(jù)。
沒有往SPI_DR寄存器寫入數(shù)據(jù)的話,SCK將不會(huì)產(chǎn)生時(shí)鐘,因此如果想要讀取數(shù)據(jù),就必須向SPI_DR寄存器寫入數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的《STM32从零开始学习历程》——SPI特性及架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将Navicat右键表【对象信息】-【D
- 下一篇: Liquid Telecom推出泛非Wi