MCU微課堂
CKS32F107XX系列串行外設(shè)接口介紹
第六十九期 2026.01.19
SPI簡(jiǎn)介
SPI協(xié)議是由摩托羅拉公司提出的通訊協(xié)議(Serial Peripheral Interface),即串行外圍設(shè)備接口,是一種高速全雙工的通信總線(xiàn)。它在芯片的管腳上只占用四根線(xiàn),節(jié)約了芯片的管腳,同時(shí)為PCB在布局上節(jié)省了空間。正是出于這種簡(jiǎn)單易用的特性,現(xiàn)在越來(lái)越多的芯片集成了這種通信協(xié)議,它被廣泛地使用在ADC、LCD、FLASH等設(shè)備與MCU之間。
中科芯CKS32F107xx系列產(chǎn)品擁有3路SPI接口,允許芯片與外部設(shè)備以半/全雙工、同步、串行方式通信。此接口可以被配置成主模式,并為外部從設(shè)備提供通信時(shí)鐘(SCK)。支持以多主配置的方式工作。下面就SPI相關(guān)特性進(jìn)行介紹。
SPI主要特征
SPI特征
● 3線(xiàn)全雙工同步傳輸
● 帶或不帶第三根雙向數(shù)據(jù)線(xiàn)的雙線(xiàn)單工同步傳輸
● 8或16位傳輸幀格式選擇
● 主或從操作
● 支持多主模式
● 8個(gè)主模式波特率預(yù)分頻系數(shù)(最大為fPCLK/2)
● 從模式頻率(最大為fPCLK/2)
● 主模式和從模式的快速通信
● 主模式和從模式下均可以由軟件或硬件進(jìn)行NSS管理:主/從操作模式的動(dòng)態(tài)改
● 可編程的數(shù)據(jù)順序,MSB在前或LSB在前
● 可觸發(fā)中斷的專(zhuān)用發(fā)送和接收標(biāo)志
● SPI總線(xiàn)忙狀態(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)求
SPI功能描述
SPI概述
SPI的方框圖見(jiàn)下圖。

圖1 SPI方框圖
圖中的①處是SPI的引腳MOSI、MISO、SCK、NSS。CKS32F107xx系列芯片通過(guò)以上四個(gè)引腳將SPI通訊信號(hào)引出到不同GPIO引腳上,使用時(shí)必須配置到這些指定的引腳。關(guān)于GPIO引腳的復(fù)用功能可以查閱芯片數(shù)據(jù)手冊(cè)。各個(gè)引腳的作用介紹如下:
●NSS:從設(shè)備選擇信號(hào)線(xiàn),常稱(chēng)為片選信號(hào)線(xiàn)。當(dāng)有多個(gè)SPI從設(shè)備與SPI主機(jī)相連時(shí),設(shè)備的其它信號(hào)線(xiàn)SCK、MOSI及MISO同時(shí)并聯(lián)到相同的SPI總線(xiàn)上,即無(wú)論有多少個(gè)從設(shè)備,都共同只使用這3條總線(xiàn);而每個(gè)從設(shè)備都有獨(dú)立的一條NSS信號(hào)線(xiàn),當(dāng)主機(jī)要選擇從設(shè)備時(shí),把該從設(shè)備的NSS信號(hào)線(xiàn)設(shè)置為低電平,該從設(shè)備即被選中,即片選有效,接著主機(jī)開(kāi)始與被選中的從設(shè)備進(jìn)行SPI通訊。
●SCK:時(shí)鐘信號(hào)線(xiàn),用于通訊數(shù)據(jù)同步。它由通訊主機(jī)產(chǎn)生,決定了通訊的速率,不同的設(shè)備支持的最高時(shí)鐘頻率不一樣,兩個(gè)設(shè)備之間通訊時(shí),通訊速率受限于低速設(shè)備。
●MOSI:主設(shè)備輸出/從設(shè)備輸入引腳。主機(jī)的數(shù)據(jù)從這條信號(hào)線(xiàn)輸出,從機(jī)由這條信號(hào)線(xiàn)讀入主機(jī)發(fā)送的數(shù)據(jù),即這條線(xiàn)上數(shù)據(jù)的方向?yàn)橹鳈C(jī)到從機(jī)。
●MISO:主設(shè)備輸入/從設(shè)備輸出引腳。主機(jī)從這條信號(hào)線(xiàn)讀入數(shù)據(jù),從機(jī)的數(shù)據(jù)由這條信號(hào)線(xiàn)輸出到主機(jī),即在這條線(xiàn)上數(shù)據(jù)的方向?yàn)閺臋C(jī)到主機(jī)。
圖中的②處是SCK線(xiàn)的時(shí)鐘信號(hào),由波特率發(fā)生器根據(jù)“控制寄存器CR1”中的BR[0:2]位控制,該位是對(duì)fpclk時(shí)鐘的分頻因子,對(duì)fpclk的分頻結(jié)果就是SCK引腳的輸出時(shí)鐘頻率。
圖中的③處是SPI的數(shù)據(jù)控制邏輯。SPI的MOSI及MISO都連接到數(shù)據(jù)移位寄存器上,數(shù)據(jù)移位寄存器的內(nèi)容來(lái)源于接收緩沖區(qū)及發(fā)送緩沖區(qū)以及MISO、MOSI線(xiàn)。當(dāng)向外發(fā)送數(shù)據(jù)的時(shí)候,數(shù)據(jù)移位寄存器以“發(fā)送緩沖區(qū)”為數(shù)據(jù)源,把數(shù)據(jù)一位一位地通過(guò)數(shù)據(jù)線(xiàn)發(fā)送出去;當(dāng)從外部接收數(shù)據(jù)的時(shí)候,數(shù)據(jù)移位寄存器把數(shù)據(jù)線(xiàn)采樣到的數(shù)據(jù)一位一位地存儲(chǔ)到“接收緩沖區(qū)”中。通過(guò)寫(xiě)SPI的“數(shù)據(jù)寄存器DR”把數(shù)據(jù)填充到發(fā)送緩沖區(qū)中,通過(guò)“數(shù)據(jù)寄存器DR”,可以獲取接收緩沖區(qū)中的內(nèi)容。其中數(shù)據(jù)幀的長(zhǎng)度可以通過(guò)“控制寄存器CR1”的“DFF位”配置成8位及16位模式;配置“LSBFIRST位”可選擇MSB先行還是LSB先行。
圖中的④處是SPI的整體控制邏輯。整體控制邏輯負(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)”,我們只要讀取狀態(tài)寄存器相關(guān)的寄存器位,就可以了解SPI的工作狀態(tài)了。除此之外,控制邏輯還根據(jù)要求,負(fù)責(zé)控制產(chǎn)生SPI中斷信號(hào)、DMA請(qǐng)求及控制NSS信號(hào)線(xiàn)。實(shí)際應(yīng)用中,我們一般不使用SPI外設(shè)的標(biāo)準(zhǔn)NSS信號(hào)線(xiàn),而是更簡(jiǎn)單地使用普通的GPIO,軟件控制它的電平輸出。
CKS32F107xx系列產(chǎn)品SPI配置:
接下來(lái)我們講解如何利用CKS32F107xx系列固件庫(kù)來(lái)完成對(duì)SPI的配置使用。跟其它外設(shè)一樣,CKS32標(biāo)準(zhǔn)庫(kù)提供了SPI初始化結(jié)構(gòu)體及初始化函數(shù)來(lái)配置SPI外設(shè)。了解初始化結(jié)構(gòu)體后我們就能對(duì)SPI外設(shè)運(yùn)用自如了,結(jié)構(gòu)體如下圖所示:

圖2 SPI配置結(jié)構(gòu)體
結(jié)構(gòu)體中各個(gè)函數(shù)變量的介紹及初始化時(shí)可被賦的值如下:
1) SPI_Direction:該函數(shù)設(shè)置SPI的通訊方向,可設(shè)置為雙線(xiàn)全雙工(SPI_Direction_2Lines_FullDuplex),雙線(xiàn)只接收(SPI_Direction_2Lines_RxOnly),單線(xiàn)只接收(SPI_Direction_1Line_Rx)、單線(xiàn)只發(fā)送模式(SPI_Direction_1Line_Tx)。
2) SPI_Mode:該函數(shù)設(shè)置SPI工作在主機(jī)模式(SPI_Mode_Master)或從機(jī)模式(SPI_Mode_Slave),這兩個(gè)模式的最大區(qū)別為SPI的SCK信號(hào)線(xiàn)的時(shí)序,SCK的時(shí)序是由通訊中的主機(jī)產(chǎn)生的。若被配置為從機(jī)模式,CKS32的SPI外設(shè)將接受外來(lái)的SCK信號(hào):
3) SPI_DataSize:該函數(shù)可以選擇SPI通訊的數(shù)據(jù)幀大小是為8位(SPI_DataSize_8b)還是16位(SPI_DataSize_16b)。
4) SPI_CPOL和SPI_CPHA:這兩個(gè)函數(shù)配置SPI的時(shí)鐘極性CPOL和時(shí)鐘相位CPHA,前面講過(guò)這兩個(gè)配置影響到SPI的通訊模式。時(shí)鐘極性CPOL成員可設(shè)置為高電平(SPI_CPOL_High)或低電平(SPI_CPOL_Low)。時(shí)鐘相位CPHA則可以設(shè)置為SPI_CPHA_1Edge(在SCK的奇數(shù)邊沿采集數(shù)據(jù))或SPI_CPHA_2Edge(在SCK的偶數(shù)邊沿采集數(shù)據(jù)),具體組合設(shè)置方式可參考圖2。

圖3 數(shù)據(jù)時(shí)鐘時(shí)序圖
5) SPI_NSS:該函數(shù)配置NSS引腳的使用模式,可以選擇為硬件模式(SPI_NSS_Hard)與軟件模式(SPI_NSS_Soft),在硬件模式中的SPI片選信號(hào)由SPI硬件自動(dòng)產(chǎn)生,而軟件模式則需要我們自己把相應(yīng)的GPIO端口拉高或置低產(chǎn)生非片選和片選信號(hào)。實(shí)際中軟件模式應(yīng)用比較多。
6) SPI_BaudRatePrescaler:該函數(shù)設(shè)置波特率分頻因子,分頻后的時(shí)鐘即為SPI的SCK信號(hào)線(xiàn)的時(shí)鐘頻率。這個(gè)成員參數(shù)可設(shè)置為fpclk的2、4、8、16、32、64、128、256分頻??蛇x的值如下圖所示:

圖4 SPI波特率分頻
7) SPI_FirstBit:所有串行的通訊協(xié)議都會(huì)有MSB先行(高位數(shù)據(jù)在前)還是LSB先行(低位數(shù)據(jù)在前)的問(wèn)題,而CKS32F107VET6的SPI模塊可以通過(guò)這個(gè)結(jié)構(gòu)體,對(duì)這個(gè)特性編程控制。

圖5 SPI數(shù)據(jù)先行方式
8) SPI_CRCPolynomial:這是SPI的CRC校驗(yàn)中的多項(xiàng)式,若我們使用CRC校驗(yàn)時(shí),就使用這個(gè)參數(shù)(多項(xiàng)式),來(lái)計(jì)算CRC的值。
配置完這些結(jié)構(gòu)體成員的值,調(diào)用庫(kù)函數(shù)SPI_Init即可把結(jié)構(gòu)體的配置寫(xiě)入到寄存器中。
SPI外設(shè)主要可通過(guò)主模式和從模式兩種方式進(jìn)行實(shí)現(xiàn),現(xiàn)在就兩個(gè)模式分別進(jìn)行講解。
配置SPI為主模式
在主配置時(shí),在SCK腳產(chǎn)生串行時(shí)鐘。
配置步驟:
(1)通過(guò)SPI_CR1寄存器的BR[2:0]位定義串行時(shí)鐘波特率;
(2)選擇CPOL和CPHA位,定義數(shù)據(jù)傳輸和串行時(shí)鐘間的相位關(guān)系(見(jiàn)圖4);
(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)部總線(xiàn))傳入移位寄存器,而后串行地移出到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)志被置位。
●如果設(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)該為‘1’。
注:在NSS硬件模式下,從設(shè)備的NSS輸入由NSS引腳控制或另一個(gè)由軟件驅(qū)動(dòng)的GPIO引腳控制。
具體初始化代碼如下:
void SPI_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/* Configure SPI1 Pins PA.4 NSS(software); PA.5 SCK; PA.6 MISO; PA.7 MOSI--------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_WriteBit( GPIOA, GPIO_Pin_4, Bit_SET );
/* Configure SPI1 -----------------------------------------------------------*/
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStruct);
SPI_Cmd(SPI1, ENABLE);
}
單字節(jié)收發(fā)函數(shù)代碼如下:
uint8_t CKS_SPI_Tx_Rx_Byte(uint8_t data)
{
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, data);
while( SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);
}
配置SPI為從模式
在從模式下,SCK引腳用于接收從主設(shè)備來(lái)的串行時(shí)鐘。SPI_CR1寄存器中BR[2:0]的設(shè)置不影響數(shù)據(jù)傳輸速率。
注:建議在主設(shè)備發(fā)送時(shí)鐘之前使能SPI從設(shè)備,否則可能會(huì)發(fā)生意外的數(shù)據(jù)傳輸。在通信時(shí)鐘的第一個(gè)邊沿到來(lái)之前或正在進(jìn)行的通信結(jié)束之前,從設(shè)備的數(shù)據(jù)寄存器必須就緒。在使能從設(shè)備和主設(shè)備之前,通信時(shí)鐘的極性必須處于穩(wěn)定的數(shù)值。請(qǐng)按照以下步驟配置SPI為從模式:
配置步驟
(1)設(shè)置DFF位以定義數(shù)據(jù)幀格式為8位或16位。
(2)選擇CPOL和CPHA位來(lái)定義數(shù)據(jù)傳輸和串行時(shí)鐘之間的相位關(guān)系。為保證正確的數(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è)置。
● 如果設(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位被清除。
上述部分是SPI的主/從模式理論配置過(guò)程,下面開(kāi)始對(duì)實(shí)際程序中的代碼配置進(jìn)行分解。程序較為簡(jiǎn)單,使用單顆CKS32F107VET6的SPI1外設(shè)作為主機(jī),SPI2外設(shè)作為從機(jī),通過(guò)兩路外設(shè)互相通信(先SPI1發(fā),SPI2收;再SPI2發(fā),SPI1收)的方式實(shí)現(xiàn)。
本講中,我們以簡(jiǎn)單的數(shù)據(jù)接收發(fā)送為例進(jìn)行配置,具體初始化代碼如下:
uint8_t CKS_SPI_Tx_Rx_Byte(uint8_t data)
{
while (SPI_I2S_GetFlagStatus(SPI1,
void SPI_Slaver_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO, ENABLE);
/* Configure SPI1 Pins PA.4 NSS(software); PA.5 SCK; PA.6 MISO; PA.7 MOSI--------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure SPI1 -----------------------------------------------------------*/
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Slave;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStruct);
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);
SPI_Cmd(SPI1, ENABLE);
/* Configure SPI1 INT------------------------------------------------------*/
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
) == RESET);
SPI_I2S_SendData(SPI1, data);
while( SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);
}
SPI中斷函數(shù):
void SPI1_IRQHandler(void)
{
if(SPI_I2S_GetITStatus(SPI1, SPI_I2S_IT_RXNE) != RESET)
{
SPI_Rx = SPI_I2S_ReceiveData(SPI1);
if(SPI_Rx <= 0x04)
{
SPI_I2S_SendData(SPI1, SPI_Tx[SPI_Rx]);
}
else
{
SPI_I2S_SendData(SPI1, SPI_Tx[0x05]);
}
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}
SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_RXNE);
}
}
-
mcu
+關(guān)注
關(guān)注
147文章
18917瀏覽量
397867 -
adc
+關(guān)注
關(guān)注
100文章
7511瀏覽量
555876 -
SPI協(xié)議
+關(guān)注
關(guān)注
0文章
24瀏覽量
8832 -
串行外設(shè)接口
+關(guān)注
關(guān)注
0文章
23瀏覽量
4180
原文標(biāo)題:MCU微課堂|CKS32F107XX系列串行外設(shè)接口介紹
文章出處:【微信號(hào):中科芯MCU,微信公眾號(hào):中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
中科芯CKS32F107XX系列MCU的獨(dú)立看門(mén)狗介紹
中科芯CKS32F107XX系列MCU的窗口看門(mén)狗介紹
中科芯CKS32F107XX系列MCU的bxCAN介紹
MCU微課堂|CKS32F4xx系列產(chǎn)品時(shí)鐘配置
中科芯CKS32F030K6T6 高性能32位RISC內(nèi)核MCU 程序兼容STM32F030K6T6
中科芯推出面向CKS32位MCU的編程調(diào)試工具
CKS32F107xx系列時(shí)鐘組成介紹
CKS32F107xx系列時(shí)鐘系統(tǒng)具體配置方法講解
CKS32F107xx系列MCU中ADC介紹
CKS32F107xx系列MCU的GPIO內(nèi)部硬件結(jié)構(gòu)和工作模式
詳解CKS32F107xx系列的定時(shí)器同步功能
中科芯CKS32F107XX系列MCU的串行外設(shè)接口介紹
評(píng)論