




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
23 串行外設(shè)接口(SPI)小容量產(chǎn)品是指閃存存儲(chǔ)器容量在16K至32K字節(jié)之間的STM32F101xx、STM32F102xx和STM32F103xx微控制器。中容量產(chǎn)品是指閃存存儲(chǔ)器容量在64K至128K字節(jié)之間的STM32F101xx、STM32F102xx和STM32F103xx微控制器。大容量產(chǎn)品是指閃存存儲(chǔ)器容量在256K至512K字節(jié)之間的STM32F101xx和STM32F103xx微控制器?;ヂ?lián)型產(chǎn)品是指STM32F105xx和STM32F107xx微控制器。除非特別說(shuō)明,本章描述的模塊合用于整個(gè)STM32F10xxx微控制器系列。在大容量產(chǎn)品和互聯(lián)型產(chǎn)品上,SPI接口可以配置為支持SPI協(xié)議或者支持I2S音頻協(xié)議。SPI接口默認(rèn)工作在SPI方式,可以通過(guò)軟件把功能從SPI模式切換到I2S模式。在小容量和中容量產(chǎn)品上,不支持I2S音頻協(xié)議。串行外設(shè)接口(SPI)允許芯片與外部設(shè)備以半/全雙工、同步、串行方式通信。此接口可以被配置成主模式,并為外部從設(shè)備提供通信時(shí)鐘(SCK)。接口還能以多主配置方式工作。它可用于多種用途,涉及使用一條雙向數(shù)據(jù)線的雙線單工同步傳輸,還可使用CRC校驗(yàn)的可靠通信。I2S也是一種3引腳的同步串行接口通訊協(xié)議。它支持四種音頻標(biāo)準(zhǔn),涉及飛利浦I2S標(biāo)準(zhǔn),MSB和LSB對(duì)齊標(biāo)準(zhǔn),以及PCM標(biāo)準(zhǔn)。它在半雙工通訊中,可以工作在主和從2種模式下。當(dāng)它作為主設(shè)備時(shí),通過(guò)接口向外部的從設(shè)備提供時(shí)鐘信號(hào)。警告:由于SPI3/I2S3的部分引腳與JTAG引腳共享(SPI3_NSS/I2S3_WS與JTDI,SPI3_SCK/I2S3_CK與JTDO),因此這些引腳不受IO控制器控制,他們(在每次復(fù)位后)被默認(rèn)保存為JTAG用途。假如用戶想把引腳配置給SPI3/I2S3,必須(在調(diào)試時(shí))關(guān)閉JTAG并切換至SWD接口,或者(在標(biāo)準(zhǔn)應(yīng)用時(shí))同時(shí)關(guān)閉JTAG和SWD接口。詳見(jiàn)第8.3.5節(jié):JTAG/SWD復(fù)用功能重映射。SPI特性●3線全雙工同步傳輸●帶或不帶第三根雙向數(shù)據(jù)線的雙線單工同步傳輸●8或16位傳輸幀格式選擇●主或從操作●支持多主模式●8個(gè)主模式波特率預(yù)分頻系數(shù)(最大為fPCLK/2)●從模式頻率(最大為fPCLK/2)●主模式和從模式的快速通信●主模式和從模式下均可以由軟件或硬件進(jìn)行NSS管理:主/從操作模式的動(dòng)態(tài)改變●可編程的時(shí)鐘極性和相位●可編程的數(shù)據(jù)順序,MSB在前或LSB在前●可觸發(fā)中斷的專用發(fā)送和接受標(biāo)志●SPI總線忙狀態(tài)標(biāo)志●支持可靠通信的硬件CRC─ 在發(fā)送模式下,CRC值可以被作為最后一個(gè)字節(jié)發(fā)送─ 在全雙工模式中對(duì)接受到的最后一個(gè)字節(jié)自動(dòng)進(jìn)行CRC校驗(yàn)●可觸發(fā)中斷的主模式故障、過(guò)載以及CRC錯(cuò)誤標(biāo)志●支持DMA功能的1字節(jié)發(fā)送和接受緩沖器:產(chǎn)生發(fā)送和接受請(qǐng)求23.2.2 I2S功能●單工通信(僅發(fā)送或接受)●主或者從操作●8位線性可編程預(yù)分頻器,獲得精確的音頻采樣頻率(8KHz到96kHz)●數(shù)據(jù)格式可以是16位,24位或者32位●音頻信道固定數(shù)據(jù)包幀為16位(16位數(shù)據(jù)幀)或32位(16、24或32位數(shù)據(jù)幀)●可編程的時(shí)鐘極性(穩(wěn)定態(tài))●從發(fā)送模式下的下溢標(biāo)志位和主/從接受模式下的溢出標(biāo)志位●16位數(shù)據(jù)寄存器用來(lái)發(fā)送和接受,在通道兩端各有一個(gè)寄存器●支持的I2S協(xié)議:─ I2S飛利浦標(biāo)準(zhǔn)─ MSB對(duì)齊標(biāo)準(zhǔn)(左對(duì)齊)─ LSB對(duì)齊標(biāo)準(zhǔn)(右對(duì)齊)─ PCM標(biāo)準(zhǔn)(16位通道幀上帶長(zhǎng)或短幀同步或者16位數(shù)據(jù)幀擴(kuò)展為32位通道幀)●數(shù)據(jù)方向總是MSB在先●發(fā)送和接受都具有DMA能力●主時(shí)鐘可以輸出到外部音頻設(shè)備,比率固定為256xFs(Fs為音頻采樣頻率)●在互聯(lián)型產(chǎn)品中,兩個(gè)I2S模塊(I2S2和I2S3)有一個(gè)專用的PLL(PLL3),產(chǎn)生更加精確得時(shí)鐘23.3.1 概述SPI的方框圖見(jiàn)下圖。SPI框圖通常SPI通過(guò)4個(gè)引腳與外部器件相連:●MISO:主設(shè)備輸入/從設(shè)備輸出引腳。該引腳在從模式下發(fā)送數(shù)據(jù),在主模式下接受數(shù)據(jù)?!馦OSI:主設(shè)備輸出/從設(shè)備輸入引腳。該引腳在主模式下發(fā)送數(shù)據(jù),在從模式下接受數(shù)據(jù)。●SCK:串口時(shí)鐘,作為主設(shè)備的輸出,從設(shè)備的輸入●NSS:從設(shè)備選擇。這是一個(gè)可選的引腳,用來(lái)選擇主/從設(shè)備。它的功能是用來(lái)作為“片選引腳”,讓主設(shè)備可以單獨(dú)地與特定從設(shè)備通訊,避免數(shù)據(jù)線上的沖突。從設(shè)備的NSS引腳可以由主設(shè)備的一個(gè)標(biāo)準(zhǔn)I/O引腳來(lái)驅(qū)動(dòng)。一旦被使能(SSOE位),NSS引腳也可以作為輸出引腳,并在SPI處在主模式時(shí)拉低;此時(shí),所有的SPI設(shè)備,假如它們的NSS引腳連接到主設(shè)備的NSS引腳,則會(huì)檢測(cè)到低電平,假如它們被設(shè)立為NSS硬件模式,就會(huì)自動(dòng)進(jìn)入從設(shè)備狀態(tài)。當(dāng)配置為主設(shè)備、NSS配置為輸入引腳(MSTR=1,SSOE=0)時(shí),假如NSS被拉低,則這個(gè)SPI設(shè)備進(jìn)入主模式失敗狀態(tài):即MSTR位被自動(dòng)清除,此設(shè)備進(jìn)入從模式(參見(jiàn))下圖是一個(gè)單主和單從設(shè)備互連的例子。圖210單主和單從應(yīng)用1.這里NSS引腳設(shè)立為輸入MOSI腳互相連接,MISO腳互相連接。這樣,數(shù)據(jù)在主和從之間串行地傳輸(MSB位在前)。通信總是由主設(shè)備發(fā)起。主設(shè)備通過(guò)MOSI腳把數(shù)據(jù)發(fā)送給從設(shè)備,從設(shè)備通過(guò)MISO引腳回傳數(shù)據(jù)。這意味全雙工通信的數(shù)據(jù)輸出和數(shù)據(jù)輸入是用同一個(gè)時(shí)鐘信號(hào)同步的;時(shí)鐘信號(hào)由主設(shè)備通過(guò)SCK腳提供。─ NSS輸出被關(guān)閉:允許操作于多主環(huán)境。1112023-08-0909:13:27--------------------------------------------在理解下啊圖211硬件/1112023-08-0909:13:27--------------------------------------------在理解下啊時(shí)鐘信號(hào)的相位和極性SPI_CR寄存器的CPOL和CPHA位,可以組合成四種也許的時(shí)序關(guān)系。CPOL(時(shí)鐘極性)位控制在沒(méi)有數(shù)據(jù)傳輸時(shí)時(shí)鐘的空閑狀態(tài)電平,此位對(duì)主模式和從模式下的設(shè)備都有效。假如CPOL被清’0’,SCK引腳在空閑狀態(tài)保持低電平;假如CPOL被置’1’,SCK引腳在空閑狀態(tài)保持高電平。假如CPHA(時(shí)鐘相位)位被置’1’,SCK時(shí)鐘的第二個(gè)邊沿(CPOL位為0時(shí)就是下降沿,CPOL位為’1’時(shí)就是上升沿)進(jìn)行數(shù)據(jù)位的采樣,數(shù)據(jù)在第二個(gè)時(shí)鐘邊沿被鎖存。假如CPHA位被清’0’,SCK時(shí)鐘的第一邊沿(CPOL位為’0’時(shí)就是下降沿,CPOL位為’1’時(shí)就是上升沿)進(jìn)行數(shù)據(jù)位采樣,數(shù)據(jù)在第一個(gè)時(shí)鐘邊沿被鎖存。CPOL時(shí)鐘極性和CPHA時(shí)鐘相位的組合選擇數(shù)據(jù)捕獲的時(shí)鐘邊沿。圖212顯示了SPI傳輸?shù)?種CPHA和CPOL位組合。此圖可以解釋為主設(shè)備和從設(shè)備的SCK腳、MISO腳、MOSI腳直接連接的主或從時(shí)序圖。注意: 1.2.主和從必須配置成相同的時(shí)序模式。3.高電平;CPOL為’0’時(shí),空閑時(shí)應(yīng)下拉SCK為低電平)。4.數(shù)據(jù)時(shí)鐘時(shí)序圖數(shù)據(jù)幀格式根據(jù)SPI_CR1寄存器中的LSBFIRST位,輸出數(shù)據(jù)位時(shí)可以MSB在先也可以LSB在先。根據(jù)SPI_CR1寄存器的DFF位,每個(gè)數(shù)據(jù)幀可以是8位或是16位。所選擇的數(shù)據(jù)幀格式對(duì)發(fā)送和/或接受都有效。23.3.2 配置SPI為從模式在從模式下,SCK引腳用于接受從主設(shè)備來(lái)的串行時(shí)鐘。SPI_CR1寄存器中BR[2:0]的設(shè)立不影響數(shù)據(jù)傳輸速率。注: 一個(gè)邊沿到來(lái)之前或正在進(jìn)行的通信結(jié)束之前,從設(shè)備的數(shù)據(jù)寄存器必須就緒。在使能從設(shè)備和主設(shè)備之前,通信時(shí)鐘的極性必須處在穩(wěn)定的數(shù)值。請(qǐng)按照以下環(huán)節(jié)配置SPI為從模式:配置環(huán)節(jié)1.設(shè)立DFF位以定義數(shù)據(jù)幀格式為8位或16位。2.選擇CPOL和CPHA位來(lái)定義數(shù)據(jù)傳輸和串行時(shí)鐘之間的相位關(guān)系(見(jiàn)圖212)。為保證對(duì)的的數(shù)據(jù)傳輸,從設(shè)備和主設(shè)備的CPOL和CPHA位必須配置成相同的方式。3.幀格式(SPI_CR1寄存器中的LSBFIRST位定義的”MSB在前”還是”LSB在前”)必須與主設(shè)備相同。4.硬件模式下(參考從選擇(NSS)腳管理部分),在完整的數(shù)據(jù)幀(8位或16位)傳輸過(guò)程中,NSS引腳必須為低電平。在NSS軟件模式下,設(shè)立SPI_CR1寄存器中的SSM位并清除SSI位。5.清除MSTR位、設(shè)立SPE位(SPI_CR1寄存器),使相應(yīng)引腳工作于SPI模式下。在這個(gè)配置中,MOSI引腳是數(shù)據(jù)輸入,MISO引腳是數(shù)據(jù)輸出。數(shù)據(jù)發(fā)送過(guò)程在寫(xiě)操作中,數(shù)據(jù)字被并行地寫(xiě)入發(fā)送緩沖器。當(dāng)從設(shè)備收屆時(shí)鐘信號(hào),并且在MOSI引腳上出現(xiàn)第一個(gè)數(shù)據(jù)位時(shí),發(fā)送過(guò)程開(kāi)始(譯注:此時(shí)第一個(gè)位被發(fā)送出去)。余下的位(對(duì)于8位數(shù)據(jù)幀格式,尚有7位;對(duì)于16位數(shù)據(jù)幀格式,尚有15位)被裝進(jìn)移位寄存器。當(dāng)發(fā)送緩沖器中的數(shù)據(jù)傳輸?shù)揭莆患拇嫫鲿r(shí),SPI_SP寄存器的TXE標(biāo)志被設(shè)立,假如設(shè)立了SPI_CR2寄存器的TXEIE位,將會(huì)產(chǎn)生中斷。數(shù)據(jù)接受過(guò)程對(duì)于接受器,當(dāng)數(shù)據(jù)接受完畢時(shí):●移位寄存器中的數(shù)據(jù)傳送到接受緩沖器,SPI_SR寄存器中的RXNE標(biāo)志被設(shè)立?!窦偃缭O(shè)立了SPI_CR2寄存器中的RXNEIE位,則產(chǎn)生中斷。在最后一個(gè)采樣時(shí)鐘邊沿后,RXNE位被置’1’,移位寄存器中接受到的數(shù)據(jù)字節(jié)被傳送到接受緩沖器。當(dāng)讀SPI_DR寄存器時(shí),SPI設(shè)備返回這個(gè)接受緩沖器的數(shù)值。讀SPI_DR寄存器時(shí),RXNE位被清除。23.3.3 配置SPI為主模式在主配置時(shí),在SCK腳產(chǎn)生串行時(shí)鐘。配置環(huán)節(jié)1.通過(guò)SPI_CR1寄存器的BR[2:0]位定義串行時(shí)鐘波特率。2.選擇CPOL和CPHA位,定義數(shù)據(jù)傳輸和串行時(shí)鐘間的相位關(guān)系(見(jiàn)圖212)。3.設(shè)立DFF位來(lái)定義8位或16位數(shù)據(jù)幀格式。4.配置SPI_CR1寄存器的LSBFIRST位定義幀格式。5.假如需要NSS引腳工作在輸入模式,硬件模式下,在整個(gè)數(shù)據(jù)幀傳輸期間應(yīng)把NSS腳連接到高電平;在軟件模式下,需設(shè)立SPI_CR1寄存器的SSM位和SSI位。假如NSS引腳工作在輸出模式,則只需設(shè)立SSOE位。6.必須設(shè)立MSTR位和SPE位(只當(dāng)NSS腳被連到高電平,這些位才干保持置位)。在這個(gè)配置中,MOSI引腳是數(shù)據(jù)輸出,而MISO引腳是數(shù)據(jù)輸入。數(shù)據(jù)發(fā)送過(guò)程當(dāng)寫(xiě)入數(shù)據(jù)至發(fā)送緩沖器時(shí),發(fā)送過(guò)程開(kāi)始。在發(fā)送第一個(gè)數(shù)據(jù)位時(shí),數(shù)據(jù)字被并行地(通過(guò)內(nèi)部總線)傳入移位寄存器,而后串行地移出到MOSI腳上;MSB在先還是LSB在先,取決于SPI_CR1寄存器中的LSBFIRST位的設(shè)立。數(shù)據(jù)從發(fā)送緩沖器傳輸?shù)揭莆患拇嫫鲿r(shí)TXE標(biāo)志將被置位,假如設(shè)立了SPI_CR1寄存器中的TXEIE位,將產(chǎn)生中斷。數(shù)據(jù)接受過(guò)程對(duì)于接受器來(lái)說(shuō),當(dāng)數(shù)據(jù)傳輸完畢時(shí):●傳送移位寄存器里的數(shù)據(jù)到接受緩沖器,并且RXNE標(biāo)志被置位?!窦偃缭O(shè)立了SPI_CR2寄存器中的RXNEIE位,則產(chǎn)生中斷。在最后采樣時(shí)鐘沿,RXNE位被設(shè)立,在移位寄存器中接受到的數(shù)據(jù)字被傳送到接受緩沖器。讀SPI_DR寄存器時(shí),SPI設(shè)備返回接受緩沖器中的數(shù)據(jù)。讀SPI_DR寄存器將清除RXNE位。一旦傳輸開(kāi)始,假如下一個(gè)將發(fā)送的數(shù)據(jù)被放進(jìn)了發(fā)送緩沖器,就可以維持一個(gè)連續(xù)的傳輸流。在試圖寫(xiě)發(fā)送緩沖器之前,需確認(rèn)TXE標(biāo)志應(yīng)當(dāng)為’1’。注: 在NSS硬件模式下,從設(shè)備的NSS輸入由NSS引腳控制或另一個(gè)由軟件驅(qū)動(dòng)的GPIO引腳控制。23.3.4 配置SPI為單工通信SPI模塊可以以兩種配置工作于單工方式:●1條時(shí)鐘線和1條雙向數(shù)據(jù)線;●1條時(shí)鐘線和1條數(shù)據(jù)線(只接受或只發(fā)送);1條時(shí)鐘線和1條雙向數(shù)據(jù)線(BIDIMODE=1)設(shè)立SPI_CR1寄存器中的BIDIMODE位而啟用此模式。在這個(gè)模式下,SCK引腳作為時(shí)鐘,主設(shè)備使用MOSI引腳而從設(shè)備使用MISO引腳作為數(shù)據(jù)通信。傳輸?shù)姆较蛴蒘PI_CR1寄存器里的BIDIOE控制,當(dāng)這個(gè)位是’1’的時(shí)候,數(shù)據(jù)線是輸出,否則是輸入。1條時(shí)鐘和1條單向數(shù)據(jù)線(BIDIMODE=0)在這個(gè)模式下,SPI模塊可以或者作為只發(fā)送,或者作為只接受?!裰话l(fā)送模式類似于全雙工模式(BIDIMODE=0,RXONLY=0):數(shù)據(jù)在發(fā)送引腳(主模式時(shí)是MOSI、從模式時(shí)是MISO)上傳輸,而接受引腳(主模式時(shí)是MISO、從模式時(shí)是MOSI)可以作為通用的I/O使用。此時(shí),軟件不必理睬接受緩沖器中的數(shù)據(jù)(假如讀出數(shù)據(jù)寄存器,它不包含任何接受數(shù)據(jù))?!裨谥唤邮苣J?,可以通過(guò)設(shè)立SPI_CR2寄存器的RXONLY位而關(guān)閉SPI的輸出功能;此時(shí),發(fā)送引腳(主模式時(shí)是MOSI、從模式時(shí)是MISO)被釋放,可以作為其它功能使用。配置并使能SPI模塊為只接受模式的方式是:●在主模式時(shí),一旦使能SPI,通信立即啟動(dòng),當(dāng)清除SPE位時(shí)立即停止當(dāng)前的接受。在此模式下,不必讀取BSY標(biāo)志,在SPI通信期間這個(gè)標(biāo)志始終為’1’?!裨趶哪J綍r(shí),只要NSS被拉低(或在NSS軟件模式時(shí),SSI位為’0’)同時(shí)SCK有時(shí)鐘脈沖,SPI就一直在接受。23.3.5 數(shù)據(jù)發(fā)送與接受過(guò)程接受與發(fā)送緩沖器在接受時(shí),接受到的數(shù)據(jù)被存放在一個(gè)內(nèi)部的接受緩沖器中;在發(fā)送時(shí),在被發(fā)送之前,數(shù)據(jù)將一方面被存放在一個(gè)內(nèi)部的發(fā)送緩沖器中。對(duì)SPI_DR寄存器的讀操作,將返回接受緩沖器的內(nèi)容;寫(xiě)入SPI_DR寄存器的數(shù)據(jù)將被寫(xiě)入發(fā)送緩沖器中。主模式下開(kāi)始傳輸全雙工模式(BIDIMODE=0并且RXONLY=0)─ 當(dāng)寫(xiě)入數(shù)據(jù)到SPI_DR寄存器(發(fā)送緩沖器)后,傳輸開(kāi)始;─ 在傳送第一位數(shù)據(jù)的同時(shí),數(shù)據(jù)被并行地從發(fā)送緩沖器傳送到8位的移位寄存器中,然后按順序被串行地移位送到MOSI引腳上;─ 與此同時(shí),在MISO引腳上接受到的數(shù)據(jù),按順序被串行地移位進(jìn)入8位的移位寄存器中,然后被并行地傳送到SPI_DR寄存器(接受緩沖器)中?!駟蜗虻闹唤邮苣J?BIDIMODE=0并且RXONLY=1)─ SPE=1時(shí),傳輸開(kāi)始;─ 只有接受器被激活,在MISO引腳上接受到的數(shù)據(jù),按順序被串行地移位進(jìn)入8位的移位寄存器中,然后被并行地傳送到SPI_DR寄存器(接受緩沖器)中。●雙向模式,發(fā)送時(shí)(BIDIMODE=1并且BIDIOE=1)─ 當(dāng)寫(xiě)入數(shù)據(jù)到SPI_DR寄存器(發(fā)送緩沖器)后,傳輸開(kāi)始;─ 在傳送第一位數(shù)據(jù)的同時(shí),數(shù)據(jù)被并行地從發(fā)送緩沖器傳送到8位的移位寄存器中,然后按順序被串行地移位送到MOSI引腳上;─ 不接受數(shù)據(jù)?!耠p向模式,接受時(shí)(BIDIMODE=1并且BIDIOE=0)─ SPE=1并且BIDIOE=0時(shí),傳輸開(kāi)始;─ 在MOSI引腳上接受到的數(shù)據(jù),按順序被串行地移位進(jìn)入8位的移位寄存器中,然后被并行地傳送到SPI_DR寄存器(接受緩沖器)中。─ 不激活發(fā)送器,沒(méi)有數(shù)據(jù)被串行地送到MOSI引腳上。從模式下開(kāi)始傳輸全雙工模式(BIDIMODE=0并且RXONLY=0)─ 當(dāng)從設(shè)備接受屆時(shí)鐘信號(hào)并且第一個(gè)數(shù)據(jù)位出現(xiàn)在它的MOSI時(shí),數(shù)據(jù)傳輸開(kāi)始,隨后的數(shù)據(jù)位依次移動(dòng)進(jìn)入移位寄存器;─ 與此同時(shí),在傳輸?shù)谝粋€(gè)數(shù)據(jù)位時(shí),發(fā)送緩沖器中的數(shù)據(jù)被并行地傳送到8位的移位寄存器,隨后被串行地發(fā)送到MISO引腳上。軟件必須保證在SPI主設(shè)備開(kāi)始數(shù)據(jù)傳輸之前在發(fā)送寄存器中寫(xiě)入要發(fā)送的數(shù)據(jù)?!駟蜗虻闹唤邮苣J?BIDIMODE=0并且RXONLY=1)─ 當(dāng)從設(shè)備接受屆時(shí)鐘信號(hào)并且第一個(gè)數(shù)據(jù)位出現(xiàn)在它的MOSI時(shí),數(shù)據(jù)傳輸開(kāi)始,隨后數(shù)據(jù)位依次移動(dòng)進(jìn)入移位寄存器;─ 不啟動(dòng)發(fā)送器,沒(méi)有數(shù)據(jù)被串行地傳送到MISO引腳上?!耠p向模式,發(fā)送時(shí)(BIDIMODE=1并且BIDIOE=1)─ 當(dāng)從設(shè)備接受屆時(shí)鐘信號(hào)并且發(fā)送緩沖器中的第一個(gè)數(shù)據(jù)位被傳送到MISO引腳上的時(shí)候,數(shù)據(jù)傳輸開(kāi)始;─在第一個(gè)數(shù)據(jù)位被傳送到MISO引腳上的同時(shí),發(fā)送緩沖器中要發(fā)送的數(shù)據(jù)被平行地傳送到8位的移位寄存器中,隨后被串行地發(fā)送到MISO引腳上。軟件必須保證在SPI主設(shè)備開(kāi)始數(shù)據(jù)傳輸之前在發(fā)送寄存器中寫(xiě)入要發(fā)送的數(shù)據(jù);─ 不接受數(shù)據(jù)?!耠p向模式,接受時(shí)(BIDIMODE=1并且BIDIOE=0)─ 當(dāng)從設(shè)備接受屆時(shí)鐘信號(hào)并且第一個(gè)數(shù)據(jù)位出現(xiàn)在它的MOSI時(shí),數(shù)據(jù)傳輸開(kāi)始;─ 從MISO引腳上接受到的數(shù)據(jù)被串行地傳送到8位的移位寄存器中,然后被平行地傳送到SPI_DR寄存器(接受緩沖器);─ 不啟動(dòng)發(fā)送器,沒(méi)有數(shù)據(jù)被串行地傳送到MISO引腳上。解決數(shù)據(jù)的發(fā)送與接受當(dāng)數(shù)據(jù)從發(fā)送緩沖器傳送到移位寄存器時(shí),設(shè)立TXE標(biāo)志(發(fā)送緩沖器空),它表達(dá)內(nèi)部的發(fā)送緩沖器可以接受下一個(gè)數(shù)據(jù);假如在SPI_CR2寄存器中設(shè)立了TXEIE位,則此時(shí)會(huì)產(chǎn)生一個(gè)中斷;寫(xiě)入SPI_DR寄存器即可清除TXE位。注: 在寫(xiě)入發(fā)送緩沖器之前,軟件必須確認(rèn)TXE標(biāo)志為’1’,否則新的數(shù)據(jù)會(huì)覆蓋已經(jīng)在發(fā)送緩沖器中的數(shù)據(jù)。Txe為0時(shí)發(fā)送新數(shù)據(jù)在采樣時(shí)鐘的最后一個(gè)邊沿,當(dāng)數(shù)據(jù)被從移位寄存器傳送到接受緩沖器時(shí),設(shè)立RXNE標(biāo)志(接收緩沖器非空);它表達(dá)數(shù)據(jù)已經(jīng)就緒,可以從SPI_DR寄存器讀出;假如在SPI_CR2寄存器中設(shè)立了RXNEIE位,則此時(shí)會(huì)產(chǎn)生一個(gè)中斷;讀出SPI_DR寄存器即可清除RXNIE標(biāo)志位。在一些配置中,傳輸最后一個(gè)數(shù)據(jù)時(shí),可以使用BSY標(biāo)志等待數(shù)據(jù)傳輸?shù)慕Y(jié)束。主或從模式下(BIDIMODE=0并且RXONLY=0)全雙工發(fā)送和接受過(guò)程模式軟件必須遵循下述過(guò)程,發(fā)送和接受數(shù)據(jù)(見(jiàn)圖213和圖214):1.設(shè)立SPE位為’1’,使能SPI模塊;2.在SPI_DR寄存器中寫(xiě)入第一個(gè)要發(fā)送的數(shù)據(jù),這個(gè)操作會(huì)清除TXE標(biāo)志;3.等待TXE=1,然后寫(xiě)入第二個(gè)要發(fā)送的數(shù)據(jù)。等待RXNE=1,然后讀出SPI_DR寄存器并獲得第一個(gè)接受到的數(shù)據(jù),讀SPI_DR的同時(shí)清除了RXNE位。反復(fù)這些操作,發(fā)送后續(xù)的數(shù)據(jù)同時(shí)接受n-1個(gè)數(shù)據(jù);4.等待RXNE=1,然后接受最后一個(gè)數(shù)據(jù);5.等待TXE=1,在BSY=0之后關(guān)閉SPI模塊。也可以在響應(yīng)RXNE或TXE標(biāo)志的上升沿產(chǎn)生的中斷的解決程序中實(shí)現(xiàn)這個(gè)過(guò)程。的變化示意圖的變化示意圖只發(fā)送過(guò)程(BIDIMODE=0并且RXONLY=0)在此模式下,傳輸過(guò)程可以簡(jiǎn)要說(shuō)明如下,使用BSY位等待傳輸?shù)慕Y(jié)束(見(jiàn)圖215和圖216):1.設(shè)立SPE位為’1’,使能SPI模塊;2.在SPI_DR寄存器中寫(xiě)入第一個(gè)要發(fā)送的數(shù)據(jù),這個(gè)操作會(huì)清除TXE標(biāo)志;3.等待TXE=1,然后寫(xiě)入第二個(gè)要發(fā)送的數(shù)據(jù)。反復(fù)這個(gè)操作,發(fā)送后續(xù)的數(shù)據(jù);4.寫(xiě)入最后一個(gè)數(shù)據(jù)到SPI_DR寄存器之后,等待TXE=1;然后等待BSY=0,這表達(dá)最后一個(gè)數(shù)據(jù)的傳輸已經(jīng)完畢。也可以在響應(yīng)TXE標(biāo)志的上升沿產(chǎn)生的中斷的解決程序中實(shí)現(xiàn)這個(gè)過(guò)程。注:1.對(duì)于不連續(xù)的傳輸,在寫(xiě)入SPI_DR寄存器的操作與設(shè)立BSY位之間有2個(gè)APB時(shí)鐘周期的延2.只發(fā)送模式下,在傳輸2個(gè)數(shù)據(jù)之后,由于不會(huì)讀出接受到的數(shù)據(jù),SPI_SR寄存器中的OVR位會(huì)變?yōu)椤?’。(譯注:軟件不必理睬這個(gè)OVR標(biāo)志位)意圖圖雙向發(fā)送過(guò)程(BIDIMODE=1并且BIDIOE=1)在此模式下,操作過(guò)程類似于只發(fā)送模式,不同的是:在使能SPI模塊之前,需要在SPI_CR2寄存器中同時(shí)設(shè)立BIDIMODE和BIDIOE位為’1’。單向只接受模式(BIDIMODE=0并且RXONLY=1)在此模式下,傳輸過(guò)程可以簡(jiǎn)要說(shuō)明如下(見(jiàn)):1.在SPI_CR2寄存器中,設(shè)立RXONLY=1;2.設(shè)立SPE=1,使能SPI模塊:a)主模式下,立刻產(chǎn)生SCK時(shí)鐘信號(hào),在關(guān)閉SPI(SPE=0)之前,不斷地接受串行數(shù)據(jù);b)從模式下,當(dāng)SPI主設(shè)備拉低NSS信號(hào)并產(chǎn)生SCK時(shí)鐘時(shí),接受串行數(shù)據(jù)。3.等待RXNE=1,然后讀出SPI_DR寄存器以獲得收到的數(shù)據(jù)(同時(shí)會(huì)清除RXNE位)。反復(fù)這個(gè)操作接受所有數(shù)據(jù)。也可以在響應(yīng)RXNE標(biāo)志的上升沿產(chǎn)生的中斷的解決程序中實(shí)現(xiàn)這個(gè)過(guò)程。注: 假如在最后一個(gè)數(shù)據(jù)傳輸結(jié)束后關(guān)閉SPI模塊,請(qǐng)按照第23.3.8節(jié)的建議操作。單向接受過(guò)程(BIDIMODE=1并且BIDIOE=0)在此模式下,操作過(guò)程類似于只接受模式,不同的是:在使能SPI模塊之前,需要在SPI_CR2寄存器中設(shè)立BIDIMODE為’1’并清除BIDIOE位為’0’。連續(xù)和非連續(xù)傳輸當(dāng)在主模式下發(fā)送數(shù)據(jù)時(shí),假如軟件足夠快,可以在檢測(cè)到每次TXE的上升沿(或TXE中斷),并立即在正在進(jìn)行的傳輸結(jié)束之前寫(xiě)入SPI_DR寄存器,則可以實(shí)現(xiàn)連續(xù)的通信;此時(shí),在每個(gè)數(shù)據(jù)項(xiàng)的傳輸之間的SPI時(shí)鐘保持連續(xù),同時(shí)BSY位不會(huì)被清除。假如軟件不夠快,則會(huì)導(dǎo)致不連續(xù)的通信;這時(shí),在每個(gè)數(shù)據(jù)傳輸之間會(huì)被清除(見(jiàn)下圖)。在主模式的只接受模式下(RXONLY=1),通信總是連續(xù)的,并且BSY標(biāo)志始終為’1’。在從模式下,通信的連續(xù)性由SPI主設(shè)備決定。不管如何,即使通信是連續(xù)的,BSY標(biāo)志會(huì)在每個(gè)數(shù)據(jù)項(xiàng)之間至少有一個(gè)SPI時(shí)鐘周期為低(見(jiàn)圖216)。CRC計(jì)算CRC校驗(yàn)用于保證全雙工通信的可靠性。數(shù)據(jù)發(fā)送和數(shù)據(jù)接受分別使用單獨(dú)的CRC計(jì)算器。通過(guò)對(duì)每一個(gè)接受位進(jìn)行可編程的多項(xiàng)式運(yùn)算來(lái)計(jì)算CRC。CRC的計(jì)算是在由SPI_CR1寄存器中CPHA和CPOL位定義的采樣時(shí)鐘邊沿進(jìn)行的。注意: 該SPI接口提供了兩種CRC計(jì)算方法,取決于所選的發(fā)送和/或接受的數(shù)據(jù)幀格式:8位數(shù)據(jù)幀采用CR8;16位數(shù)據(jù)幀采用CRC16。CRC計(jì)算是通過(guò)設(shè)立SPI_CR1寄存器中的CRCEN位啟用的。設(shè)立CRCEN位時(shí)同時(shí)復(fù)位CRC寄存器(SPI_RXCRCR和SPI_TXCRCR)。當(dāng)設(shè)立了SPI_CR1的CRCNEXT位,SPI_TXCRCR的內(nèi)容將在當(dāng)前字節(jié)發(fā)送之后發(fā)出。在傳輸SPI_TXCRCR的內(nèi)容時(shí),假如在移位寄存器中收到的數(shù)值與SPI_RXCRCR的內(nèi)容不匹配,則SPI_SR寄存器的CRCERR標(biāo)志位被置1。假如在TX緩沖器中尚有數(shù)據(jù),CRC的數(shù)值僅在數(shù)據(jù)字節(jié)傳輸結(jié)束后傳送。在傳輸CRC期間,CRC計(jì)算器關(guān)閉,寄存器的數(shù)值保持不變。注意: 請(qǐng)參考產(chǎn)品說(shuō)明書(shū),以確認(rèn)有此功能(不是所有型號(hào)都有此功能)。SPI通信可以通過(guò)以下環(huán)節(jié)使用CRC:設(shè)立CPOL、CPHA、LSBFirst、BR、SSM、SSI和MSTR的值;●在SPI_CRCPR寄存器輸入多項(xiàng)式;●通過(guò)設(shè)立SPI_CR1寄存器CRCEN位使能CRC計(jì)算,該操作也會(huì)清除寄存器SPI_RXCRCR和SPI_TXCRC;●設(shè)立SPI_CR1寄存器的SPE位啟動(dòng)SPI功能;●啟動(dòng)通信并且維持通信,直到只剩最后一個(gè)字節(jié)或者半字;●在把最后一個(gè)字節(jié)或半字寫(xiě)進(jìn)發(fā)送緩沖器時(shí),設(shè)立SPI_CR1的CRCNext位,指示硬件在發(fā)送完畢最后一個(gè)數(shù)據(jù)之后,發(fā)送CRC的數(shù)值。在發(fā)送CRC數(shù)值期間,停止CRC計(jì)算;●當(dāng)最后一個(gè)字節(jié)或半字被發(fā)送后,SPI發(fā)送CRC數(shù)值,CRCNext位被清除。同樣,接受到的CRC與SPI_RXCRCR值進(jìn)行比較,假如比較不相配,則設(shè)立SPI_SR上的CRCERR標(biāo)志位,當(dāng)設(shè)立了SPI_CR2寄存器的ERRIE時(shí),則產(chǎn)生中斷。注意:當(dāng)SPI模塊處在從設(shè)備模式時(shí),請(qǐng)注旨在時(shí)鐘穩(wěn)定之后再使能CRC計(jì)算,否則也許會(huì)得到錯(cuò)誤的狀態(tài),都會(huì)進(jìn)行CRC的計(jì)算。當(dāng)SPI時(shí)鐘頻率較高時(shí),用戶在發(fā)送CRC時(shí)必須小心。在CRC傳輸期間,使用CPU的時(shí)間應(yīng)盡在發(fā)送/接受最后一個(gè)數(shù)據(jù)之前完畢設(shè)立CRCNEXT位的操作。當(dāng)SPI時(shí)鐘頻率較高時(shí),由于CPU的操作會(huì)影響SPI的帶寬,建議采用DMA模式以避免SPI減少的速度。期間保持為低。當(dāng)配置SPI為從模式并且使用CRC的功能,即使NSS引腳為高時(shí)仍然會(huì)執(zhí)行CRC的計(jì)算(譯注:當(dāng)NSS信號(hào)為高時(shí),假如SCK引腳上有時(shí)鐘脈沖,則CRC計(jì)算會(huì)繼續(xù)執(zhí)行)。例如:當(dāng)主設(shè)備交替地與多個(gè)從設(shè)備進(jìn)行通信時(shí),將會(huì)出現(xiàn)這種情況(譯注:此時(shí)要想辦法避免CRC的誤操作)。在不選中一個(gè)從設(shè)備(NSS信號(hào)為高)轉(zhuǎn)換到選中一個(gè)新的從設(shè)備(NSS信號(hào)為低)的時(shí)候,為了保持主從設(shè)備端下次CRC計(jì)算結(jié)果的同步,應(yīng)當(dāng)清除主從兩端的CRC數(shù)值。按照下述環(huán)節(jié)清除CRC數(shù)值:1.關(guān)閉SPI模塊(SPE=0);2.清除CRCEN位為’0’;3.設(shè)立CRCEN位為’1’;4.使能SPI模塊(SPE=1)。23.3.7 狀態(tài)標(biāo)志應(yīng)用程序通過(guò)3個(gè)狀態(tài)標(biāo)志可以完全監(jiān)控SPI總線的狀態(tài)。發(fā)送緩沖器空閑標(biāo)志(TXE)此標(biāo)志為’1’時(shí)表白發(fā)送緩沖器為空,可以寫(xiě)下一個(gè)待發(fā)送的數(shù)據(jù)進(jìn)入緩沖器中。當(dāng)寫(xiě)入SPI_DR時(shí),TXE標(biāo)志被清除。接受緩沖器非空(RXNE)此標(biāo)志為’1’時(shí)表白在接受緩沖器中包具有效的接受數(shù)據(jù)。讀SPI數(shù)據(jù)寄存器可以清除此標(biāo)志。忙(Busy)標(biāo)志BSY標(biāo)志由硬件設(shè)立與清除(寫(xiě)入此位無(wú)效果),此標(biāo)志表白SPI通信層的狀態(tài)。當(dāng)它被設(shè)立為’1’時(shí),表白SPI正忙于通信,但有一個(gè)例外:在主模式的雙向接受模式下(MSTR=1、BDM=1并且BDOE=0),在接受期間BSY標(biāo)志保持為低。在軟件要關(guān)閉SPI模塊并進(jìn)入停機(jī)模式(或關(guān)閉設(shè)備時(shí)鐘)之前,可以使用BSY標(biāo)志檢測(cè)傳輸是否結(jié)束,這樣可以避免破壞最后一次傳輸,因此需要嚴(yán)格按照下述過(guò)程執(zhí)行。BSY標(biāo)志還可以用于在多主系統(tǒng)中避免寫(xiě)沖突。除了主模式的雙向接受模式(MSTR=1、BDM=1并且BDOE=0),當(dāng)傳輸開(kāi)始時(shí),BSY標(biāo)志被置’1’。以下情況時(shí)此標(biāo)志將被清除為’0’:●當(dāng)傳輸結(jié)束(主模式下,假如是連續(xù)通信的情況例外);●當(dāng)關(guān)閉SPI模塊;●當(dāng)產(chǎn)生主模式失效(MODF=1)。假如通信不是連續(xù)的,則在每個(gè)數(shù)據(jù)項(xiàng)的傳輸之間,BSY標(biāo)志為低。當(dāng)通信是連續(xù)時(shí):●主模式下:在整個(gè)傳輸過(guò)程中,BSY標(biāo)志保持為高;●從模式下:在每個(gè)數(shù)據(jù)項(xiàng)的傳輸之間,BSY標(biāo)志在一個(gè)SPI時(shí)鐘周期中為低。注: 不要使用BSY標(biāo)志解決每一個(gè)數(shù)據(jù)項(xiàng)的發(fā)送和接受,最佳使用TXE和RXNE標(biāo)志。關(guān)閉SPI當(dāng)通訊結(jié)束,可以通過(guò)關(guān)閉SPI模塊來(lái)終止通訊。清除SPE位即可關(guān)閉SPI。在某些配置下,假如再傳輸尚未完畢時(shí),就關(guān)閉SPI模塊并進(jìn)入停機(jī)模式,則也許導(dǎo)致當(dāng)前的傳輸被破壞,并且BSY標(biāo)志也變得不可信。為了避免發(fā)生這種情況,關(guān)閉SPI模塊時(shí),建議按照下述環(huán)節(jié)操作:在主或從模式下的全雙工模式(BIDIMODE=0,RXONLY=0)1.等待RXNE=1并接受最后一個(gè)數(shù)據(jù);2.等待TXE=1;3.等待BSY=0;4.關(guān)閉SPI(SPE=0),最后進(jìn)入停機(jī)模式(或關(guān)閉該模塊的時(shí)鐘)。在主或從模式下的單向只發(fā)送模式(BIDIMODE=0,RXONLY=0)或雙向的發(fā)送模式(BIDIMODE=1,BIDIOE=1)在SPI_DR寄存器中寫(xiě)入最后一個(gè)數(shù)據(jù)后:1.等待TXE=1;2.等待BSY=0;3.關(guān)閉SPI(SPE=0),最后進(jìn)入停機(jī)模式(或關(guān)閉該模塊的時(shí)鐘)。在主或從模式下的單向只接受模式(MSTR=1,BIDIMODE=0,RXONLY=1)或雙向的接受模式(MSTR=1,BIDIMODE=1,BIDIOE=0)這種情況需要特別地解決,以保證SPI不會(huì)開(kāi)始一次新的傳輸:1.等待倒數(shù)第二個(gè)(第n-1個(gè))RXNE=1;2.在關(guān)閉SPI(SPE=0)之前等待一個(gè)SPI時(shí)鐘周期(使用軟件延遲);3.在進(jìn)入停機(jī)模式(或關(guān)閉該模塊的時(shí)鐘)之前等待最后一個(gè)RXNE=1。注: 在主模式下的單向只發(fā)送模式(MSTR=1,BDM=1,BDOE=0)時(shí),傳輸過(guò)程中BSY標(biāo)志始終為低。在從模式下的只接受模式(MSTR=0,BIDIMODE=0,RXONLY=1)或雙向的接受模式(MSTR=0,BIDIMODE=1,BIDIOE=0)1.可以在任何時(shí)候關(guān)閉SPI(SPE=0),SPI會(huì)在當(dāng)前的傳輸結(jié)束后被關(guān)閉;2.假如希望進(jìn)入停機(jī)模式,在進(jìn)入停機(jī)模式(或關(guān)閉該模塊的時(shí)鐘)之前必須一方面等待BSY=0。運(yùn)用DMA的SPI通信為了達(dá)成最大通信速度,需要及時(shí)往SPI發(fā)送緩沖器填數(shù)據(jù),同樣接受緩沖器中的數(shù)據(jù)也必須及時(shí)讀走以防止溢出。為了方便高速率的數(shù)據(jù)傳輸,SPI實(shí)現(xiàn)了一種采用簡(jiǎn)樸的請(qǐng)求/應(yīng)答的DMA機(jī)制。當(dāng)SPI_CR2寄存器上的相應(yīng)使能位被設(shè)立時(shí),SPI模塊可以發(fā)出DMA傳輸請(qǐng)求。發(fā)送緩沖器和接受緩沖器亦有各自的DMA請(qǐng)求(見(jiàn))?!癜l(fā)送時(shí),在每次TXE被設(shè)立為’1’時(shí)發(fā)出DMA請(qǐng)求,DMA控制器則寫(xiě)數(shù)據(jù)至SPI_DR寄存器,TXE標(biāo)志因此而被清除?!窠邮軙r(shí),在每次RXNE被設(shè)立為’1’時(shí)發(fā)出DMA請(qǐng)求,DMA控制器則從SPI_DR寄存器讀出數(shù)據(jù),RXNE標(biāo)志因此而被清除。當(dāng)只使用SPI發(fā)送數(shù)據(jù)時(shí),只需使能SPI的發(fā)送DMA通道。此時(shí),由于沒(méi)有讀取收到的數(shù)據(jù),OVR被置為’1’(譯注:軟件不必理睬這個(gè)標(biāo)志)。當(dāng)只使用SPI接受數(shù)據(jù)時(shí),只需使能SPI的接受DMA通道。在發(fā)送模式下,當(dāng)DMA已經(jīng)傳輸了所有要發(fā)送的數(shù)據(jù)(DMA_ISR寄存器的TCIF標(biāo)志變?yōu)椤?’)后,可以通過(guò)監(jiān)視BSY標(biāo)志以確認(rèn)SPI通信結(jié)束,這樣可以避免在關(guān)閉SPI或進(jìn)入停止模式時(shí),破壞最后一個(gè)數(shù)據(jù)的傳輸。因此軟件需要先等待TXE=1,然后等待BSY=0。注: 延遲,因此,在寫(xiě)完最后一個(gè)數(shù)據(jù)后需要先等待TXE=1再等待BSY=0。帶CRC的DMA功能當(dāng)使能SPI使用CRC檢查并且啟用DMA模式時(shí),在通信結(jié)束時(shí),CRC字節(jié)的發(fā)送和接受是自動(dòng)完畢的。數(shù)據(jù)和CRC傳輸結(jié)束時(shí),SPI_SR寄存器的CRCERR標(biāo)志為’1’表達(dá)在傳輸期間發(fā)生錯(cuò)誤。23.3.10錯(cuò)誤標(biāo)志主模式失效錯(cuò)誤(MODF)主模式失效僅發(fā)生在:NSS引腳硬件模式管理下,主設(shè)備的NSS腳被拉低;或者在NSS引腳軟件模式管理下,SSI位被置為’0’時(shí);MODF位被自動(dòng)置位。主模式失效對(duì)SPI設(shè)備有以下影響:●MODF位被置為’1’,假如設(shè)立了ERRIE位,則產(chǎn)生SPI中斷;●SPE位被清為’0’。這將停止一切輸出,并且關(guān)閉SPI接口;●MSTR位被清為’0’,因此逼迫此設(shè)備進(jìn)入從模式。下面的環(huán)節(jié)用于清除MODF位:1.當(dāng)MODF位被置為’1’時(shí),執(zhí)行一次對(duì)SPI_SR寄存器的讀或?qū)懖僮鳎?.然后寫(xiě)SPI_CR1寄存器。在有多個(gè)MCU的系統(tǒng)中,為了避免出現(xiàn)多個(gè)從設(shè)備的沖突,必須先拉高該主設(shè)備的NSS腳,再對(duì)MODF位進(jìn)行清零。在完畢清零之后,SPE和MSTR位可以恢復(fù)到它們的原始狀態(tài)。出于安全的考慮,當(dāng)MODF位為’1’時(shí),硬件不允許設(shè)立SPE和MSTR位。通常配置下,從設(shè)備的MODF位不能被置為’1’。然而,在多主配置里,一個(gè)設(shè)備可以在設(shè)立了MODF位的情況下,處在從設(shè)備模式;此時(shí),MODF位表達(dá)也許出現(xiàn)了多主沖突。中斷程序可以執(zhí)行一個(gè)復(fù)位或返回到默認(rèn)狀態(tài)來(lái)從錯(cuò)誤狀態(tài)中恢復(fù)。溢犯錯(cuò)誤當(dāng)主設(shè)備已經(jīng)發(fā)送了數(shù)據(jù)字節(jié),而從設(shè)備還沒(méi)有清除前一個(gè)數(shù)據(jù)字節(jié)產(chǎn)生的RXNE時(shí),即為溢出錯(cuò)誤。當(dāng)產(chǎn)生溢犯錯(cuò)誤時(shí):●OVR位被置為’1’;當(dāng)設(shè)立了ERRIE位時(shí),則產(chǎn)生中斷。此時(shí),接受器緩沖器的數(shù)據(jù)不是主設(shè)備發(fā)送的新數(shù)據(jù),讀SPI_DR寄存器返回的是之前未讀的數(shù)據(jù),所有隨后傳送的數(shù)據(jù)都被丟棄。依次讀出SPI_DR寄存器和SPI_SR寄存器可將OVR清除。CRC錯(cuò)誤當(dāng)設(shè)立了SPI_CR寄存器上的CRCEN位時(shí),CRC錯(cuò)誤標(biāo)志用來(lái)核對(duì)接受數(shù)據(jù)的有效性。假如移位寄存器中接受到的值(發(fā)送方發(fā)送的SPI_TXCRCR數(shù)值)與接受方SPI_RXCRCR寄存器中的數(shù)值不匹配,則SPI_SR寄存器上的CRCERR標(biāo)志被置位為’1’。23.3.11SPI中斷SPI中斷請(qǐng)求中斷事件事件標(biāo)志使能控制位發(fā)送緩沖器空標(biāo)志TXETXEIE接受緩沖器非空標(biāo)志RXNERXNEIE主模式失效事件MODFERRIE溢犯錯(cuò)誤OVRCRC錯(cuò)誤標(biāo)志CRCERRI2S功能描述小容量和中容量的STM32不支持I2S音頻協(xié)議。本節(jié)僅合用于大容量產(chǎn)品和互聯(lián)型產(chǎn)品。23.4.1 I2S功能描述I2S的框圖如下圖所示:
I2S框圖通過(guò)將寄存器SPI_I2SCFGR的I2SMOD位置為’1’,即可使能I2S功能。此時(shí),可以把SPI模塊用作I2S音頻接口。I2S接口與SPI接口使用大體相同的引腳、標(biāo)志和中斷。I2S與SPI共用3個(gè)引腳:●SD:串行數(shù)據(jù)(映射至MOSI引腳),用來(lái)發(fā)送和接受2路時(shí)分復(fù)用通道的數(shù)據(jù);●WS:字選(映射至NSS引腳),主模式下作為數(shù)據(jù)控制信號(hào)輸出,從模式下作為輸入;●CK:串行時(shí)鐘(映射至SCK引腳),主模式下作為時(shí)鐘信號(hào)輸出,從模式下作為輸入。在某些外部音頻設(shè)備需要主時(shí)鐘時(shí),可以另有一個(gè)附加引腳輸出時(shí)鐘:●MCK:主時(shí)鐘(獨(dú)立映射),在I2S配置為主模式,寄存器SPI_I2SPR的MCKOE位為’1’時(shí),作為輸出額外的時(shí)鐘信號(hào)引腳使用。輸出時(shí)鐘信號(hào)的頻率預(yù)先設(shè)立為256×Fs,其中Fs是音頻信號(hào)的采樣頻率。設(shè)立成主模式時(shí),I2S使用自身的時(shí)鐘發(fā)生器來(lái)產(chǎn)生通信用的時(shí)鐘信號(hào)。這個(gè)時(shí)鐘發(fā)生器也是主時(shí)鐘輸出的時(shí)鐘源。I2S模式下有2個(gè)額外的寄存器,一個(gè)是與時(shí)鐘發(fā)生器配置相關(guān)的寄存器SPI_I2SPR,另一個(gè)是I2S通用配置寄存器SPI_I2SCFGR(可設(shè)立音頻標(biāo)準(zhǔn)、從/主模式、數(shù)據(jù)格式、數(shù)據(jù)包幀、時(shí)鐘極性等參數(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個(gè)聲道上音頻數(shù)據(jù)的時(shí)分復(fù)用:左聲道和右聲道,但是只有一個(gè)16位寄存器用作發(fā)送或接受。因此,軟件必須在對(duì)數(shù)據(jù)寄存器寫(xiě)入數(shù)據(jù)時(shí),根據(jù)當(dāng)前傳輸中的聲道寫(xiě)入相應(yīng)的數(shù)據(jù);同樣,在讀取寄存器數(shù)據(jù)時(shí),通過(guò)檢查寄存器SPI_SR的CHSIDE位來(lái)判明接受到的數(shù)據(jù)屬于哪個(gè)聲道。左聲道總是先于右聲道發(fā)送數(shù)據(jù)(CHSIDE位在PCM協(xié)議下無(wú)意義)。有四種可用的數(shù)據(jù)和包幀組合??梢酝ㄟ^(guò)以下四種數(shù)據(jù)格式發(fā)送數(shù)據(jù):●16位數(shù)據(jù)打包進(jìn)16位幀●16位數(shù)據(jù)打包進(jìn)32位幀●24位數(shù)據(jù)打包進(jìn)32位幀●32位數(shù)據(jù)打包進(jìn)32位幀在使用16位數(shù)據(jù)擴(kuò)展到32位幀時(shí),前16位(MSB)是故意義的數(shù)據(jù),后16位(LSB)被強(qiáng)制為0,該操作不需要軟件干預(yù),也不需要有DMA請(qǐng)求(僅需要一次讀/寫(xiě)操作)。24位和32位數(shù)據(jù)幀需要CPU對(duì)寄存器SPI_DR進(jìn)行2次讀或?qū)懖僮?,在使用DMA時(shí),需要2次DMA傳輸。對(duì)于24位數(shù)據(jù),擴(kuò)展到32位后,最低8位由硬件置0。對(duì)于所有的數(shù)據(jù)格式和通訊標(biāo)準(zhǔn),總是先發(fā)送最高位(MSB)。I2S接口支持四種音頻標(biāo)準(zhǔn),可以通過(guò)設(shè)立寄存器SPI_I2SCFGR的I2SSTD[1:0]位和PCMSYNC位來(lái)選擇。I2S飛利浦標(biāo)準(zhǔn)在此標(biāo)準(zhǔn)下,引腳WS用來(lái)指示正在發(fā)送的數(shù)據(jù)屬于哪個(gè)聲道。在發(fā)送第一位數(shù)據(jù)(MSB)前1個(gè)時(shí)鐘周期,該引腳即為有效。
I2S飛利浦協(xié)議波形(16/32位全精度,CPOL=0)發(fā)送方在時(shí)鐘信號(hào)(CK)的下降沿改變數(shù)據(jù),接受方在上升沿讀取數(shù)據(jù)。WS信號(hào)也在時(shí)鐘信號(hào)的下降沿變化。
I2S飛利浦協(xié)議標(biāo)準(zhǔn)波形(24位幀,CPOL=0)此模式需要對(duì)寄存器SPI_DR進(jìn)行2次讀或?qū)懖僮鳌!裨诎l(fā)送模式下:假如需要發(fā)送0x8EAA33(24位):●在接受模式下:假如接受0x8EAA33:
I2S飛利浦協(xié)議標(biāo)準(zhǔn)波形(16位擴(kuò)展至32位包幀,CPOL=0)在I2S配置階段,假如選擇將16位數(shù)據(jù)擴(kuò)展到32位聲道幀,只需要訪問(wèn)一次寄存器SPI_DR。用來(lái)擴(kuò)展到32位的低16位被硬件置為0x0000。假如待傳輸或者接受的數(shù)據(jù)是0x76A3(擴(kuò)展到32位是0x76A30000),需要的操作如下圖所示。示例在發(fā)送時(shí)需要將MSB寫(xiě)入寄存器SPI_DR;標(biāo)志位TXE為’1’表達(dá)可以寫(xiě)入新的數(shù)據(jù),假如允許了相應(yīng)的中斷,則可以產(chǎn)生中斷。發(fā)送是由硬件完畢的,即使尚未發(fā)送出后16位的0x0000,也會(huì)設(shè)立TXE并產(chǎn)生相應(yīng)的中斷。接受時(shí),每次收到高16位半字(MSB)后,標(biāo)志位RXNE置’1’,假如允許了相應(yīng)的中斷,則可以產(chǎn)生中斷。這樣,在2次讀和寫(xiě)之間有更多的時(shí)間,可以防止下溢或者上溢的情況發(fā)生。MSB對(duì)齊標(biāo)準(zhǔn)在此標(biāo)準(zhǔn)下,WS信號(hào)和第一個(gè)數(shù)據(jù)位,即最高位(MSB)同時(shí)產(chǎn)生。=0發(fā)送方在時(shí)鐘信號(hào)的下降沿改變數(shù)據(jù);接受方是在上升沿讀取數(shù)據(jù)。=0=0LSB對(duì)齊標(biāo)準(zhǔn)此標(biāo)準(zhǔn)與MSB對(duì)齊標(biāo)準(zhǔn)類似(在16位或32位全精度幀格式下無(wú)區(qū)別)。=0=0●在發(fā)送模式下假如要發(fā)送數(shù)據(jù)0x3478AE,需要通過(guò)軟件或者DMA對(duì)寄存器SPI_DR進(jìn)行2次寫(xiě)操作。操作流程如下圖所示?!裨诮邮苣J较录偃缫邮軘?shù)據(jù)0x3478AE,需要在2個(gè)連續(xù)的RXNE事件發(fā)生時(shí),分別對(duì)寄存器SPI_DR進(jìn)行1次讀操作。=0在I2S配置階段,假如選擇將16位數(shù)據(jù)擴(kuò)展到32聲道幀,只需要訪問(wèn)一次寄存器SPI_DR。此時(shí),擴(kuò)展到32位后的高半字(16位MSB)被硬件置為0x0000。假如待傳輸或者接受的數(shù)據(jù)是0x76A3(擴(kuò)展到32位是0x000076A3),需要的操作如下圖所示。示例在發(fā)送時(shí),假如TXE為’1’,用戶需要寫(xiě)入待發(fā)送的數(shù)據(jù)(即0x76A3)。用來(lái)擴(kuò)展到32位的0x0000部分由硬件一方面發(fā)送出去,一旦有效數(shù)據(jù)開(kāi)始從SD引腳送出,即發(fā)生下一次TXE事件。在接受時(shí),一旦接受到有效數(shù)據(jù)(而不是0x0000部分),即發(fā)生RXNE事件。這樣,在2次讀和寫(xiě)之間有更多的時(shí)間,可以防止下溢或者上溢的情況發(fā)生。PCM標(biāo)準(zhǔn)在PCM標(biāo)準(zhǔn)下,不存在聲道選擇的信息。PCM標(biāo)準(zhǔn)有2種可用的幀結(jié)構(gòu),短幀或者長(zhǎng)幀,可以通過(guò)設(shè)立寄存器SPI_I2SCFGR的PCMSYNC位來(lái)選擇。對(duì)于長(zhǎng)幀,主模式下,用來(lái)同步的WS信號(hào)有效的時(shí)間固定為13位。對(duì)于短幀,用來(lái)同步的WS信號(hào)長(zhǎng)度只有1位。注意: 23.4.3 時(shí)鐘發(fā)生器I2S的比特率即擬定了在I2S數(shù)據(jù)線上的數(shù)據(jù)流和I2S的時(shí)鐘信號(hào)頻率。I2S比特率=每個(gè)聲道的比特?cái)?shù)×聲道數(shù)目×音頻采樣頻率對(duì)于一個(gè)具有左右聲道和16位音頻信號(hào),I2S比特率計(jì)算如下I2S比特率=16×2×Fs假如包長(zhǎng)為32位,則有:I2S比特率=32×2×Fs在主模式下,為了獲得需要的音屢屢率,需要對(duì)的地對(duì)線性分頻器進(jìn)行設(shè)立。
I2S時(shí)鐘發(fā)生器結(jié)構(gòu)1.圖中x可以是2或者3。上圖中I2SxCLK的時(shí)鐘源是系統(tǒng)時(shí)鐘(即驅(qū)動(dòng)AHB時(shí)鐘的HSI、HSE或PLL)。對(duì)于互聯(lián)型產(chǎn)品,I2SxCLK可以來(lái)自SYSCLK,或PLL3VCO(2xPLL3CLK)時(shí)鐘從而得到最精確的時(shí)鐘,可以通過(guò)RCC_CFGR2寄存器的I2S2SRC和I2S3SRC位選擇。音頻的采樣頻率可以是96kHz、48kHz、44.1kHz、32kHz、22.05kHz、16kHz、11.025kHz或者8kHz(或任何此范圍內(nèi)的數(shù)值)。為了獲得需要的頻率,需按照以下公式設(shè)立線性分頻器:當(dāng)需要生成主時(shí)鐘時(shí)(寄存器SPI_I2SPR的MCKOE位為’1’):聲道的幀長(zhǎng)為16位時(shí),F(xiàn)s=I2SxCLK/[(16*2)*((2*I2SDIV)+ODD)*8]聲道的幀長(zhǎng)為32位時(shí),F(xiàn)s=I2SxCLK/[(32*2)*((2*I2SDIV)+ODD)*4]當(dāng)關(guān)閉主時(shí)鐘時(shí)(MCKOE位為’0’):聲道的幀長(zhǎng)為16位時(shí),F(xiàn)s=I2SxCLK/[(16*2)*((2*I2SDIV)+ODD)]聲道的幀長(zhǎng)為32位時(shí),F(xiàn)s=I2SxCLK/[(32*2)*((2*I2SDIV)+ODD)]下面2張表給出了不同時(shí)鐘配置時(shí),精確參數(shù)的例子。注: 可以使用其它配置以達(dá)成優(yōu)化時(shí)鐘精確度的目的。SYSCLK(MHz)I2S_DIVI2S_ODDMCLK盼望值FS(Hz)實(shí)際FS(Hz)誤差16位32位16位32位16位32位16位32位7211610無(wú)9600097826.09937501.90%2.34%72231111無(wú)4800047872.3448913.040.27%1.90%72251310無(wú)4410044117.6543269.230.04%1.88%72351701無(wú)3202332142.8632142.860.44%0.44%72512501無(wú)2205022058.8222058.820.04%0.04%72703510無(wú)1600015675.7516071.430.27%0.45%721025100無(wú)1102511029.4111029.410.04%0.04%721407011無(wú)80008007.117978.720.09%0.27%722200有9600070312.1570312.1526.76%26.76%723300有4800046875468752.34%2.34%723300有4410046875468756.29%6.29%729900有3202331250312502.34%2.34%726611有2205021634.6121634.611.88%1.88%729900有1600015625156252.34%2.34%72131300有1102510817.310817.31.88%1.88%72171711有80008035.718035.710.45%0.45%表168使用標(biāo)準(zhǔn)的25MHz時(shí)鐘和PLL3得到精確的音屢屢率(只合用于互聯(lián)型產(chǎn)品)PREDIV2PLL3I2SDIVI2SODDMCLK盼望FS(Hz)實(shí)際FS(Hz)誤差16位32位16位32位16位32位16位32位16位32位16位32位66141419901無(wú)9600095942.9895942.980.0594%0.0594%712201446911無(wú)4800048003.0747971.490.0064%0.0594%881414311501無(wú)4410044102.8244102.820.0064%0.0064%1141610353011無(wú)3202332023.2432023.440.0320%0.0576%881414623100無(wú)2205022051.4122051.410.0064%0.0064%71120161393511無(wú)1600016001.0216005.120.0064%0.0320%8814141246200無(wú)1102511025.7111025.710.0064%0.0064%99202021710801無(wú)80008000.5128000.5120.0064%0.0064%44882200是9600097656.2597656.251.7253%1.7253%131316162211是4800048076.9248076.920.1603%0.1603%55994400是4410043945.3143945.310.3508%0.3508%55995511是3202331960.2231960.220.1243%0.1243%551313111111是2205022078.822078.80.1306%0.1306%9914149911是1600015990.4915990.490.0594%0.0594%881414151511是1102511025.711025.70.0064%0.0064%441010303011是80008004.6118004.6110.0576%0.0576%PREDIV2PLL3I2SDIVI2SODDMCLK盼望FS(Hz)實(shí)際FS(Hz)誤差16位32位16位32位16位32位16位32位16位32位16位32位33101016800無(wú)9600096000960000%0%662020321600無(wú)4800048000480000%0%1111202019901無(wú)4410044095.6944095.690.0098%0.0098%221010723600無(wú)3202332023320230%0%1111101019901無(wú)2205022047.8422047.840.0098%0.0098%4420201447200無(wú)1600016000160000%0%22101020910401無(wú)1102511023.9211023.920.0098%0.0098%12122020964800無(wú)8000800080000%0%2210103300是9600096000960000%0%6620204400是4800048000480000%0%2210106611是4410044307.6944307.6947.1000%0.4710%2210109900是3202332023320230%0%4413138811是2205022023.5222023.520.1200%0.1200%442020181800是1600016000160000%0%111120209911是1102511023.9211023.920.0098%0.0098%662020242400是8000800080000%0%23.4.4 I2S主模式設(shè)立I2S工作在主模式,串行時(shí)鐘由引腳CK輸出,字選信號(hào)由引腳WS產(chǎn)生??梢酝ㄟ^(guò)設(shè)立寄存器SPI_I2SPR的MCKOE位來(lái)選擇輸出或者不輸出主時(shí)鐘(MCK)。流程1.設(shè)立寄存器SPI_I2SPR的I2SDIV[7:0]定義與音頻采樣頻率相符的串行時(shí)鐘波特率。同時(shí)也要定義寄存器SPI_I2SPR的ODD位。2.設(shè)立CKPOL位定義通信用時(shí)鐘在空閑時(shí)的電平狀態(tài)。假如需要向外部的DAC/ADC音頻器件提供主時(shí)鐘MCK,將寄存器SPI_I2SPR的MCKOE位置為’1’。(按照不同的MCK輸出狀態(tài),計(jì)算I2SDIV和ODD的值,詳見(jiàn)23.4.3節(jié))。3.設(shè)立寄存器SPI_I2SCFGR的I2SMOD位為’1’激活I(lǐng)2S功能,設(shè)立I2SSTD[1:0]和PCMSYNC位選擇所用的I2S標(biāo)準(zhǔn),設(shè)立CHLEN選擇每個(gè)聲道的數(shù)據(jù)位數(shù)。還要設(shè)立寄存器SPI_I2SCFGR的I2SCFG[1:0]選擇I2S主模式和方向(發(fā)送端還是接受端)。4.假如需要,可以通過(guò)設(shè)立寄存器SPI_CR2來(lái)打開(kāi)所需的中斷功能和DMA功能。5.必須將寄存器SPI_I2SCFGR的I2SE位置為’1’。6.引腳WS和CK需要配置為輸出模式。假如寄存器SPI_I2SPR的MCKOE位為’1’,引腳MCK也要配置成輸出模式。發(fā)送流程當(dāng)寫(xiě)入1個(gè)半字(16位)的數(shù)據(jù)至發(fā)送緩存,發(fā)送流程開(kāi)始。假設(shè)第一個(gè)寫(xiě)入發(fā)送緩存的數(shù)據(jù)相應(yīng)的是左聲道數(shù)據(jù)。當(dāng)數(shù)據(jù)從發(fā)送緩存移到移位寄存器時(shí),標(biāo)志位TXE置’1’,這時(shí),要把相應(yīng)右聲道的數(shù)據(jù)寫(xiě)入發(fā)送緩存。標(biāo)志位CHSIDE提醒了目前待傳輸?shù)臄?shù)據(jù)相應(yīng)哪個(gè)聲道。標(biāo)志位CHSIDE的值在TXE為’1’時(shí)更新,因此它在TXE為’1’時(shí)故意義。在先左聲道后右聲道的數(shù)據(jù)都傳輸完畢后,才干被認(rèn)為是一個(gè)完整的數(shù)據(jù)幀。不可以只傳輸部分?jǐn)?shù)據(jù)幀,如僅有左聲道的數(shù)據(jù)。當(dāng)發(fā)出第一位數(shù)據(jù)的同時(shí),半字?jǐn)?shù)據(jù)被并行地傳送至16位移位寄存器,然后后面的位依次按高位在先的順序從引腳MOSI/SD發(fā)出。每次數(shù)據(jù)從發(fā)送緩存移至移位寄存器時(shí),標(biāo)志位TXE置為’1’,假如寄存器SPI_CR2的TXEIE位為’1’,則產(chǎn)生中斷。寫(xiě)入數(shù)據(jù)的操作取決于所選擇的I2S標(biāo)準(zhǔn),詳見(jiàn)23.4.2節(jié)。為了保證連續(xù)的音頻數(shù)據(jù)傳輸,建議在當(dāng)前傳輸完畢之前,對(duì)寄存器SPI_DR寫(xiě)入下一個(gè)要傳輸?shù)臄?shù)據(jù)。建議在要關(guān)閉I2S功能時(shí),等待標(biāo)志位TXE=1及BSY=0,再將I2SE位清’0’。接受流程接受流程的配置環(huán)節(jié)除了第3點(diǎn)外,與發(fā)送流程的一致(參見(jiàn)前述的”發(fā)送流程”),需要通過(guò)配置I2SCFG[1:0]來(lái)選擇主接受模式。無(wú)論何種數(shù)據(jù)和聲道長(zhǎng)度,音頻數(shù)據(jù)總是以16位包的形式接受。即每次填滿接受緩存后,標(biāo)志位RXNE置’1’,假如寄存器SPI_CR2的RXNEIE位為’1’,則產(chǎn)生中斷。根據(jù)配置的數(shù)據(jù)和聲道長(zhǎng)度,收到左聲道或右聲道的數(shù)據(jù)會(huì)需要1次或者2次把數(shù)據(jù)傳送到接受緩存的過(guò)程。對(duì)寄存器SPI_DR進(jìn)行讀操作即可清除RXNE標(biāo)志位。每次接受以后即更新CHSIDE。它的值取決于I2S單元產(chǎn)生的WS信號(hào)。讀取數(shù)據(jù)的操作取決于所選擇的I2S標(biāo)準(zhǔn),詳見(jiàn)23.4.2節(jié)。假如前一個(gè)接受到的數(shù)據(jù)還沒(méi)有被讀取,又接受到新數(shù)據(jù),即發(fā)生上溢,標(biāo)志位OVR被置為’1’,假如寄存器SPI_CR2的ERRIE位為’1’,則產(chǎn)生中斷,表達(dá)發(fā)生了錯(cuò)誤。若要關(guān)閉I2S功能,需要執(zhí)行特別的操作,以保證I2S模塊可以正常地完畢傳輸周期而不會(huì)開(kāi)始新的數(shù)據(jù)傳輸。操作過(guò)程與數(shù)據(jù)配置和通道長(zhǎng)度、以及音頻協(xié)議的模式相關(guān):●16位數(shù)據(jù)擴(kuò)展到32位通道長(zhǎng)度(DATLEN=00并且CHLEN=1),使用LSB(低位)對(duì)齊模式(I2SSTD=10)a)等待倒數(shù)第二個(gè)(n-1)RXNE=1;b)等待17個(gè)I2S時(shí)鐘周期(使用軟件延遲);c)關(guān)閉I2S(I2SE=0)。●16位數(shù)據(jù)擴(kuò)展到32位通道長(zhǎng)度(DATLEN=00并且CHLEN=1),使用MSB(高位)對(duì)齊、I2S或PCM模式(分別為I2SSTD=00,I2SSTD=01或I2SSTD=11)a)等待最后一個(gè)RXNE=1;b)等待1個(gè)I2S時(shí)鐘周期(使用軟件延遲);c)關(guān)閉I2S(I2SE=0)?!袼衅渌麯ATLEN和CHLEN的組合,I2SSTD選擇的任意音頻模式,使用下述方式關(guān)閉I2S:a)等待倒數(shù)第二個(gè)(n-1)RXNE=1;b)等待一個(gè)I2S時(shí)鐘周期(使用軟件延遲);c)關(guān)閉I2S(I2SE=0)。注: 在傳輸期間BSY標(biāo)志始終為低。23.4.5 I2S從模式在從模式下,I2S可以設(shè)立成發(fā)送和接受模式。從模式的配置方式基本遵循和配置主模式同樣的流程。在從模式下,不需要I2S接口提供時(shí)鐘。時(shí)鐘信號(hào)和WS信號(hào)都由外部主I2S設(shè)備提供,連接到相應(yīng)的引腳上。因此用戶無(wú)需配置時(shí)鐘。配置環(huán)節(jié)列舉如下:1.設(shè)立寄存器SPI_I2SCFGR的I2SMOD位激活I(lǐng)2S功能;設(shè)立I2SSTD[1:0]來(lái)選擇所用的I2S標(biāo)準(zhǔn);設(shè)立DATLEN[1:0]選擇數(shù)據(jù)的比特?cái)?shù);設(shè)立CHLEN選擇每個(gè)聲道的數(shù)據(jù)位數(shù)。設(shè)置寄存器SPI_I2SCFGR的I2SCFG[1:0]選擇I2S從模式的數(shù)據(jù)方向(發(fā)送端還是接受端)。2.根據(jù)需要,設(shè)立寄存器SPI_CR2打開(kāi)所需的中斷功能和DMA功能。3.必須設(shè)立寄存器SPI_I2SCFGR的I2SE位為’1’。發(fā)送流程當(dāng)外部主設(shè)備發(fā)送時(shí)鐘信號(hào),并且當(dāng)NSS_WS信號(hào)請(qǐng)求傳輸數(shù)據(jù)時(shí),發(fā)送流程開(kāi)始。必須先使能從設(shè)備,并且寫(xiě)入I2S數(shù)據(jù)寄存器之后,外部主設(shè)備才干開(kāi)始通信。對(duì)于I2S的MSB對(duì)齊和LSB對(duì)齊模式,第一個(gè)寫(xiě)入數(shù)據(jù)寄存器的數(shù)據(jù)項(xiàng)相應(yīng)左聲道的數(shù)據(jù)。當(dāng)開(kāi)始通信時(shí),數(shù)據(jù)從發(fā)送緩沖器傳送到移位寄存器,然后標(biāo)志位TXE置為’1’;這時(shí),要把相應(yīng)右聲道的數(shù)據(jù)項(xiàng)寫(xiě)入I2S數(shù)據(jù)寄存器。標(biāo)志位CHSIDE提醒了目前待傳輸?shù)臄?shù)據(jù)相應(yīng)哪個(gè)聲道。與主模式的發(fā)送流程相比,在從模式中,CHSIDE取決于來(lái)自外部主I2S的WS信號(hào)。這意味著從I2S在接受到主端生成的時(shí)鐘信號(hào)之前,就要準(zhǔn)備好第一個(gè)要發(fā)送的數(shù)據(jù)。WS信號(hào)為’1’表達(dá)先發(fā)送左聲道。注意: 設(shè)立I2SE位為’1’的時(shí)間,應(yīng)當(dāng)比CK引腳上的主I2S時(shí)鐘信號(hào)早至少2個(gè)PCLK時(shí)鐘周期。當(dāng)發(fā)出第一位數(shù)據(jù)的時(shí)候,半字?jǐn)?shù)據(jù)并行地通過(guò)I2S內(nèi)部總線傳輸至16位移位寄存器,然后其它位依次按高位在先的順序從引腳MOSI/SD發(fā)出。每次數(shù)據(jù)從發(fā)送緩沖器傳送至移位寄存器時(shí),標(biāo)志位TXE置’1’,假如寄存器SPI_CR2的TXEIE位為’1’,則產(chǎn)生中斷。注意,在對(duì)發(fā)送緩沖器寫(xiě)入數(shù)據(jù)前,要確認(rèn)標(biāo)志位TXE為’1’。寫(xiě)入數(shù)據(jù)的操作取決于所選中的I2S標(biāo)準(zhǔn),詳見(jiàn)23.4.2節(jié)。為了保證連續(xù)的音頻數(shù)據(jù)傳輸,建議在當(dāng)前傳輸完畢之前,對(duì)寄存器SPI_DR寫(xiě)入下一個(gè)要傳輸?shù)臄?shù)據(jù)。假如在代表下一個(gè)數(shù)據(jù)傳輸?shù)牡谝粋€(gè)時(shí)鐘邊沿到達(dá)之前,新的數(shù)據(jù)仍然沒(méi)有寫(xiě)入寄存器SPI_DR,下溢標(biāo)志位會(huì)置’1’,并也許產(chǎn)生中斷;它指示軟件發(fā)送數(shù)據(jù)錯(cuò)誤。假如寄存器SPI_CR2的ERRIE位為’1’,在寄存器SPI_SR的標(biāo)志位UDR為高是,就會(huì)產(chǎn)生中斷。建議在這時(shí)關(guān)閉I2S,然后重新從左聲道開(kāi)始發(fā)送數(shù)據(jù)。建議在清除I2SE位關(guān)閉I2S之前,先等待TXE=1并且BSY=0。接受流程配置環(huán)節(jié)除了第1點(diǎn)外,與發(fā)送流程一致。需要通過(guò)配置I2SCFG[1:0]來(lái)選擇主接受模式。無(wú)論何種數(shù)據(jù)和聲道長(zhǎng)度,音頻數(shù)據(jù)總是以16位包的形式接受,即每次填滿接受緩存,標(biāo)志位RXNE置’1’,假如寄存器SPI_CR2的RXNEIE位為’1’,則產(chǎn)生中斷。按照不同的數(shù)據(jù)和聲道長(zhǎng)度設(shè)立,收到左聲道或者右聲道數(shù)據(jù)會(huì)需要1次或者2次傳輸數(shù)據(jù)至接受緩沖器的過(guò)程。每次接受到數(shù)據(jù)(將要從SPI_DR讀出)以后即更新CHSIDE,它相應(yīng)I2S單元產(chǎn)生的WS信號(hào)。讀取SPI_DR寄存器,將清除RXNE位。讀取數(shù)據(jù)的操作取決于所選中的I2S標(biāo)準(zhǔn),詳見(jiàn)23.4.2節(jié)。在還沒(méi)有讀出前一個(gè)接受到的數(shù)據(jù),又接受到新數(shù)據(jù)時(shí),即產(chǎn)生上溢,并設(shè)立標(biāo)志位OVR為’1’;假如寄存器SPI_CR2的ERRIE位為’1’,則產(chǎn)生中斷,指示發(fā)生了錯(cuò)誤。要關(guān)閉I2S功能時(shí),需要在接受到最后一次RXNE=1時(shí)將I2SE位清’0’。注意:外部主I2S器件需要有通過(guò)音頻聲道發(fā)送/接受16位或32位數(shù)據(jù)包的功能。23.4.6 狀態(tài)標(biāo)志位有3個(gè)狀態(tài)標(biāo)志位供用戶監(jiān)控I2S總線的狀態(tài)。忙標(biāo)志位(BSY)BSY標(biāo)志由硬件設(shè)立與清除(寫(xiě)入此位無(wú)效果),該標(biāo)志位指示I2S通信層的狀態(tài)。該位為’1’時(shí)表白I2S通訊正在進(jìn)行中,但有一個(gè)例外:主接受模式(I2SCFG=11)下,在接受期間BSY標(biāo)志始終為低。在軟件要關(guān)閉SPI模塊之前,可以使用BSY標(biāo)志檢測(cè)傳輸是否結(jié)束,這樣可以避免破壞最后一次傳輸,因此需要嚴(yán)格按照下述過(guò)程執(zhí)行。當(dāng)傳輸開(kāi)始時(shí),BSY標(biāo)志被置為’1’,除非I2S模塊處在主接受模式。下述情況時(shí),該標(biāo)志位被清除:●當(dāng)傳輸結(jié)束時(shí)(除了主發(fā)送模式,這種模式下通信是連續(xù)的);●當(dāng)關(guān)閉I2S模塊時(shí)。當(dāng)通信是連續(xù)的時(shí)候:●在主發(fā)送模式時(shí),整個(gè)傳輸期間,BSY標(biāo)志始終為高;●在從模式時(shí),每個(gè)數(shù)據(jù)項(xiàng)傳輸之間,BSY標(biāo)志在1個(gè)I2S時(shí)鐘周期內(nèi)變低。注: 不要使用BSY標(biāo)志解決每一個(gè)數(shù)據(jù)項(xiàng)的發(fā)送和接受,最佳使用TXE和RXNE標(biāo)志。發(fā)送緩存空標(biāo)志位(TXE)該標(biāo)志位為’1’表達(dá)發(fā)送緩沖器為空,可以對(duì)發(fā)送緩沖器寫(xiě)入新的待發(fā)送數(shù)據(jù)。在發(fā)送緩沖器中已有數(shù)據(jù)時(shí),標(biāo)志位清’0’。在I2S被關(guān)閉時(shí)(I2SE位為’0’),該標(biāo)志位也為’0’。接受緩存非空標(biāo)志位(RXNE)該標(biāo)志位置’1’表達(dá)在接受緩存里有接受到的有效數(shù)據(jù)。在讀取寄存器SPI_DR時(shí),該位清’0’。聲道標(biāo)志位(CHSIDE)在發(fā)送模式下,該標(biāo)志位在TXE為高時(shí)刷新,指示從SD引腳上發(fā)送的數(shù)據(jù)所在的聲道。假如在從發(fā)送模式下發(fā)生了下溢錯(cuò)誤,該標(biāo)志位的值無(wú)效,在重新開(kāi)始通訊前需要把I2S關(guān)閉再打開(kāi)。在接受模式下,該標(biāo)志位在寄存器SPI_DR接受到數(shù)據(jù)時(shí)刷新,指示接受到的數(shù)據(jù)所在的聲道。注意,假如發(fā)生錯(cuò)誤(如上溢OVR),該標(biāo)志位無(wú)意義,需要將I2S關(guān)閉再打開(kāi)(同時(shí),假如必要修改I2S的配置)。在PCM標(biāo)準(zhǔn)下,無(wú)論短幀格式還是長(zhǎng)幀格式,這個(gè)標(biāo)志位都沒(méi)故意義。假如寄存器SPI_SR的標(biāo)志位OVR或UDR為’1’,且寄存器SPI_CR2的ERRIE位為’1’,則會(huì)產(chǎn)生中斷。(中斷源已經(jīng)被清除后)可以通過(guò)讀寄存器SPI_SR來(lái)清除中斷標(biāo)志。23.4.7 錯(cuò)誤標(biāo)志位I2S單元有2個(gè)錯(cuò)誤標(biāo)志位。下溢標(biāo)志位(UDR)在從發(fā)送模式下,假如數(shù)據(jù)傳輸?shù)牡谝粋€(gè)時(shí)鐘邊沿到達(dá)時(shí),新的數(shù)據(jù)仍然沒(méi)有寫(xiě)入SPI_DR寄存器,該標(biāo)志位會(huì)被置’1’。在寄存器SPI_I2SCFGR的I2SMOD位置’1’后,該標(biāo)志位才有效。假如寄存器SPI_CR2的ERRIE位為’1’,就會(huì)產(chǎn)生中斷。通過(guò)對(duì)寄存器SPI_SR進(jìn)行讀操作來(lái)清除該標(biāo)志位。上溢標(biāo)志位(OVR)假如還沒(méi)有讀出前一個(gè)接受到的數(shù)據(jù)時(shí),又接受到新的數(shù)據(jù),即產(chǎn)生上溢,該標(biāo)志位置’1’,如果寄存器SPI_CR2的ERRIE位為’1’,則產(chǎn)生中斷指示發(fā)生了錯(cuò)誤。這時(shí),接受緩存的內(nèi)容,不會(huì)刷新為從發(fā)送設(shè)備送來(lái)的新數(shù)據(jù)。對(duì)寄存器SPI_DR的讀操作返回最后一個(gè)對(duì)的接受到的數(shù)據(jù)。其他所有在上溢發(fā)生后由發(fā)送設(shè)備發(fā)出的16位數(shù)據(jù)都會(huì)丟失。通過(guò)先讀寄存器SPI_SR再讀寄存器SPI_DR,來(lái)清除該標(biāo)志位。23.4.8 I2S中斷下表列舉了所有I2S中斷表170I2S中斷請(qǐng)求中斷事件事件標(biāo)志位使能標(biāo)志位發(fā)送緩沖器空標(biāo)志位TXETXEIE接受緩沖器非空標(biāo)志位RXNERXNEIE下溢標(biāo)志位OVRERRIE上溢標(biāo)志位UDR23.4.9 DMA功能DMA的工作方式在I2S模式除了CRC功能不可用以外,與在SPI模式完全相同。由于在I2S模式下沒(méi)有數(shù)據(jù)傳輸保護(hù)系統(tǒng)。關(guān)于寄存器描述中所用到的縮略詞可參見(jiàn)第1.1節(jié)??梢杂冒胱?16位)或字(32位)的方式操作這些外設(shè)寄存器。23.5.1 SPI控制寄存器1(SPI_CR1)(I2S模式下不使用)地址偏移:0x00復(fù)位值:0x000015 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0BIDIMODEBIDIOECRCENCRCNEXTDFFRXONLYSSMSSILSBFIRSTSPEBR[2:0]MSTRCPOLCPHArw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw位15BIDIMODE:雙向數(shù)據(jù)模式使能(Bidirectionaldatamodeenable)0:選擇“雙線雙向”模式;1:選擇“單線雙向”模式。注:I2S模式下不使用。位14BIDIOE:雙向模式下的輸出使能(Outputenableinbidirectionalmode)和BIDIMODE位一起決定在“單線雙向”模式下數(shù)據(jù)的輸出方向0:輸出嚴(yán)禁(只收模式);1:輸出使能(只發(fā)模式)。這個(gè)“單線”數(shù)據(jù)線在主設(shè)備端為MOSI引腳,在從設(shè)備端為MISO引腳。注:I2S模式下不使用。位13CRCEN:硬件CRC校驗(yàn)使能(HardwareCRCcalculationenable)0:嚴(yán)禁CRC計(jì)算;1:?jiǎn)?dòng)CRC計(jì)算。注:只有在嚴(yán)禁SPI時(shí)(SPE=0),才干寫(xiě)該位,否則犯錯(cuò)。該位只能在全雙工模式下使用。注:I2S模式下不使用。位12CRCNEXT:下一個(gè)發(fā)送CRC(TransmitCRCnext)0:下一個(gè)發(fā)送的值來(lái)自發(fā)送緩沖區(qū)。1:下一個(gè)發(fā)送的值來(lái)自發(fā)送CRC寄存器。注:在SPI_DR寄存器寫(xiě)入最后一個(gè)數(shù)據(jù)后應(yīng)立即設(shè)立該位。注:I2S模式下不使用。位11DFF:數(shù)據(jù)幀格式(Dataframeformat)0:使用8位數(shù)據(jù)幀格式進(jìn)行發(fā)送/接受;1:使用16位數(shù)據(jù)幀格式進(jìn)行發(fā)送/接受。注:只有當(dāng)SPI嚴(yán)禁(SPE=0)時(shí),才干寫(xiě)該位,否則犯錯(cuò)。注:I2S模式下不使用。位10RXONLY:只接受(Receiveonly)該位和BIDIMODE位一起決定在“雙線雙向”模式下的傳輸方向。在多個(gè)從設(shè)備的配置中,在未被訪問(wèn)的從設(shè)備上該位被置1,使得只有被訪問(wèn)的從設(shè)備有輸出,從而不會(huì)導(dǎo)致數(shù)據(jù)線上數(shù)據(jù)沖突。0:全雙工(發(fā)送和接受);1:嚴(yán)禁輸出(只接受模式)。注:I2S模式下不使用。位9SSM:軟件從設(shè)備管理(Softwareslavemanagement)當(dāng)SSM被置位時(shí),NSS引腳上的電平由SSI位的值決定。0:嚴(yán)禁軟件從設(shè)備管理;1:?jiǎn)⒂密浖脑O(shè)備管理。注:I2S模式下不使用。位8SSI:內(nèi)部從設(shè)備選擇(Internalslaveselect)該位只在SSM位為’1’時(shí)故意義。它決定了NSS上的電平,在NSS引腳上的I/O操作無(wú)效。注:I2S模式下不使用。位7LSBFIRST:幀格式(Frameformat)0:先發(fā)送MSB;1:先發(fā)送LSB。注:當(dāng)通信在進(jìn)行時(shí)不能改變?cè)撐坏闹怠Wⅲ篒2S模式下不使用。位6SPE:SPI使能(SPIenable)0:嚴(yán)禁SPI設(shè)備;1:?jiǎn)?dòng)SPI設(shè)備。注:I2S模式下不使用。注:當(dāng)關(guān)閉SPI設(shè)備時(shí),請(qǐng)按照第23.3.8節(jié)的過(guò)程操作。位5:3BR[2:0]:波特率控制(Baudratecontrol)000:fPCLK/2 001:fPCLK/4 010:fPCLK/8 011:fPCLK/16100:fPCLK/32 101:fPCLK/64 110:fPCLK/128 111:fPCLK/256當(dāng)通信正在進(jìn)行的時(shí)候,不能修改這些位。注意:I2S模式下不使用。位2MSTR:主設(shè)備選擇(Masterselection)0:配置為從設(shè)備;1:配置為主設(shè)備。注:當(dāng)通信正在進(jìn)行的時(shí)候,不能修改該位。注:I2S模式下不使用。位1CPOL:時(shí)鐘極性(Clockpolarity)0:空閑狀態(tài)時(shí),SCK保持低電平;1:空閑狀態(tài)時(shí),SCK保持高電平。注:當(dāng)通信正在進(jìn)行的時(shí)候,不能修改該位。注:I2S模式下不使用。位0CPHA:時(shí)鐘相位(Clockphase)0:數(shù)據(jù)采樣從第一個(gè)時(shí)鐘邊沿開(kāi)始;1:數(shù)據(jù)采樣從第二個(gè)時(shí)鐘邊沿開(kāi)始。注:當(dāng)通信正在進(jìn)行的時(shí)候,不能修改該位。注:I2S模式下不使用。23.5.2 SPI控制寄存器2(SPI_CR2)地址偏移:0x04復(fù)位值:0x000015 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0保存TXEIERXNEIEERRIE保存SSOETXDMAENRXDMAENres
rw rw rw
res
rw rw rw位15:8保存位,硬件強(qiáng)制為0位7TXEIE:發(fā)送緩沖區(qū)空中斷使能(Txbufferemptyinterruptenable)0:嚴(yán)禁TXE中斷;1:允許TXE中斷,當(dāng)TXE標(biāo)志置位為’1’時(shí)產(chǎn)生中斷請(qǐng)求。位6RXNEIE:接受緩沖區(qū)非空中斷使能(RXbuffernotemptyinterruptenable)0:嚴(yán)禁RXNE中斷;1:允許RXNE中斷,當(dāng)RXNE標(biāo)志置位時(shí)產(chǎn)生中斷請(qǐng)求。位5ERRIR:錯(cuò)誤中斷使能(Errorinterruptenable)當(dāng)錯(cuò)誤(CRCERR、OVR、MODF)產(chǎn)生時(shí),該位控制是否產(chǎn)生中斷0:嚴(yán)禁錯(cuò)誤中斷;1:允許錯(cuò)誤中斷。位4:3保存位,硬件強(qiáng)制為0。位2SSOE:SS輸出使能(SSoutputenable)0:嚴(yán)禁在主模式下SS輸出,該設(shè)備可以工作在多主設(shè)備模式;1:設(shè)備啟動(dòng)時(shí),啟動(dòng)主模式下SS輸出,該設(shè)備不能工作在多主設(shè)備模式。注:I2S模式下不使用。位1TXDMAEN:發(fā)送緩沖區(qū)DMA使能(TxbufferDMAenable)當(dāng)該位被設(shè)立時(shí),TXE標(biāo)志一旦被置位就發(fā)出DMA請(qǐng)求0:嚴(yán)禁發(fā)送緩沖區(qū)DMA;1:?jiǎn)?dòng)發(fā)送緩沖區(qū)DMA。位0RXDMAEN:接受緩沖區(qū)DMA使能(RxbufferDMAenable)當(dāng)該位被設(shè)立時(shí),RXNE標(biāo)志一旦被置位就發(fā)出DMA請(qǐng)求0:嚴(yán)禁接受緩沖區(qū)DMA;1:?jiǎn)?dòng)接受緩沖區(qū)DMA。SPI狀態(tài)寄存器(SPI_SR)地址偏移:0x08復(fù)位值:0x000215 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0保存BSYOVRMODFCRCERRUDRCHSIDETXERXNEres
r r r rcw0 r r r r位15:8保存位,硬件強(qiáng)制為0位7BSY:忙標(biāo)志(Busyflag)0:SPI不忙;1:SPI正忙于通信,或者發(fā)送緩沖非空。該位由硬件置位或者復(fù)位。注:使用這個(gè)標(biāo)志時(shí)需要特別注意,詳見(jiàn)第23.3.7節(jié)和第HYPERLIN
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 三農(nóng)人才培養(yǎng)方案集
- 2025年安陽(yáng)學(xué)院?jiǎn)握新殬I(yè)傾向性考試題庫(kù)標(biāo)準(zhǔn)卷
- 哈密文旅集團(tuán)實(shí)習(xí)的內(nèi)容
- 農(nóng)業(yè)科技技術(shù)應(yīng)用與推廣手冊(cè)
- 洋酒名酒知識(shí)培訓(xùn)課件
- 康美OTC終端藥店手繪POP培訓(xùn)教程
- 辦公場(chǎng)所租賃協(xié)議書(shū)
- 2025年安徽揚(yáng)子職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫(kù)1套
- 酒店管理與接待作業(yè)指導(dǎo)書(shū)
- 2025年白城職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)a4版
- 司機(jī)安全駕駛培訓(xùn)課件
- 硬化性肺泡細(xì)胞瘤-課件
- 簡(jiǎn)明新疆地方史趙陽(yáng)
- 狹窄性腱鞘炎中醫(yī)臨床路徑及表單
- Q∕SY 19001-2017 風(fēng)險(xiǎn)分類分級(jí)規(guī)范
- 智慧消防綜合解決方案
- 市場(chǎng)營(yíng)銷組合策略及營(yíng)銷戰(zhàn)略課件
- 信息技術(shù)基礎(chǔ)ppt課件(完整版)
- DGJ 08-70-2021 建筑物、構(gòu)筑物拆除技術(shù)標(biāo)準(zhǔn)
- 2022年義務(wù)教育語(yǔ)文課程標(biāo)準(zhǔn)(2022版)解讀【新課標(biāo)背景下的初中名著閱讀教學(xué)質(zhì)量提升思考】
- 屋面網(wǎng)架結(jié)構(gòu)液壓提升施工方案(50頁(yè))
評(píng)論
0/150
提交評(píng)論