




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、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時
2、鐘信號線,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模塊其特性如下:2 SPI 初始化初始化SPI 主要是對SPI要使用到的引腳以及SPI通信協(xié)議中時鐘相位和極性進(jìn)行設(shè)置,其實(shí)STM32的工程師已經(jīng)幫我們做
3、好了這些工作,調(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ù)膸?/p>
4、格式的SPI_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,即空閑時時鐘是高電平,
5、數(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的控制下,同
6、時發(fā)送和接收數(shù)據(jù),并通過2個雙向移位寄存器來交換數(shù)據(jù)。 ”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分
7、頻 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
8、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中的R
9、XNE位,當(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等什
10、么字節(jié)都可以)讀寫分開的函數(shù):/*Description:spi1通信發(fā)送數(shù)據(jù)*/void SPI_Ecah_Buffer_Send(u8* pBuffer, u16 NumByteToRead)for(int i = 0; i < NumByteToRead; i+)SPI_Conmunication_SendByte(*pBuffer);pBuffer+;/*Description:spi1通信接收收據(jù)*/void SPI_Buffer_Receive(u8* pBuffer, u16 NumByteToRead)while (NumByteToRead-) /* while the
11、re is data to be read */*pBuffer = SPI_Conmunication_SendByte (Dummy_Byte);pBuffer+;讀寫一體的函數(shù)/*Description:spi1通信發(fā)送接收讀寫數(shù)據(jù)*/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的中斷配置在SP
12、I的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使能手冊
13、中有這樣一句話,“不能同時設(shè)置TXEIE和TXDMAEN”這一點(diǎn)要特別注意。也就是說如果你在SPI的通信中不用DMA則使能TXEIE的中斷,禁能TXDMAEN的中斷,如果在SPI中使用DMA傳輸,則禁能TXEIE 的中斷,只使能TXDMAEN 的中斷。五、 SPI的DMA操作DMA(Direct Memory Access)直接內(nèi)存存取,直接存儲器存取用來提供在外設(shè)和存儲器之間或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸。無須CPU任何干預(yù),通過DMA數(shù)據(jù)可以快速地移動。使用DMA最大的特點(diǎn)就是數(shù)據(jù)傳輸不經(jīng)過CPU這就節(jié)省了CPU的資源,讓CPU能有更多的時間來做其他的事情。SPI的DMA操作,就是在
14、SPI->TXE為1時,會向?qū)?yīng)的DMA通道發(fā)出請求,DMA通道會發(fā)出應(yīng)答信號,SPI收到應(yīng)答信號后撤銷請求信號,DMA撤銷應(yīng)答信號,并把內(nèi)存值裝入SPI_DR的發(fā)送緩區(qū),SPI的傳送開始。DMA的初始化DMA_PeripheralBaseAddr是值外設(shè)數(shù)據(jù)的地址,用SPI1故DMA外設(shè)地址對應(yīng)的是SPI1_DR_Addr,DMA_MemoryBaseAddr是內(nèi)存地址,它的值可以使,你要發(fā)送的數(shù)據(jù)所存放的數(shù)組的名,因?yàn)閿?shù)組名代表的是數(shù)組數(shù)據(jù)存放的首地址,在SPI-DMA的發(fā)送中可以理解為把DMATX數(shù)組里的數(shù)據(jù)傳送到SPI1_DR_AddrDMA_DIR 是指數(shù)據(jù)傳輸?shù)姆较颍渲蛋l(fā)送
15、時其值為DMA_DIR_PeripheralDST 即外設(shè)是目的地,方向是DMATX> SPI1_DR_Addr,在接受收時其值為DMA_DIR_PeripheralSRC,即外設(shè)是數(shù)據(jù)的來源,傳輸方向是 SPI1_DR_Addr>用戶指定的數(shù)據(jù)存儲數(shù)組。DMA_BufferSize 用來設(shè)置傳輸數(shù)據(jù)的個數(shù),在STM32的DMA中其值的范圍是065536.DMA_Mode 指 DMA的傳輸模式 DMA_Mode_Normal為正常工作模式DMA_Mode_Circular 是循環(huán)工作模式,這里對循環(huán)模式的解釋我認(rèn)為有位網(wǎng)友解釋的很不錯如下:“循環(huán)的意思是指DMA的傳輸數(shù)量計(jì)數(shù)器會重
16、置初值,由于DMA每傳一個數(shù)據(jù),傳輸數(shù)量計(jì)數(shù)器減一,只有在傳輸數(shù)量計(jì)數(shù)器的值不為零時,才會響應(yīng)請求。在循環(huán)模式下,當(dāng)傳輸計(jì)數(shù)器的值減為0后,會重新裝載;而內(nèi)存(緩存)地址則不管循環(huán)非循環(huán)模式,都會在每次傳輸完成后重置為基地址。所以,如果我們把DMA設(shè)置會正常模式,那么在下次傳輸前,只需對DMA的傳輸數(shù)量計(jì)數(shù)器重新寫入就行。循環(huán)模式一般用于數(shù)據(jù)更新,比如ADC采用需要不停更新數(shù)據(jù)。”在初始化完成之后要開啟DMA的中斷,在我的程序中開啟的是DMA傳輸完成中斷。DMA傳輸有3個中斷標(biāo)志位,常用的是傳輸完成的中斷。如下:這樣在傳輸完設(shè)定的數(shù)據(jù)個數(shù)之后就會觸發(fā)傳輸完成的中斷,用戶可以再中斷服務(wù)函數(shù)中,進(jìn)
17、行相應(yīng)的操作,有一點(diǎn)特別注意,就是要及時清除中斷標(biāo)志位,為下次能夠正常觸發(fā)中斷做準(zhǔn)備。在我的中斷服務(wù)函數(shù)中有一個標(biāo)志位SpiCommon,被置1后再中斷之外進(jìn)行其他的處理,同時調(diào)用DMA_ClearITPendingBit(DMA1_IT_TC2)來及時清除中斷標(biāo)志。在進(jìn)行DMA的數(shù)據(jù)傳輸時要先禁能DMA的通道,重置傳輸數(shù)據(jù)個數(shù)的值,數(shù)據(jù)的存儲位置等,再使能DMA的通道,等待DMA的傳輸完成。我的操作時這樣的,先往DMATX里寫入相應(yīng)的數(shù)據(jù),然后如下這樣可能有一點(diǎn)不好的地方,因?yàn)橹桓淖兞薙piTXSize的值,卻又重新執(zhí)行了DMATXInit() 函數(shù),可能此處能夠再改善一下。六 測試中出現(xiàn)的
18、問題及原因和解決方法l 示波器觀察主機(jī)能夠產(chǎn)生正確的時鐘,主機(jī)輸出引腳也能產(chǎn)生正確的數(shù)據(jù),但是從機(jī)不能接受數(shù)據(jù)。可能原因:1. 從機(jī)的接收中斷配置不正確,或者沒有打開相應(yīng)的中斷。2. 在從機(jī)中TXEIE的中斷和TXDMAEN的中斷都被使能,手冊中說,這兩個中斷只能使能1個.l 從機(jī)能接收數(shù)據(jù),但是接收的數(shù)據(jù)亂碼可能原因:1. 主從機(jī)的時鐘相位和極性的配置導(dǎo)致的,關(guān)于這一點(diǎn)想做一下說明,網(wǎng)上有人說,主從機(jī)時鐘的相位和極性要配置的一樣,也有人說不能配置的一樣,而我對于主從機(jī)的相位和極性的16種組合情況全做了試驗(yàn),結(jié)果如下:(主機(jī)LPC1114的SPI1從機(jī)STM32的SPI1) (表示能正常通信) 主 從通信CPOLCPHACPOLCPHA00000001亂碼(左移1位)0010亂碼0011亂碼0100亂碼0101亂碼01100111亂碼100010011010亂碼1011亂碼1100亂碼1101亂碼11101111(當(dāng)然可
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 資質(zhì)維護(hù)協(xié)議書范本
- 超市專柜終止合同協(xié)議
- 貿(mào)易業(yè)務(wù)員合同協(xié)議
- 購房合同簽附加協(xié)議
- 質(zhì)押合同無償合同協(xié)議
- 設(shè)備進(jìn)口三方協(xié)議合同
- 《第02節(jié) 萬有引力定律的應(yīng)用》導(dǎo)學(xué)案
- 2025年金融管理專業(yè)研究生入學(xué)考試試題及答案
- 2025年空間設(shè)計(jì)師專業(yè)資格考試試卷及答案
- 模具加工附加合同協(xié)議
- 2024年上海古詩文大會小學(xué)試題庫(含答案)
- 生態(tài)環(huán)境數(shù)字化治理的杭州創(chuàng)新與經(jīng)驗(yàn)
- 社會調(diào)查委托合同三篇
- 癲癇性精神病的護(hù)理查房
- 建筑起重信號司索工試題庫(附答案)
- 中小學(xué)校保安服務(wù)方案(技術(shù)方案)
- Unit1-Unit3 (單元測試)-2024-2025學(xué)年人教PEP版(2024)英語三年級上冊
- 六上 Unit 1 Part A 課件人教版六年級英語
- 蘇教版高中數(shù)學(xué)必修第一冊第1章1.1第2課時集合的表示【授課課件】
- 常用焊管規(guī)格表
- DL∕T 5161.17-2018 電氣裝置安裝工程質(zhì)量檢驗(yàn)及評定規(guī)程 第17部分:電氣照明裝置施工質(zhì)量檢驗(yàn)
評論
0/150
提交評論