女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]STM32---SPI(DMA)通信的總結(jié)(庫函數(shù)操作)本文主要由7項(xiàng)內(nèi)容介紹SPI并會在最后附上測試源碼供參考:1.SPI的通信協(xié)議2.SPI通信初始化(以STM32為從機(jī),LPC1114為主機(jī)介紹)3.SPI的讀寫函數(shù)4.SPI的中斷配置5.SPI的SMA操

STM32---SPI(DMA)通信的總結(jié)(庫函數(shù)操作)

本文主要由7項(xiàng)內(nèi)容介紹SPI并會在最后附上測試源碼供參考:

1.SPI的通信協(xié)議

2.SPI通信初始化(以STM32為從機(jī),LPC1114為主機(jī)介紹)

3.SPI的讀寫函數(shù)

4.SPI的中斷配置

5.SPI的SMA操作

6.測試源碼

7.易出現(xiàn)的問題及原因和解決方法

一、SPI的通信協(xié)議

SPI(Serial Peripheral Interface)是一種串行同步通訊協(xié)議,由一個主設(shè)備和一個或多個從設(shè)備組成,主設(shè)備啟動一個與從設(shè)備的同步通訊,從而完成數(shù)據(jù)的交換。SPI接口一般由4根線組成,CS片選信號(有的單片機(jī)上也稱為NSS),SCLK時鐘信號線,MISO數(shù)據(jù)線(主機(jī)輸入從機(jī)輸出),MOSI數(shù)據(jù)線(主機(jī)輸出從機(jī)輸入),CS決定了唯一的與主設(shè)備通信的從設(shè)備,如沒有CS信號,則只能存在一個從設(shè)備,主設(shè)備通過產(chǎn)生移位時鐘信號來發(fā)起通訊。通訊時主機(jī)的數(shù)據(jù)由MISO輸入,由MOSI輸出,輸入的數(shù)據(jù)在時鐘的上升或下降沿被采樣,輸出數(shù)據(jù)在緊接著的下降或上升沿被發(fā)出(具體由SPI的時鐘相位和極性的設(shè)置而決定)。

二、以STM32為例介紹SPI通信

1.STM32f103帶有3個SPI模塊其特性如下:



2SPI初始化

初始化SPI主要是對SPI要使用到的引腳以及SPI通信協(xié)議中時鐘相位和極性進(jìn)行設(shè)置,其實(shí)STM32的工程師已經(jīng)幫我們做好了這些工作,調(diào)用庫函數(shù),根據(jù)自己的需要來修改其中的參量來完成自己的配置即可,主要的配置是如下幾項(xiàng):

l引腳的配置

SPI1的SCLK, MISO ,MOSI分別是PA5,PA6,PA7引腳,這幾個引腳的模式都配置成GPIO_Mode_AF_PP復(fù)用推挽輸出(關(guān)于GPIO的8種工作模式如不清楚請自己百度,在此不解釋),如果是單主單從,CS引腳可以不配置,都設(shè)置成軟件模式即可。



l通信參數(shù)的設(shè)置



1.SPI_Direction_2Lines_FullDuplex把SPI設(shè)置成全雙工通信;

2.在SPI_Mode里設(shè)置你的模式(主機(jī)或者從機(jī)),

3.SPI_DataSize是來設(shè)置數(shù)據(jù)傳輸?shù)膸袷降腟PI_DataSize_8b是指8位數(shù)據(jù)幀格式,也可以設(shè)置為SPI_DataSize_16b,即16位幀格式

4.SPI_CPOL和SPI_CPHA是兩個很重要的參數(shù),是設(shè)置SPI通信時鐘的極性和相位的,一共有四種模式



在庫函數(shù)中CPOL有兩個值SPI_CPOL_High(=1)和SPI_CPOL_Low ( =0).

CPHA有兩個值SPI_CPHA_1Edge (=0)和SPI_CPHA_2Edge(=1)

CPOL表示時鐘在空閑狀態(tài)的極性是高電平還是低電平,而CPHA則表示數(shù)據(jù)是在什么時刻被采樣的,手冊中如下:



我的程序中主、從機(jī)的這兩位設(shè)置的相同都是設(shè)置成1,即空閑時時鐘是高電平,數(shù)據(jù)在第二個時鐘沿被采樣,實(shí)驗(yàn)顯示數(shù)據(jù)收發(fā)都正常。

(要特別注意極性和相位的設(shè)置否則,數(shù)據(jù)傳輸會出現(xiàn)錯位的現(xiàn)象)

一般主從機(jī)的這兩個位要設(shè)置的一樣,但是網(wǎng)上也有人說不能設(shè)置成一樣的,在后文中我對主從機(jī)極性和相位的配置的16種情況都做了測試,結(jié)果見下文。

下圖很好的描述了4種模式下的時序狀況




引用網(wǎng)友的一句話::


“SPI主模塊和與之通信的外設(shè)備時鐘相位和極性應(yīng)該一致。個人理解這句話有2層意思:其一,主設(shè)備SPI時鐘和極性的配置應(yīng)該由外設(shè)的從設(shè)備來決定;其二,二者的配置應(yīng)該保持一致,即主設(shè)備的SDO同從設(shè)備的SDO配置一致,主設(shè)備的SDI同從設(shè)備的SDI配置一致。因?yàn)橹鲝脑O(shè)備是在SCLK的控制下,同時發(fā)送和接收數(shù)據(jù),并通過2個雙向移位寄存器來交換數(shù)據(jù)?!?/p>

5.SPI_BaudRatePrescaler波特率的設(shè)置

這在主機(jī)模式中,這一位的設(shè)置直接決定了通信的傳輸速率,而從機(jī)的設(shè)置不會影響數(shù)據(jù)傳輸?shù)乃俾?,手冊中有這樣一句話:



(實(shí)際測試中發(fā)現(xiàn):當(dāng)STM32作為從機(jī)時,它對波特率的設(shè)置會影響數(shù)據(jù)的通信,特別是在大數(shù)據(jù)兩傳輸時,當(dāng)主機(jī)SPI時鐘設(shè)置為15M時,STM32從機(jī)如果是2分頻即18M則會在多次傳輸時出現(xiàn)錯誤,我記得在資料中看到過有前輩的經(jīng)驗(yàn)貼說SPI從機(jī)的時鐘設(shè)置不能高于SPI主機(jī)的時鐘設(shè)置,雖然理論上從機(jī)的時鐘設(shè)置不影響SPI通信,但是在試驗(yàn)中我也驗(yàn)證,當(dāng)STM32從機(jī)時鐘設(shè)為4分頻9M,低于15M時,通信就不會出現(xiàn)問題。所以SPI從機(jī)波特率的設(shè)置最好低于SPI主機(jī)波特率的設(shè)置。)

6.SPI_FirstBit這一位是設(shè)置首先傳輸?shù)母咦止?jié)還是低字節(jié)

SPI_FirstBit_MSB是先傳輸高字節(jié),SPI_FirstBit_LSB是先傳輸?shù)妥止?jié)

注意在初始化函數(shù)里還有兩項(xiàng)重要的內(nèi)容就是在初始化之前先使能SPI的時鐘和在初始化配置完成后使能SPI。



(………..初始化配置……………)



三、SPI的讀寫函數(shù)

SPI有一個16位的數(shù)據(jù)寄存器SPI_DR,它對應(yīng)兩個緩沖區(qū),1個發(fā)送緩沖區(qū),1個接收緩沖區(qū),當(dāng)在控制寄存器里SPI_CR1里對DFF位設(shè)置數(shù)據(jù)幀格式為8位時,發(fā)送和接收只用到SPI_DR[7:0]這8位,15-8位被強(qiáng)制為0,幀格式設(shè)置成16位時全用。

讀寫過程在手冊中是這樣描述的:



簡而言之,

發(fā)送時,可以通過檢測SPI_SR中的TXE位,當(dāng)數(shù)據(jù)寄存器里有數(shù)據(jù)時,TXE位是0,當(dāng)數(shù)據(jù)全部從數(shù)據(jù)寄存器的發(fā)送緩沖區(qū)傳輸?shù)揭莆患拇嫫鲿rTXE位被置1,這時候可以再往數(shù)據(jù)寄存器里寫入數(shù)據(jù)??梢酝ㄟ^

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)來檢測。

SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)是庫函數(shù),可以檢測SPI的一些狀態(tài)位。

接收時,可以通過檢測SPI_SR中的RXNE位,當(dāng)數(shù)據(jù)寄存器里有數(shù)據(jù)時,RXNE位是0,當(dāng)數(shù)據(jù)全部從數(shù)據(jù)寄存器的接收緩沖區(qū)傳輸?shù)揭莆患拇嫫鲿rRXNE位被置1,這時候可以從數(shù)據(jù)寄存器里讀出數(shù)據(jù)。可以通過

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);來檢測。源程序如下,

SPI讀寫一個字節(jié),讀寫一體




當(dāng)能成功發(fā)送和接收一個字節(jié)時,發(fā)送數(shù)組數(shù)據(jù)就變的簡單了,只需要一個for循環(huán),和指針變量的遞增即可。以下僅為參考:

(有一點(diǎn)特別注意,從機(jī)數(shù)據(jù)傳輸時要依賴主機(jī)的時鐘,所以主機(jī)在接收從機(jī)發(fā)送的數(shù)據(jù)時要往從機(jī)發(fā)送啞巴字節(jié),這個字節(jié)可以自己定義0xff,0xfe等什么字節(jié)都可以)

讀寫分開的函數(shù):

void SPI_Ecah_Buffer_Send(u8* pBuffer, u16 NumByteToRead)

{

for(int i = 0; i < NumByteToRead; i++)

{

SPI_Conmunication_SendByte(*pBuffer);

pBuffer++;

}

}

void SPI_Buffer_Receive(u8* pBuffer, u16 NumByteToRead)

{

while (NumByteToRead--)

{

*pBuffer = SPI_Conmunication_SendByte (Dummy_Byte);

pBuffer++;

}

}

讀寫一體的函數(shù)

void SPI_Ecah_Buffer_Send(u8* str , u8* pBuffer, u16 NumByteToRead)

{

for(int i = 0; i < NumByteToRead; i++)

{

*str = SPI_Conmunication_SendByte(*pBuffer);

pBuffer++;

str++;

}

}

四、SPI的中斷配置

在SPI的SPI_CR2中可以配置,STM32的SPI的通信一共有8個中斷其中最常用的是如下4個。

TXEIE:發(fā)送緩沖區(qū)空中斷使能

在發(fā)送過程中,數(shù)據(jù)全部從數(shù)據(jù)寄存器的發(fā)送緩沖區(qū)傳輸?shù)揭莆患拇嫫鲿rTXE位被置1這時如果使能了TXEIE就會觸發(fā)發(fā)送完成的中斷請求。在中斷服務(wù)函數(shù)里可以做你想做的事情,也可以用一個標(biāo)志位,在外面完成相應(yīng)的操作。

(使用中斷時要特別注意,及時的清除中斷標(biāo)志,為下一次能夠觸發(fā)中斷做準(zhǔn)備。而清除中斷的操作可以放在中斷服務(wù)函數(shù)中,或者其他你認(rèn)為何時的地方。)

RXNEIE:接收緩沖區(qū)非空中斷使能

接收同發(fā)送。

TXDMAEN:發(fā)送緩沖區(qū)DMA使能

RXDMAEN:接收緩沖區(qū)DMA使能


手冊中有這樣一句話,“不能同時設(shè)置TXEIE和TXDMAEN”這一點(diǎn)要特別注意。也就是說如果你在SPI的通信中不用DMA則使能TXEIE的中斷,禁能TXDMAEN的中斷,如果在SPI中使用DMA傳輸,則禁能TXEIE的中斷,只使能TXDMAEN的中斷。

五、SPI的DMA操作

DMA(Direct Memory Access)直接內(nèi)存存取,直接存儲器存取用來提供在外

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在嵌入式開發(fā)中,STM32的時鐘系統(tǒng)因其靈活性和復(fù)雜性成為開發(fā)者關(guān)注的焦點(diǎn)。然而,看似簡單的時鐘配置背后,隱藏著諸多易被忽視的陷阱,輕則導(dǎo)致系統(tǒng)不穩(wěn)定,重則引發(fā)硬件損壞。本文從時鐘源選擇、PLL配置、總線時鐘分配等關(guān)鍵環(huán)...

關(guān)鍵字: STM32 時鐘系統(tǒng)

在嵌入式系統(tǒng)開發(fā)中,STM32系列微控制器的內(nèi)部溫度傳感器因其低成本、高集成度特性,廣泛應(yīng)用于設(shè)備自檢、環(huán)境監(jiān)測等場景。然而,受芯片工藝差異和電源噪聲影響,其原始數(shù)據(jù)存在±1.5℃的固有誤差。本文從硬件配置、校準(zhǔn)算法、軟...

關(guān)鍵字: STM32 溫度傳感器

在能源效率與智能化需求雙重驅(qū)動下,AC-DC轉(zhuǎn)換器的數(shù)字控制技術(shù)正經(jīng)歷從傳統(tǒng)模擬方案向全數(shù)字架構(gòu)的深刻變革?;赟TM32微控制器的PFM(脈沖頻率調(diào)制)+PWM(脈沖寬度調(diào)制)混合調(diào)制策略,結(jié)合動態(tài)電壓調(diào)整(Dynam...

關(guān)鍵字: AC-DC STM32

當(dāng)前智能家居產(chǎn)品需求不斷增長 ,在這一背景下 ,對現(xiàn)有澆花裝置缺陷進(jìn)行了改進(jìn) ,設(shè)計(jì)出基于STM32單片機(jī)的全 自動家用澆花機(jī)器人。該設(shè)計(jì)主要由機(jī)械結(jié)構(gòu)和控制系統(tǒng)構(gòu)成 ,機(jī)械結(jié)構(gòu)通過麥克納姆輪底盤與噴灑裝置的結(jié)合實(shí)現(xiàn)機(jī)器...

關(guān)鍵字: STM32 麥克納姆輪 安全可靠 通過性強(qiáng)

用c++編程似乎是讓你的Arduino項(xiàng)目起步的障礙嗎?您想要一種更直觀的微控制器編程方式嗎?那你需要了解一下Visuino!這個圖形化編程平臺將復(fù)雜電子項(xiàng)目的創(chuàng)建變成了拖動和連接塊的簡單任務(wù)。在本文中,我們將帶您完成使...

關(guān)鍵字: Visuino Arduino ESP32 STM32

基于STM32與LoRa技術(shù)的無線傳感網(wǎng)絡(luò)憑借其低功耗、廣覆蓋、抗干擾等特性,成為環(huán)境監(jiān)測、工業(yè)自動化等場景的核心解決方案。然而,如何在復(fù)雜電磁環(huán)境中實(shí)現(xiàn)高效休眠調(diào)度與動態(tài)信道優(yōu)化,成為提升網(wǎng)絡(luò)能效與可靠性的關(guān)鍵挑戰(zhàn)。本...

關(guān)鍵字: STM32 LoRa

在實(shí)時控制系統(tǒng)、高速通信協(xié)議處理及高精度數(shù)據(jù)采集等對時間敏感的應(yīng)用場景中,中斷響應(yīng)延遲的優(yōu)化直接決定了系統(tǒng)的可靠性與性能上限。STM32系列微控制器憑借其靈活的嵌套向量中斷控制器(NVIC)、多通道直接內(nèi)存訪問(DMA)...

關(guān)鍵字: STM32 DMA

數(shù)字電源技術(shù)向高功率密度、高效率與高動態(tài)響應(yīng)方向加速演進(jìn),STM32微控制器憑借其基于DSP庫的算法加速能力與對LLC諧振變換器的精準(zhǔn)控制架構(gòu),成為優(yōu)化電源動態(tài)性能的核心平臺。相較于傳統(tǒng)模擬控制或通用型數(shù)字控制器,STM...

關(guān)鍵字: STM32 數(shù)字電源

STM32微控制器憑借其針對電機(jī)控制場景的深度優(yōu)化,成為高精度、高可靠性驅(qū)動系統(tǒng)的核心選擇。相較于通用型MCU,STM32在電機(jī)控制領(lǐng)域的核心優(yōu)勢集中體現(xiàn)在FOC(磁場定向控制)算法的硬件加速引擎與PWM死區(qū)時間的動態(tài)補(bǔ)...

關(guān)鍵字: STM32 電機(jī)控制

無線充電技術(shù)加速滲透消費(fèi)電子與汽車電子領(lǐng)域,基于Qi協(xié)議的無線充電發(fā)射端開發(fā)成為智能設(shè)備能量補(bǔ)給的核心課題。傳統(tǒng)模擬控制方案存在響應(yīng)滯后、參數(shù)調(diào)整困難等問題,而基于STM32的數(shù)字PID控制結(jié)合FOD(Foreign O...

關(guān)鍵字: STM32 無線充電
關(guān)閉