STM32_參考手冊-中文pdf_第1頁
STM32_參考手冊-中文pdf_第2頁
STM32_參考手冊-中文pdf_第3頁
STM32_參考手冊-中文pdf_第4頁
STM32_參考手冊-中文pdf_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、SPI接口STM32F10xxx參考手冊23串行外設(shè)接口(SPI)小容量產(chǎn)品 是指閃存存儲器容量在 16K 至32K 字節(jié)之間的 STM32F101xx、STM32F102xx和 STM32F103xx微控制器。中容量產(chǎn)品是指閃存存儲器容量在64K至128K字節(jié)之間的STM32F101xx、STM32F102xx和STM32F103xx微控制器。大容量產(chǎn)品是指閃存存儲器容量在256K至512K字節(jié)之間的STM32F101xx和STM32F103xx微控 制器。互聯(lián)型產(chǎn)品是指STM32F105xx和STM32F107xx微控制器。 除非特別說明,本章描述的模塊適用于整個STM32F10xxx微控

2、制器系列。23.1SPI簡介在大容量產(chǎn)品和互聯(lián)型產(chǎn)品上,SPI接口可以配置為支持SPI協(xié)議或者支持I2S音頻協(xié)議。SPI接 口默認工作在SPI方式,可以通過軟件把功能從SPI模式切換到I2S模式。在小容量和中容量產(chǎn)品上,不支持I2S音頻協(xié)議。串行外設(shè)接口(SPI)允許芯片與外部設(shè)備以半/全雙工、同步、串行方式通信。此接口可以被配置 成主模式,并為外部從設(shè)備提供通信時鐘(SCK)。接口還能以多主配置方式工作。它可用于多種用途,包括使用一條雙向數(shù)據(jù)線的雙線單工同步傳輸,還可使用CRC校驗的可靠 通信。I2S也是一種3引腳的同步串行接口通訊協(xié)議。它支持四種音頻標(biāo)準(zhǔn),包括飛利浦I2S標(biāo)準(zhǔn),MSB 和L

3、SB對齊標(biāo)準(zhǔn),以及PCM標(biāo)準(zhǔn)。它在半雙工通訊中,可以工作在主和從2種模式下。當(dāng)它作為 主設(shè)備時,通過接口向外部的從設(shè)備提供時鐘信號。警告: 由于 SPI3/I2S3 的部 分引 腳 與 JTAG 引腳 共享 (SPI3_NSS/I2S3_WS 與 JTDI , SPI3_SCK/I2S3_CK與JTDO),因此這些引腳不受IO控制器控制,他們(在每次復(fù)位后) 被默認保留為JTAG用途。如果用戶想把引腳配置給SPI3/I2S3,必須(在調(diào)試時)關(guān)閉 JTAG并切換至SWD接口,或者(在標(biāo)準(zhǔn)應(yīng)用時)同時關(guān)閉JTAG和SWD接口。詳見第 8.3.5節(jié):JTAG/SWD復(fù)用功能重映射。23.2SPI和

4、I2S主要特征23.2.1 SPI特征 3線全雙工同步傳輸 帶或不帶第三根雙向數(shù)據(jù)線的雙線單工同步傳輸 8或16位傳輸幀格式選擇 主或從操作 支持多主模式 8個主模式波特率預(yù)分頻系數(shù)(最大為fPCLK/2) 從模式頻率 (最大為fPCLK/2) 主模式和從模式的快速通信 主模式和從模式下均可以由軟件或硬件進行NSS管理:主/從操作模式的動態(tài)改變 可編程的時鐘極性和相位 可編程的數(shù)據(jù)順序,MSB在前或LSB在前 可觸發(fā)中斷的專用發(fā)送和接收標(biāo)志 SPI總線忙狀態(tài)標(biāo)志 支持可靠通信的硬件CRC在發(fā)送模式下,CRC值可以被作為最后一個字節(jié)發(fā)送459/754在全雙工模式中對接收到的最后一個字節(jié)自動進行C

5、RC校驗 可觸發(fā)中斷的主模式故障、過載以及CRC錯誤標(biāo)志 支持DMA功能的1字節(jié)發(fā)送和接收緩沖器:產(chǎn)生發(fā)送和接受請求23.2.2I2S功能 單工通信(僅發(fā)送或接收) 主或者從操作 8位線性可編程預(yù)分頻器,獲得精確的音頻采樣頻率(8KHz到96kHz) 數(shù)據(jù)格式可以是16位,24位或者32位 音頻信道固定數(shù)據(jù)包幀為16位(16位數(shù)據(jù)幀)或32位(16、24或32位數(shù)據(jù)幀) 可編程的時鐘極性(穩(wěn)定態(tài)) 從發(fā)送模式下的下溢標(biāo)志位和主/從接收模式下的溢出標(biāo)志位 16位數(shù)據(jù)寄存器用來發(fā)送和接收,在通道兩端各有一個寄存器 支持的I2S協(xié)議:I2S飛利浦標(biāo)準(zhǔn)MSB對齊標(biāo)準(zhǔn)(左對齊)LSB對齊標(biāo)準(zhǔn)(右對齊)P

6、CM標(biāo)準(zhǔn)(16位通道幀上帶長或短幀同步或者16位數(shù)據(jù)幀擴展為32位通道幀) 數(shù)據(jù)方向總是MSB在先 發(fā)送和接收都具有DMA能力 主時鐘可以輸出到外部音頻設(shè)備,比率固定為256xFs(Fs為音頻采樣頻率) 在互聯(lián)型產(chǎn)品中,兩個I2S模塊(I2S2和I2S3)有一個專用的PLL(PLL3),產(chǎn)生更加精準(zhǔn)得時鐘23.3SPI功能描述23.3.1概述SPI的方框圖見下圖。 圖209SPI框圖通常SPI通過4個引腳與外部器件相連: MISO:主設(shè)備輸入/從設(shè)備輸出引腳。該引腳在從模式下發(fā)送數(shù)據(jù),在主模式下接收數(shù)據(jù)。 MOSI:主設(shè)備輸出/從設(shè)備輸入引腳。該引腳在主模式下發(fā)送數(shù)據(jù),在從模式下接收數(shù)據(jù)。 S

7、CK:串口時鐘,作為主設(shè)備的輸出,從設(shè)備的輸入 NSS:從設(shè)備選擇。這是一個可選的引腳,用來選擇主/從設(shè)備。它的功能是用來作為“片 選引腳”,讓主設(shè)備可以單獨地與特定從設(shè)備通訊,避免數(shù)據(jù)線上的沖突。從設(shè)備的NSS 引腳可以由主設(shè)備的一個標(biāo)準(zhǔn)I/O引腳來驅(qū)動。一旦被使能(SSOE位),NSS引腳也可以作為 輸出引腳,并在SPI處于主模式時拉低;此時,所有的SPI設(shè)備,如果它們的NSS引腳連接 到主設(shè)備的NSS引腳,則會檢測到低電平,如果它們被設(shè)置為NSS硬件模式,就會自動進 入從設(shè)備狀態(tài)。當(dāng)配置為主設(shè)備、NSS配置為輸入引腳(MSTR=1,SSOE=0)時,如果NSS 被拉低,則這個SPI設(shè)備進

8、入主模式失敗狀態(tài):即MSTR位被自動清除,此設(shè)備進入從模式 (參見)下圖是一個單主和單從設(shè)備互連的例子。圖210 單主和單從應(yīng)用1. 這里NSS引腳設(shè)置為輸入MOSI腳相互連接,MISO腳相互連接。這樣,數(shù)據(jù)在主和從之間串行地傳輸(MSB位在前)。通信總是由主設(shè)備發(fā)起。主設(shè)備通過MOSI腳把數(shù)據(jù)發(fā)送給從設(shè)備,從設(shè)備通過MISO引腳回傳 數(shù)據(jù)。這意味全雙工通信的數(shù)據(jù)輸出和數(shù)據(jù)輸入是用同一個時鐘信號同步的;時鐘信號由主設(shè) 備通過SCK腳提供。從選擇(NSS)腳管理有2種NSS模式: 軟件NSS模式:可以通過設(shè)置SPI_CR1寄存器的SSM位來使能這種模式(見圖211)。在這種 模式下NSS引腳可以

9、用作它用,而內(nèi)部NSS信號電平可以通過寫SPI_CR1的SSI位來驅(qū)動 硬件NSS模式,分兩種情況:NSS輸出被使能:當(dāng)STM32F10xxx工作為主SPI,并且NSS輸出已經(jīng)通過SPI_CR2寄存 器的SSOE位使能,這時NSS引腳被拉低,所有NSS引腳與這個主SPI的NSS引腳相連并 配置為硬件NSS的SPI設(shè)備,將自動變成從SPI設(shè)備。 當(dāng)一個SPI設(shè)備需要發(fā)送廣播數(shù)據(jù),它必須拉低NSS信號,以通知所有其它的設(shè)備它是主 設(shè)備;如果它不能拉低NSS,這意味著總線上有另外一個主設(shè)備在通信,這時將產(chǎn)生一個 硬件失敗錯誤(Hard Fault)。NSS輸出被關(guān)閉:允許操作于多主環(huán)境。111201

10、6-08-09 09:13:27-在理解下啊圖211 硬件/軟件的從選擇管理時鐘信號的相位和極性SPI_CR寄存器的CPOL和CPHA位,能夠組合成四種可能的時序關(guān)系。CPOL(時鐘極性)位控制 在沒有數(shù)據(jù)傳輸時時鐘的空閑狀態(tài)電平,此位對主模式和從模式下的設(shè)備都有效。如果CPOL被 清0,SCK引腳在空閑狀態(tài)保持低電平;如果CPOL被置1,SCK引腳在空閑狀態(tài)保持高電平。如果CPHA(時鐘相位)位被置1,SCK時鐘的第二個邊沿(CPOL位為0時就是下降沿,CPOL位 為1時就是上升沿)進行數(shù)據(jù)位的采樣,數(shù)據(jù)在第二個時鐘邊沿被鎖存。如果CPHA位被清0, SCK時鐘的第一邊沿(CPOL位為0時就

11、是下降沿,CPOL位為1時就是上升沿)進行數(shù)據(jù)位采 樣,數(shù)據(jù)在第一個時鐘邊沿被鎖存。470/754參照2009年12月 RM0008 Reference Manual 英文第10版 本譯文僅供參考,如有翻譯錯誤,請以英文原稿為準(zhǔn)。請讀者隨時注意在ST網(wǎng)站下載更新版本SPI接口STM32F10xxx參考手冊CPOL時鐘極性和CPHA時鐘相位的組合選擇數(shù)據(jù)捕捉的時鐘邊沿。 圖212顯示了SPI傳輸?shù)?種CPHA和CPOL位組合。此圖可以解釋為主設(shè)備和從設(shè)備的SCK腳、MISO腳、MOSI腳直接連接的主或從時序圖。注意:1. 在改變CPOL/CPHA位之前,必須清除SPE位將SPI禁止。2. 主和從

12、必須配置成相同的時序模式。3. SCK的空閑狀態(tài)必須和SPI_CR1寄存器指定的極性一致(CPOL為1時,空閑時應(yīng)上拉SCK為 高電平;CPOL為0時,空閑時應(yīng)下拉SCK為低電平)。4. 數(shù)據(jù)幀格式(8位或16位)由SPI_CR1寄存器的DFF位選擇,并且決定發(fā)送/接收的數(shù)據(jù)長度。圖212數(shù)據(jù)時鐘時序圖數(shù)據(jù)幀格式 根據(jù)SPI_CR1寄存器中的LSBFIRST位,輸出數(shù)據(jù)位時可以MSB在先也可以LSB在先。 根據(jù)SPI_CR1寄存器的DFF位,每個數(shù)據(jù)幀可以是8位或是16位。所選擇的數(shù)據(jù)幀格式對發(fā)送和/或接收都有效。23.3.2配置SPI為從模式在從模式下,SCK引腳用于接收從主設(shè)備來的串行時鐘

13、。SPI_CR1寄存器中BR2:0的設(shè)置不影 響數(shù)據(jù)傳輸速率。注:建議在主設(shè)備發(fā)送時鐘之前使能SPI從設(shè)備,否則可能會發(fā)生意外的數(shù)據(jù)傳輸。在通信時鐘的第 一個邊沿到來之前或正在進行的通信結(jié)束之前,從設(shè)備的數(shù)據(jù)寄存器必須就緒。在使能從設(shè)備 和主設(shè)備之前,通信時鐘的極性必須處于穩(wěn)定的數(shù)值。請按照以下步驟配置SPI為從模式:配置步驟1. 設(shè)置DFF位以定義數(shù)據(jù)幀格式為8位或16位。2. 選擇CPOL和CPHA位來定義數(shù)據(jù)傳輸和串行時鐘之間的相位關(guān)系(見圖212)。為保證正確 的數(shù)據(jù)傳輸,從設(shè)備和主設(shè)備的CPOL和CPHA位必須配置成相同的方式。3. 幀格式(SPI_CR1寄存器中的LSBFIRST位

14、定義的”MSB在前”還是”LSB在前”)必須與主設(shè)備 相同。4. 硬件模式下(參考從選擇(NSS)腳管理部分),在完整的數(shù)據(jù)幀(8位或16位)傳輸過程中, NSS引腳必須為低電平。在NSS軟件模式下,設(shè)置SPI_CR1寄存器中的SSM位并清除SSI 位。5. 清除MSTR位、設(shè)置SPE位(SPI_CR1寄存器),使相應(yīng)引腳工作于SPI模式下。 在這個配置中,MOSI引腳是數(shù)據(jù)輸入,MISO引腳是數(shù)據(jù)輸出。數(shù)據(jù)發(fā)送過程在寫操作中,數(shù)據(jù)字被并行地寫入發(fā)送緩沖器。當(dāng)從設(shè)備收到時鐘信號,并且在MOSI引腳上出現(xiàn)第一個數(shù)據(jù)位時,發(fā)送過程開始(譯注:此時 第一個位被發(fā)送出去)。余下的位(對于8位數(shù)據(jù)幀格式

15、,還有7位;對于16位數(shù)據(jù)幀格式,還有 15位)被裝進移位寄存器。當(dāng)發(fā)送緩沖器中的數(shù)據(jù)傳輸?shù)揭莆患拇嫫鲿r,SPI_SP寄存器的TXE 標(biāo)志被設(shè)置,如果設(shè)置了SPI_CR2寄存器的TXEIE位,將會產(chǎn)生中斷。數(shù)據(jù)接收過程對于接收器,當(dāng)數(shù)據(jù)接收完成時: 移位寄存器中的數(shù)據(jù)傳送到接收緩沖器,SPI_SR 寄存器中的RXNE標(biāo)志被設(shè)置。 如果設(shè)置了SPI_CR2寄存器中的RXNEIE位,則產(chǎn)生中斷。在最后一個采樣時鐘邊沿后,RXNE位被置1,移位寄存器中接收到的數(shù)據(jù)字節(jié)被傳送到接收緩 沖器。當(dāng)讀SPI_DR寄存器時,SPI設(shè)備返回這個接收緩沖器的數(shù)值。讀SPI_DR寄存器時,RXNE位被清除。23.3

16、.3配置SPI為主模式在主配置時,在SCK腳產(chǎn)生串行時鐘。配置步驟1. 通過SPI_CR1寄存器的BR2:0位定義串行時鐘波特率。2. 選擇CPOL和CPHA位,定義數(shù)據(jù)傳輸和串行時鐘間的相位關(guān)系(見圖212)。3. 設(shè)置DFF位來定義8位或16位數(shù)據(jù)幀格式。4. 配置SPI_CR1寄存器的LSBFIRST位定義幀格式。5. 如果需要NSS引腳工作在輸入模式,硬件模式下,在整個數(shù)據(jù)幀傳輸期間應(yīng)把NSS腳連接 到高電平;在軟件模式下,需設(shè)置SPI_CR1寄存器的SSM位和SSI位。如果NSS引腳工作 在輸出模式,則只需設(shè)置SSOE位。6. 必須設(shè)置MSTR位和SPE位(只當(dāng)NSS腳被連到高電平,

17、這些位才能保持置位)。 在這個配置中,MOSI引腳是數(shù)據(jù)輸出,而MISO引腳是數(shù)據(jù)輸入。數(shù)據(jù)發(fā)送過程當(dāng)寫入數(shù)據(jù)至發(fā)送緩沖器時,發(fā)送過程開始。 在發(fā)送第一個數(shù)據(jù)位時,數(shù)據(jù)字被并行地(通過內(nèi)部總線)傳入移位寄存器,而后串行地移出到MOSI腳上;MSB在先還是LSB在先,取決于SPI_CR1寄存器中的LSBFIRST位的設(shè)置。數(shù)據(jù)從發(fā)送緩沖器傳輸?shù)揭莆患拇嫫鲿rTXE標(biāo)志將被置位,如果設(shè)置了SPI_CR1寄存器中的TXEIE 位,將產(chǎn)生中斷。數(shù)據(jù)接收過程對于接收器來說,當(dāng)數(shù)據(jù)傳輸完成時: 傳送移位寄存器里的數(shù)據(jù)到接收緩沖器,并且RXNE標(biāo)志被置位。 如果設(shè)置了SPI_CR2寄存器中的RXNEIE位,則

18、產(chǎn)生中斷。 在最后采樣時鐘沿,RXNE位被設(shè)置,在移位寄存器中接收到的數(shù)據(jù)字被傳送到接收緩沖器。讀SPI_DR寄存器時,SPI設(shè)備返回接收緩沖器中的數(shù)據(jù)。讀SPI_DR寄存器將清除RXNE位。 一旦傳輸開始,如果下一個將發(fā)送的數(shù)據(jù)被放進了發(fā)送緩沖器,就可以維持一個連續(xù)的傳輸 流。在試圖寫發(fā)送緩沖器之前,需確認TXE標(biāo)志應(yīng)該為1。注:在NSS硬件模式下,從設(shè)備的NSS輸入由NSS引腳控制或另一個由軟件驅(qū)動的GPIO引腳控制。23.3.4配置SPI為單工通信SPI模塊能夠以兩種配置工作于單工方式: 1條時鐘線和1條雙向數(shù)據(jù)線; 1條時鐘線和1條數(shù)據(jù)線(只接收或只發(fā)送);1條時鐘線和1條雙向數(shù)據(jù)線(

19、BIDIMODE=1) 設(shè)置SPI_CR1寄存器中的BIDIMODE位而啟用此模式。在這個模式下,SCK引腳作為時鐘,主 設(shè)備使用MOSI引腳而從設(shè)備使用MISO引腳作為數(shù)據(jù)通信。傳輸?shù)姆较蛴蒘PI_CR1寄存器里的BIDIOE控制,當(dāng)這個位是1的時候,數(shù)據(jù)線是輸出,否則是輸入。1條時鐘和1條單向數(shù)據(jù)線(BIDIMODE=0)在這個模式下,SPI模塊可以或者作為只發(fā)送,或者作為只接收。 只發(fā)送模式類似于全雙工模式(BIDIMODE=0,RXONLY=0):數(shù)據(jù)在發(fā)送引腳(主模式時是 MOSI、從模式時是MISO)上傳輸,而接收引腳(主模式時是MISO、從模式時是MOSI)可以 作為通用的I/O

20、使用。此時,軟件不必理會接收緩沖器中的數(shù)據(jù)(如果讀出數(shù)據(jù)寄存器,它不 包含任何接收數(shù)據(jù))。 在只接收模式,可以通過設(shè)置SPI_CR2寄存器的RXONLY位而關(guān)閉SPI的輸出功能;此時, 發(fā)送引腳(主模式時是MOSI、從模式時是MISO)被釋放,可以作為其它功能使用。配置并使能SPI模塊為只接收模式的方式是: 在主模式時,一旦使能SPI,通信立即啟動,當(dāng)清除SPE位時立即停止當(dāng)前的接收。在此模 式下,不必讀取BSY標(biāo)志,在SPI通信期間這個標(biāo)志始終為1。 在從模式時,只要NSS被拉低(或在NSS軟件模式時,SSI位為0)同時SCK有時鐘脈沖,SPI就一直在接收。23.3.5數(shù)據(jù)發(fā)送與接收過程接收

21、與發(fā)送緩沖器在接收時,接收到的數(shù)據(jù)被存放在一個內(nèi)部的接收緩沖器中;在發(fā)送時,在被發(fā)送之前,數(shù)據(jù) 將首先被存放在一個內(nèi)部的發(fā)送緩沖器中。對SPI_DR寄存器的讀操作,將返回接收緩沖器的內(nèi)容;寫入SPI_DR寄存器的數(shù)據(jù)將被寫入發(fā) 送緩沖器中。SPI接口STM32F10xxx參考手冊主模式下開始傳輸 全雙工模式(BIDIMODE=0并且RXONLY=0)當(dāng)寫入數(shù)據(jù)到SPI_DR寄存器(發(fā)送緩沖器)后,傳輸開始;在傳送第一位數(shù)據(jù)的同時,數(shù)據(jù)被并行地從發(fā)送緩沖器傳送到8位的移位寄存器中, 然后按順序被串行地移位送到MOSI引腳上;與此同時,在MISO引腳上接收到的數(shù)據(jù),按順序被串行地移位進入8位的移位

22、寄存器 中,然后被并行地傳送到SPI_DR寄存器(接收緩沖器)中。 單向的只接收模式(BIDIMODE=0并且RXONLY=1)SPE=1時,傳輸開始;只有接收器被激活,在MISO引腳上接收到的數(shù)據(jù),按順序被串行地移位進入8位的移 位寄存器中,然后被并行地傳送到SPI_DR寄存器(接收緩沖器)中。 雙向模式,發(fā)送時(BIDIMODE=1并且BIDIOE=1)當(dāng)寫入數(shù)據(jù)到SPI_DR寄存器(發(fā)送緩沖器)后,傳輸開始;在傳送第一位數(shù)據(jù)的同時,數(shù)據(jù)被并行地從發(fā)送緩沖器傳送到8位的移位寄存器中, 然后按順序被串行地移位送到MOSI引腳上;不接收數(shù)據(jù)。 雙向模式,接收時(BIDIMODE=1并且BIDI

23、OE=0)SPE=1并且BIDIOE=0時,傳輸開始;在MOSI引腳上接收到的數(shù)據(jù),按順序被串行地移位進入8位的移位寄存器中,然后被 并行地傳送到SPI_DR寄存器(接收緩沖器)中。不激活發(fā)送器,沒有數(shù)據(jù)被串行地送到MOSI引腳上。從模式下開始傳輸 全雙工模式(BIDIMODE=0并且RXONLY=0)當(dāng)從設(shè)備接收到時鐘信號并且第一個數(shù)據(jù)位出現(xiàn)在它的MOSI時,數(shù)據(jù)傳輸開始,隨 后的數(shù)據(jù)位依次移動進入移位寄存器;與此同時,在傳輸?shù)谝粋€數(shù)據(jù)位時,發(fā)送緩沖器中的數(shù)據(jù)被并行地傳送到8位的移位 寄存器,隨后被串行地發(fā)送到MISO引腳上。軟件必須保證在SPI主設(shè)備開始數(shù)據(jù)傳 輸之前在發(fā)送寄存器中寫入要發(fā)

24、送的數(shù)據(jù)。 單向的只接收模式(BIDIMODE=0并且RXONLY=1)當(dāng)從設(shè)備接收到時鐘信號并且第一個數(shù)據(jù)位出現(xiàn)在它的MOSI時,數(shù)據(jù)傳輸開始,隨 后數(shù)據(jù)位依次移動進入移位寄存器;不啟動發(fā)送器,沒有數(shù)據(jù)被串行地傳送到MISO引腳上。 雙向模式,發(fā)送時(BIDIMODE=1并且BIDIOE=1)當(dāng)從設(shè)備接收到時鐘信號并且發(fā)送緩沖器中的第一個數(shù)據(jù)位被傳送到MISO引腳上的 時候,數(shù)據(jù)傳輸開始; 在第一個數(shù)據(jù)位被傳送到MISO引腳上的同時,發(fā)送緩沖器中要發(fā)送的數(shù)據(jù)被平行地 傳送到8位的移位寄存器中,隨后被串行地發(fā)送到MISO引腳上。軟件必須保證在SPI 主設(shè)備開始數(shù)據(jù)傳輸之前在發(fā)送寄存器中寫入要發(fā)

25、送的數(shù)據(jù);不接收數(shù)據(jù)。 雙向模式,接收時(BIDIMODE=1并且BIDIOE=0)當(dāng)從設(shè)備接收到時鐘信號并且第一個數(shù)據(jù)位出現(xiàn)在它的MOSI時,數(shù)據(jù)傳輸開始;從MISO引腳上接收到的數(shù)據(jù)被串行地傳送到8位的移位寄存器中,然后被平行地傳送 到SPI_DR寄存器(接收緩沖器);不啟動發(fā)送器,沒有數(shù)據(jù)被串行地傳送到MISO引腳上。SPI接口STM32F10xxx參考手冊處理數(shù)據(jù)的發(fā)送與接收當(dāng)數(shù)據(jù)從發(fā)送緩沖器傳送到移位寄存器時,設(shè)置TXE標(biāo)志(發(fā)送緩沖器空),它表示內(nèi)部的發(fā)送緩 沖器可以接收下一個數(shù)據(jù);如果在SPI_CR2寄存器中設(shè)置了TXEIE位,則此時會產(chǎn)生一個中 斷;寫入SPI_DR寄存器即可清

26、除TXE位。注:在寫入發(fā)送緩沖器之前,軟件必須確認TXE標(biāo)志為1,否則新的數(shù)據(jù)會覆蓋已經(jīng)在發(fā)送緩沖器 中的數(shù)據(jù)。 Txe為0時發(fā)送新數(shù)據(jù)在采樣時鐘的最后一個邊沿,當(dāng)數(shù)據(jù)被從移位寄存器傳送到接收緩沖器時,設(shè)置RXNE標(biāo)志(接 收緩沖器非空);它表示數(shù)據(jù)已經(jīng)就緒,可以從SPI_DR寄存器讀出;如果在SPI_CR2寄存器中 設(shè)置了RXNEIE位,則此時會產(chǎn)生一個中斷;讀出SPI_DR寄存器即可清除RXNIE標(biāo)志位。在一些配置中,傳輸最后一個數(shù)據(jù)時,可以使用BSY標(biāo)志等待數(shù)據(jù)傳輸?shù)慕Y(jié)束。 主或從模式下(BIDIMODE=0并且RXONLY=0)全雙工發(fā)送和接收過程模式 軟件必須遵循下述過程,發(fā)送和接收

27、數(shù)據(jù)(見圖213和圖214):1. 設(shè)置SPE位為1,使能SPI模塊;2. 在SPI_DR寄存器中寫入第一個要發(fā)送的數(shù)據(jù),這個操作會清除TXE標(biāo)志;3. 等待TXE=1,然后寫入第二個要發(fā)送的數(shù)據(jù)。等待RXNE=1,然后讀出SPI_DR寄存器并 獲得第一個接收到的數(shù)據(jù),讀SPI_DR的同時清除了RXNE位。重復(fù)這些操作,發(fā)送后續(xù) 的數(shù)據(jù)同時接收n-1個數(shù)據(jù);4. 等待RXNE=1,然后接收最后一個數(shù)據(jù);5. 等待TXE=1,在BSY=0之后關(guān)閉SPI模塊。 也可以在響應(yīng)RXNE或TXE標(biāo)志的上升沿產(chǎn)生的中斷的處理程序中實現(xiàn)這個過程。圖213主模式、全雙工模式下(BIDIMODE=0并且RXON

28、LY=0)連續(xù)傳輸時,TXE/RXNE/BSY 的變化示意圖圖214從模式、全雙工模式下(BIDIMODE=0并且RXONLY=0)連續(xù)傳輸時,TXE/RXNE/BSY 的變化示意圖只發(fā)送過程(BIDIMODE=0并且RXONLY=0)在此模式下,傳輸過程可以簡要說明如下,使用BSY位等待傳輸?shù)慕Y(jié)束(見圖215和圖216):1. 設(shè)置SPE位為1,使能SPI模塊;2. 在SPI_DR寄存器中寫入第一個要發(fā)送的數(shù)據(jù),這個操作會清除TXE標(biāo)志;3. 等待TXE=1,然后寫入第二個要發(fā)送的數(shù)據(jù)。重復(fù)這個操作,發(fā)送后續(xù)的數(shù)據(jù);4. 寫入最后一個數(shù)據(jù)到SPI_DR寄存器之后,等待TXE=1;然后等待BS

29、Y=0,這表示最后一 個數(shù)據(jù)的傳輸已經(jīng)完成。也可以在響應(yīng)TXE標(biāo)志的上升沿產(chǎn)生的中斷的處理程序中實現(xiàn)這個過程。注: 1. 對于不連續(xù)的傳輸,在寫入SPI_DR寄存器的操作與設(shè)置BSY位之間有2個APB時鐘周期的延 遲,因此在只發(fā)送模式下,寫入最后一個數(shù)據(jù)后,最好先等待TXE=1,然后再等待BSY=0。2 只發(fā)送模式下,在傳輸2個數(shù)據(jù)之后,由于不會讀出接收到的數(shù)據(jù),SPI_SR寄存器中的OVR位 會變?yōu)?。(譯注:軟件不必理會這個OVR標(biāo)志位)圖215主設(shè)備只發(fā)送模式(BIDIMODE=0并且RXONLY=0)下連續(xù)傳輸時,TXE/BSY變化示 意圖圖216從設(shè)備只發(fā)送模式(BIDIMODE=0

30、并且RXONLY=0)下連續(xù)傳輸時,TXE/BSY變化示意 圖雙向發(fā)送過程(BIDIMODE=1并且BIDIOE=1)在此模式下,操作過程類似于只發(fā)送模式,不同的是:在使能SPI模塊之前,需要在SPI_CR2寄 存器中同時設(shè)置BIDIMODE和BIDIOE位為1。 單向只接收模式(BIDIMODE=0并且RXONLY=1)在此模式下,傳輸過程可以簡要說明如下(見):1. 在SPI_CR2寄存器中,設(shè)置RXONLY=1;2. 設(shè)置SPE=1,使能SPI模塊:a) 主模式下,立刻產(chǎn)生SCK時鐘信號,在關(guān)閉SPI(SPE=0)之前,不斷地接收串行數(shù)據(jù);b) 從模式下,當(dāng)SPI主設(shè)備拉低NSS信號并產(chǎn)

31、生SCK時鐘時,接收串行數(shù)據(jù)。3. 等待RXNE=1,然后讀出SPI_DR寄存器以獲得收到的數(shù)據(jù)(同時會清除RXNE位)。重復(fù)這 個操作接收所有數(shù)據(jù)。也可以在響應(yīng)RXNE標(biāo)志的上升沿產(chǎn)生的中斷的處理程序中實現(xiàn)這個過程。注:如果在最后一個數(shù)據(jù)傳輸結(jié)束后關(guān)閉SPI模塊,請按照第23.3.8節(jié)的建議操作。圖217只接收模式(BIDIMODE=0并且RXONLY=1)下連續(xù)傳輸時,RXNE變化示意圖單向接收過程(BIDIMODE=1并且BIDIOE=0)在此模式下,操作過程類似于只接收模式,不同的是:在使能SPI模塊之前,需要在SPI_CR2寄 存器中設(shè)置BIDIMODE為1并清除BIDIOE位為0。

32、連續(xù)和非連續(xù)傳輸當(dāng)在主模式下發(fā)送數(shù)據(jù)時,如果軟件足夠快,能夠在檢測到每次TXE的上升沿(或TXE中斷),并 立即在正在進行的傳輸結(jié)束之前寫入SPI_DR寄存器,則能夠?qū)崿F(xiàn)連續(xù)的通信;此時,在每個數(shù) 據(jù)項的傳輸之間的SPI時鐘保持連續(xù),同時BSY位不會被清除。如果軟件不夠快,則會導(dǎo)致不連續(xù)的通信;這時,在每個數(shù)據(jù)傳輸之間會被清除(見下圖)。 在主模式的只接收模式下(RXONLY=1),通信總是連續(xù)的,而且BSY標(biāo)志始終為1。在從模式下,通信的連續(xù)性由SPI主設(shè)備決定。不管怎樣,即使通信是連續(xù)的,BSY標(biāo)志會在每 個數(shù)據(jù)項之間至少有一個SPI時鐘周期為低(見圖216)。圖218非連續(xù)傳輸發(fā)送(BI

33、DIMODE=0并且RXONLY=0)時,TXE/BSY變化示意圖23.3.6 CRC計算CRC校驗用于保證全雙工通信的可靠性。數(shù)據(jù)發(fā)送和數(shù)據(jù)接收分別使用單獨的CRC計算器。通 過對每一個接收位進行可編程的多項式運算來計算CRC。CRC的計算是在由SPI_CR1寄存器中 CPHA和CPOL位定義的采樣時鐘邊沿進行的。注意:該SPI接口提供了兩種CRC計算方法,取決于所選的發(fā)送和/或接收的數(shù)據(jù)幀格式:8位數(shù)據(jù)幀采 用CR8;16位數(shù)據(jù)幀采用CRC16。CRC計算是通過設(shè)置SPI_CR1寄存器中的CRCEN位啟用的。設(shè)置CRCEN位時同時復(fù)位CRC寄 存器(SPI_RXCRCR和SPI_TXCRC

34、R)。當(dāng)設(shè)置了SPI_CR1的CRCNEXT位,SPI_TXCRCR的內(nèi)容將在當(dāng)前字節(jié)發(fā)送之后發(fā)出。在傳輸SPI_TXCRCR的內(nèi)容時,如果在移位寄存器中收到的數(shù)值與SPI_RXCRCR的內(nèi)容不匹 配,則SPI_SR寄存器的CRCERR標(biāo)志位被置1。如果在TX緩沖器中還有數(shù)據(jù),CRC的數(shù)值僅在數(shù)據(jù)字節(jié)傳輸結(jié)束后傳送。在傳輸CRC期間,CRC計算器關(guān)閉,寄存器的數(shù)值保持不變。注意:請參考產(chǎn)品說明書,以確認有此功能(不是所有型號都有此功能)。SPI通信可以通過以下步驟使用CRC: 設(shè)置CPOL、CPHA、LSBFirst、BR、SSM、SSI和MSTR的值; 在SPI_CRCPR寄存器輸入多項式;

35、 通過設(shè)置SPI_CR1寄存器CRCEN位使能CRC計算,該操作也會清除寄存器SPI_RXCRCR 和SPI_TXCRC; 設(shè)置SPI_CR1寄存器的SPE位啟動SPI功能; 啟動通信并且維持通信,直到只剩最后一個字節(jié)或者半字; 在把最后一個字節(jié)或半字寫進發(fā)送緩沖器時,設(shè)置SPI_CR1的CRCNext位,指示硬件在發(fā) 送完成最后一個數(shù)據(jù)之后,發(fā)送CRC的數(shù)值。在發(fā)送CRC數(shù)值期間,停止CRC計算; 當(dāng)最后一個字節(jié)或半字被發(fā)送后,SPI發(fā)送CRC數(shù)值,CRCNext位被清除。同樣,接收到 的CRC與SPI_RXCRCR值進行比較,如果比較不相配,則設(shè)置SPI_SR上的CRCERR標(biāo)志 位,當(dāng)設(shè)

36、置了SPI_CR2寄存器的ERRIE時,則產(chǎn)生中斷。注意: 當(dāng)SPI模塊處于從設(shè)備模式時,請注意在時鐘穩(wěn)定之后再使能CRC計算,否則可能會得到錯誤的 CRC計算結(jié)果。事實上,只要設(shè)置了CRCEN位,只要在SCK引腳上有輸入時鐘,不管SPE位的 狀態(tài),都會進行CRC的計算。當(dāng)SPI時鐘頻率較高時,用戶在發(fā)送CRC時必須小心。在CRC傳輸期間,使用CPU的時間應(yīng)盡 可能少;為了避免在接收最后的數(shù)據(jù)和CRC時出錯,在發(fā)送CRC過程中應(yīng)禁止函數(shù)調(diào)用。必須 在發(fā)送/接收最后一個數(shù)據(jù)之前完成設(shè)置CRCNEXT位的操作。當(dāng)SPI時鐘頻率較高時,因為CPU的操作會影響SPI的帶寬,建議采用DMA模式以避免SP

37、I降低 的速度。當(dāng)STM32F10xxx配置為從模式并且使用了NSS硬件模式,NSS引腳應(yīng)該在數(shù)據(jù)傳輸和CRC傳輸 期間保持為低。當(dāng)配置SPI為從模式并且使用CRC的功能,即使NSS引腳為高時仍然會執(zhí)行CRC的計算(譯注: 當(dāng)NSS信號為高時,如果SCK引腳上有時鐘脈沖,則CRC計算會繼續(xù)執(zhí)行)。例如:當(dāng)主設(shè)備交 替地與多個從設(shè)備進行通信時,將會出現(xiàn)這種情況(譯注:此時要想辦法避免CRC的誤操作)。在不選中一個從設(shè)備(NSS信號為高)轉(zhuǎn)換到選中一個新的從設(shè)備(NSS信號為低)的時候,為了保 持主從設(shè)備端下次CRC計算結(jié)果的同步,應(yīng)該清除主從兩端的CRC數(shù)值。按照下述步驟清除CRC數(shù)值:1. 關(guān)

38、閉SPI模塊(SPE=0);2. 清除CRCEN位為0;3. 設(shè)置CRCEN位為1;4. 使能SPI模塊(SPE=1)。23.3.7狀態(tài)標(biāo)志應(yīng)用程序通過3個狀態(tài)標(biāo)志可以完全監(jiān)控SPI總線的狀態(tài)。發(fā)送緩沖器空閑標(biāo)志(TXE) 此標(biāo)志為1時表明發(fā)送緩沖器為空,可以寫下一個待發(fā)送的數(shù)據(jù)進入緩沖器中。當(dāng)寫入SPI_DR 時,TXE標(biāo)志被清除。接收緩沖器非空(RXNE) 此標(biāo)志為1時表明在接收緩沖器中包含有效的接收數(shù)據(jù)。讀SPI數(shù)據(jù)寄存器可以清除此標(biāo)志。 忙(Busy)標(biāo)志 BSY標(biāo)志由硬件設(shè)置與清除(寫入此位無效果),此標(biāo)志表明SPI通信層的狀態(tài)。當(dāng)它被設(shè)置為 1 時, 表明SPI正忙于通信,但有一個

39、例外:在主模式的雙向接收模式下 (MSTR=1、BDM=1并且BDOE=0),在接收期間BSY標(biāo)志保持為低。在軟件要關(guān)閉SPI模塊并進入停機模式(或關(guān)閉設(shè)備時鐘)之前,可以使用BSY標(biāo)志檢測傳輸是否 結(jié)束,這樣可以避免破壞最后一次傳輸,因此需要嚴(yán)格按照下述過程執(zhí)行。BSY標(biāo)志還可以用于在多主系統(tǒng)中避免寫沖突。除了主模式的雙向接收模式(MSTR=1、BDM=1并且BDOE=0),當(dāng)傳輸開始時,BSY標(biāo)志被 置1。以下情況時此標(biāo)志將被清除為0: 當(dāng)傳輸結(jié)束(主模式下,如果是連續(xù)通信的情況例外); 當(dāng)關(guān)閉SPI模塊; 當(dāng)產(chǎn)生主模式失效(MODF=1)。 如果通信不是連續(xù)的,則在每個數(shù)據(jù)項的傳輸之間,

40、BSY標(biāo)志為低。 當(dāng)通信是連續(xù)時: 主模式下:在整個傳輸過程中,BSY標(biāo)志保持為高; 從模式下:在每個數(shù)據(jù)項的傳輸之間,BSY標(biāo)志在一個SPI時鐘周期中為低。注:不要使用BSY標(biāo)志處理每一個數(shù)據(jù)項的發(fā)送和接收,最好使用TXE和RXNE標(biāo)志。23.3.8 關(guān)閉SPI當(dāng)通訊結(jié)束,可以通過關(guān)閉SPI模塊來終止通訊。清除SPE位即可關(guān)閉SPI。在某些配置下,如果再傳輸還未完成時,就關(guān)閉SPI模塊并進入停機模式,則可能導(dǎo)致當(dāng)前的傳 輸被破壞,而且BSY標(biāo)志也變得不可信。為了避免發(fā)生這種情況,關(guān)閉SPI模塊時,建議按照下述步驟操作:在主或從模式下的全雙工模式(BIDIMODE=0,RXONLY=0)1.

41、等待RXNE=1并接收最后一個數(shù)據(jù);2. 等待TXE=1;3. 等待BSY=0;4. 關(guān)閉SPI(SPE=0),最后進入停機模式(或關(guān)閉該模塊的時鐘)。 在主或從模式下的單向只發(fā)送模式(BIDIMODE=0,RXONLY=0)或雙向的發(fā)送模式 (BIDIMODE=1,BIDIOE=1)在SPI_DR寄存器中寫入最后一個數(shù)據(jù)后:1. 等待TXE=1;2. 等待BSY=0;3. 關(guān)閉SPI(SPE=0),最后進入停機模式(或關(guān)閉該模塊的時鐘)。 在主或從模式下的單向只接收模式(MSTR=1,BIDIMODE=0,RXONLY=1)或雙向 的接收模式(MSTR=1,BIDIMODE=1,BIDIOE

42、=0)這種情況需要特別地處理,以保證SPI不會開始一次新的傳輸:1. 等待倒數(shù)第二個(第n-1個)RXNE=1;2. 在關(guān)閉SPI(SPE=0)之前等待一個SPI時鐘周期(使用軟件延遲);3. 在進入停機模式(或關(guān)閉該模塊的時鐘)之前等待最后一個RXNE=1。注:在主模式下的單向只發(fā)送模式(MSTR=1,BDM=1,BDOE=0)時,傳輸過程中BSY標(biāo)志始終為 低。在從模式下的只接收模式(MSTR=0,BIDIMODE=0,RXONLY=1)或雙向的接收模 式(MSTR=0,BIDIMODE=1,BIDIOE=0)1. 可以在任何時候關(guān)閉SPI(SPE=0),SPI會在當(dāng)前的傳輸結(jié)束后被關(guān)閉;

43、2. 如果希望進入停機模式,在進入停機模式(或關(guān)閉該模塊的時鐘)之前必須首先等待BSY=0。23.3.9 利用DMA的SPI通信為了達到最大通信速度,需要及時往SPI發(fā)送緩沖器填數(shù)據(jù),同樣接收緩沖器中的數(shù)據(jù)也必須及 時讀走以防止溢出。為了方便高速率的數(shù)據(jù)傳輸,SPI實現(xiàn)了一種采用簡單的請求/應(yīng)答的DMA 機制。當(dāng)SPI_CR2寄存器上的對應(yīng)使能位被設(shè)置時,SPI模塊可以發(fā)出DMA傳輸請求。發(fā)送緩沖器和 接收緩沖器亦有各自的DMA請求(見)。 發(fā)送時,在每次TXE被設(shè)置為1時發(fā)出DMA請求,DMA控制器則寫數(shù)據(jù)至SPI_DR寄存 器,TXE標(biāo)志因此而被清除。 接收時,在每次RXNE被設(shè)置為1時發(fā)

44、出DMA請求,DMA控制器則從SPI_DR寄存器讀出數(shù) 據(jù),RXNE標(biāo)志因此而被清除。當(dāng)只使用SPI發(fā)送數(shù)據(jù)時,只需使能SPI的發(fā)送DMA通道。此時,因為沒有讀取收到的數(shù)據(jù),OVR被置為1(譯注:軟件不必理會這個標(biāo)志)。 當(dāng)只使用SPI接收數(shù)據(jù)時,只需使能SPI的接收DMA通道。482/754參照2009年12月 RM0008 Reference Manual 英文第10版 本譯文僅供參考,如有翻譯錯誤,請以英文原稿為準(zhǔn)。請讀者隨時注意在ST網(wǎng)站下載更新版本在發(fā)送模式下,當(dāng)DMA已經(jīng)傳輸了所有要發(fā)送的數(shù)據(jù)(DMA_ISR寄存器的TCIF標(biāo)志變?yōu)?)后, 可以通過監(jiān)視BSY標(biāo)志以確認SPI通信結(jié)

45、束,這樣可以避免在關(guān)閉SPI或進入停止模式時,破壞 最后一個數(shù)據(jù)的傳輸。因此軟件需要先等待TXE=1,然后等待BSY=0。注:在不連續(xù)的通信中,在寫數(shù)據(jù)到SPI_DR的操作與BSY位被置為1之間,有2個APB時鐘周期的 延遲,因此,在寫完最后一個數(shù)據(jù)后需要先等待TXE=1再等待BSY=0。圖219使用DMA發(fā)送圖220使用DMA接收帶CRC的DMA功能 當(dāng)使能SPI使用CRC檢驗并且啟用DMA模式時,在通信結(jié)束時,CRC字節(jié)的發(fā)送和接收是自動 完成的。數(shù)據(jù)和CRC傳輸結(jié)束時,SPI_SR寄存器的CRCERR標(biāo)志為1表示在傳輸期間發(fā)生錯誤。23.3.10 錯誤標(biāo)志主模式失效錯誤(MODF) 主模

46、式失效僅發(fā)生在:NSS引腳硬件模式管理下,主設(shè)備的NSS腳被拉低;或者在NSS引腳軟 件模式管理下,SSI位被置為0時;MODF位被自動置位。主模式失效對SPI設(shè)備有以下影響: MODF位被置為1,如果設(shè)置了ERRIE位,則產(chǎn)生SPI中斷; SPE位被清為0。這將停止一切輸出,并且關(guān)閉SPI接口; MSTR位被清為0,因此強迫此設(shè)備進入從模式。 下面的步驟用于清除MODF位:1. 當(dāng)MODF位被置為1時,執(zhí)行一次對SPI_SR寄存器的讀或?qū)懖僮鳎?. 然后寫SPI_CR1寄存器。 在有多個MCU的系統(tǒng)中,為了避免出現(xiàn)多個從設(shè)備的沖突,必須先拉高該主設(shè)備的NSS腳,再 對MODF位進行清零。在完

47、成清零之后,SPE和MSTR位可以恢復(fù)到它們的原始狀態(tài)。出于安全的考慮,當(dāng)MODF位為1時,硬件不允許設(shè)置SPE和MSTR位。 通常配置下,從設(shè)備的MODF位不能被置為1。然而,在多主配置里,一個設(shè)備可以在設(shè)置了MODF位的情況下,處于從設(shè)備模式;此時,MODF位表示可能出現(xiàn)了多主沖突。中斷程序可以執(zhí)行一個復(fù)位或返回到默認狀態(tài)來從錯誤狀態(tài)中恢復(fù)。溢出錯誤當(dāng)主設(shè)備已經(jīng)發(fā)送了數(shù)據(jù)字節(jié),而從設(shè)備還沒有清除前一個數(shù)據(jù)字節(jié)產(chǎn)生的RXNE時,即為溢出 錯誤。當(dāng)產(chǎn)生溢出錯誤時: OVR位被置為1;當(dāng)設(shè)置了ERRIE位時,則產(chǎn)生中斷。此時,接收器緩沖器的數(shù)據(jù)不是主設(shè)備發(fā)送的新數(shù)據(jù),讀SPI_DR寄存器返回的是

48、之前未讀的數(shù) 據(jù),所有隨后傳送的數(shù)據(jù)都被丟棄。依次讀出SPI_DR寄存器和SPI_SR寄存器可將OVR清除。CRC 錯誤 當(dāng)設(shè)置了SPI_CR寄存器上的CRCEN位時,CRC錯誤標(biāo)志用來核對接收數(shù)據(jù)的有效性。如果移 位寄存器中接收到的值(發(fā)送方發(fā)送的SPI_TXCRCR數(shù)值)與接收方SPI_RXCRCR寄存器中的數(shù)值不匹配,則SPI_SR寄存器上的CRCERR標(biāo)志被置位為1。23.3.11 SPI中斷表166SPI中斷請求中斷事件事件標(biāo)志使能控制位發(fā)送緩沖器空標(biāo)志TXETXEIE接收緩沖器非空標(biāo)志RXNERXNEIE主模式失效事件MODFERRIE溢出錯誤OVRCRC錯誤標(biāo)志CRCERR23.

49、4I2S功能描述小容量和中容量的STM32不支持I2S音頻協(xié)議。本節(jié)僅適用于大容量產(chǎn)品和互聯(lián)型產(chǎn)品。23.4.1I2S功能描述I2S的框圖如下圖所示:圖221I2S框圖通過將寄存器SPI_I2SCFGR的I2SMOD位置為1,即可使能I2S功能。此時,可以把SPI模塊用作I2S音頻接口。I2S接口與SPI接口使用大致相同的引腳、標(biāo)志和中斷。I2S與SPI共用3個引腳: SD:串行數(shù)據(jù)(映射至MOSI引腳),用來發(fā)送和接收2路時分復(fù)用通道的數(shù)據(jù); WS:字選(映射至NSS引腳),主模式下作為數(shù)據(jù)控制信號輸出,從模式下作為輸入; CK:串行時鐘(映射至SCK引腳),主模式下作為時鐘信號輸出,從模式

50、下作為輸入。在某些外部音頻設(shè)備需要主時鐘時,可以另有一個附加引腳輸出時鐘: MCK:主時鐘(獨立映射),在I2S配置為主模式,寄存器SPI_I2SPR的MCKOE位為1時,作 為輸出額外的時鐘信號引腳使用。輸出時鐘信號的頻率預(yù)先設(shè)置為256 × Fs,其中Fs是音 頻信號的采樣頻率。設(shè)置成主模式時,I2S使用自身的時鐘發(fā)生器來產(chǎn)生通信用的時鐘信號。這個時鐘發(fā)生器也是主 時鐘輸出的時鐘源。I2S模式下有2個額外的寄存器,一個是與時鐘發(fā)生器配置相關(guān)的寄存器 SPI_I2SPR,另一個是I2S通用配置寄存器SPI_I2SCFGR(可設(shè)置音頻標(biāo)準(zhǔn)、從/主模式、數(shù)據(jù)格 式、數(shù)據(jù)包幀、時鐘極性等

51、參數(shù))。在I2S模式下不使用寄存器SPI_CR1和所有的CRC寄存器。同樣,I2S模式下也不使用寄存器SPI_CR2的SSOE位,和寄存器SPI_SR的MODF位和CRCERR位。 I2S使用與SPI相同的寄存器SPI_DR用作16位寬模式數(shù)據(jù)傳輸。23.4.2支持的音頻協(xié)議三線總線支持2個聲道上音頻數(shù)據(jù)的時分復(fù)用:左聲道和右聲道,但是只有一個16位寄存器用作 發(fā)送或接收。因此,軟件必須在對數(shù)據(jù)寄存器寫入數(shù)據(jù)時,根據(jù)當(dāng)前傳輸中的聲道寫入相應(yīng)的 數(shù)據(jù);同樣,在讀取寄存器數(shù)據(jù)時,通過檢查寄存器SPI_SR的CHSIDE位來判明接收到的數(shù)據(jù) 屬于哪個聲道。左聲道總是先于右聲道發(fā)送數(shù)據(jù)(CHSIDE位

52、在PCM協(xié)議下無意義)。有四種可用的數(shù)據(jù)和包幀組合??梢酝ㄟ^以下四種數(shù)據(jù)格式發(fā)送數(shù)據(jù): 16位數(shù)據(jù)打包進16位幀 16位數(shù)據(jù)打包進32位幀 24位數(shù)據(jù)打包進32位幀 32位數(shù)據(jù)打包進32位幀在使用16位數(shù)據(jù)擴展到32位幀時,前16位(MSB)是有意義的數(shù)據(jù),后16位(LSB)被強制為0,該 操作不需要軟件干預(yù),也不需要有DMA請求(僅需要一次讀/寫操作)。24位和32位數(shù)據(jù)幀需要CPU對寄存器SPI_DR進行2次讀或?qū)懖僮?,在使用DMA時,需要2次 DMA傳輸。對于24位數(shù)據(jù),擴展到32位后,最低8位由硬件置0。對于所有的數(shù)據(jù)格式和通訊標(biāo)準(zhǔn),總是先發(fā)送最高位(MSB)。I2S接口支持四種音頻標(biāo)

53、準(zhǔn),可以通過設(shè)置寄存器SPI_I2SCFGR的I2SSTD1:0位和PCMSYNC位來選擇。I2S飛利浦標(biāo)準(zhǔn) 在此標(biāo)準(zhǔn)下,引腳WS用來指示正在發(fā)送的數(shù)據(jù)屬于哪個聲道。在發(fā)送第一位數(shù)據(jù)(MSB)前1個 時鐘周期,該引腳即為有效。圖222I2S飛利浦協(xié)議波形(16/32位全精度,CPOL = 0)發(fā)送方在時鐘信號(CK)的下降沿改變數(shù)據(jù),接收方在上升沿讀取數(shù)據(jù)。WS信號也在時鐘信號的 下降沿變化。圖223I2S飛利浦協(xié)議標(biāo)準(zhǔn)波形(24位幀,CPOL = 0)此模式需要對寄存器SPI_DR進行2次讀或?qū)懖僮鳌?在發(fā)送模式下:如果需要發(fā)送0x8EAA33(24位): 圖224發(fā)送0x8EAA33 在接

54、收模式下:如果接收0x8EAA33: 圖225接收0x8EAA33圖226I2S飛利浦協(xié)議標(biāo)準(zhǔn)波形(16位擴展至32位包幀,CPOL = 0)在I2S配置階段,如果選擇將16位數(shù)據(jù)擴展到32位聲道幀,只需要訪問一次寄存器SPI_DR。用 來擴展到32位的低16位被硬件置為0x0000。如果待傳輸或者接收的數(shù)據(jù)是0x76A3(擴展到32位是0x76A30000),需要的操作如下圖所示。 圖227示例在發(fā)送時需要將MSB寫入寄存器SPI_DR;標(biāo)志位TXE為1表示可以寫入新的數(shù)據(jù),如果允許了 相應(yīng)的中斷,則可以產(chǎn)生中斷。發(fā)送是由硬件完成的,即使還未發(fā)送出后16位的0x0000,也會 設(shè)置TXE并產(chǎn)

55、生相應(yīng)的中斷。接收時,每次收到高16位半字(MSB)后,標(biāo)志位RXNE置1,如果允許了相應(yīng)的中斷,則可以產(chǎn) 生中斷。這樣,在2次讀和寫之間有更多的時間,可以防止下溢或者上溢的情況發(fā)生。 MSB對齊標(biāo)準(zhǔn) 在此標(biāo)準(zhǔn)下,WS信號和第一個數(shù)據(jù)位,即最高位(MSB)同時產(chǎn)生。圖228MSB對齊16位或32位全精度,CPOL = 0發(fā)送方在時鐘信號的下降沿改變數(shù)據(jù);接收方是在上升沿讀取數(shù)據(jù)。 圖229MSB對齊24位數(shù)據(jù),CPOL = 0圖230MSB對齊16位數(shù)據(jù)擴展到32位包幀,CPOL = 0LSB對齊標(biāo)準(zhǔn) 此標(biāo)準(zhǔn)與MSB對齊標(biāo)準(zhǔn)類似(在16位或32位全精度幀格式下無區(qū)別)。 圖231LSB對齊16位或32位全精度,CPOL = 0圖232LSB對齊24位數(shù)據(jù),CPOL = 0 在發(fā)送模式下如果要發(fā)送數(shù)據(jù)0x3478AE,需要通過軟件或者DMA對寄存器SPI_DR進行2次寫操作。操作流 程如下圖所示。SPI接口STM3

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論