一、概述
SPI是Serial Peripheral interface的縮寫(xiě),是一種串行外設(shè)接口。全雙工通信,有4根信號(hào)線,在MCU、SOC、FLASH、DSP等芯片上常見(jiàn)。
SPI特點(diǎn)
SPI接口只有一個(gè)主機(jī),可以有一個(gè)或者多個(gè)從機(jī)。時(shí)鐘信號(hào)由主機(jī)發(fā)送,所以主機(jī)要讀一個(gè)字節(jié)就需要發(fā)送一個(gè)字節(jié),為從機(jī)提供時(shí)鐘信號(hào)。當(dāng)存在多個(gè)從機(jī)時(shí)由CS片選信號(hào)選擇從機(jī)。
一主一從連接框圖

一主多從連接框圖

SPI的片選信號(hào)
如果是一主一從也可以不使用片選信號(hào),此時(shí)從機(jī)SPI的接收數(shù)據(jù)中斷使能,在中斷ISR里處理數(shù)據(jù);如果使用片選信號(hào),可以不使用SPI硬件片選信號(hào),可以使用一個(gè)帶外部中斷功能的IO作為CS。
SPI的4根信號(hào)
MISO: 主機(jī)輸入/從機(jī)輸出引腳。
MOSI: 主機(jī)輸出/從機(jī)輸入引腳。
CLK:串行時(shí)鐘信號(hào),由主機(jī)產(chǎn)生。
CS:從機(jī)片選信號(hào),由主機(jī)控制。
當(dāng)然,4根線也不是必須全用上,可以只發(fā)送或只接收。可以參考STM32的SPI介紹。
SPI的4種mode
所謂的模式,是指可以通過(guò)配置CPOL(時(shí)鐘極性)來(lái)設(shè)定CLK空閑狀態(tài)的電平是高還是低;通過(guò)配置CPHA(時(shí)鐘相位)來(lái)設(shè)定在CLK的哪個(gè)沿進(jìn)行數(shù)據(jù)采樣和數(shù)據(jù)發(fā)送。CPOL和CPHA可以配置成0或1,所以組合有4種mode。
主機(jī)和從機(jī)的使用的mode要匹配對(duì)應(yīng)。比如SPI FLASH只支持兩種mode,所以主機(jī)初始化配置要注意。如下圖FLASH只支持mode 0 和 mode 3:

二、STM32程序初始化舉例
void SPI1_Init(void)
{
//Enable SPI1 clock and GPIO clock for SPI1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
//Configure SPI1 pins: SCK, MISO and MOSI
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//SPI1 Config
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;//主從機(jī)的配置相同
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//主從機(jī)的配置相同
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;//主從機(jī)的配置相同
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_RXNE,ENABLE);//使能接收中斷
//Enable SPI1
SPI_Cmd(SPI1, ENABLE);
}
-
dsp
+關(guān)注
關(guān)注
561文章
8244瀏覽量
366682 -
STM32
+關(guān)注
關(guān)注
2309文章
11162瀏覽量
373477 -
SPI
+關(guān)注
關(guān)注
17文章
1885瀏覽量
101266 -
時(shí)鐘信號(hào)
+關(guān)注
關(guān)注
4文章
505瀏覽量
29981 -
MCU芯片
+關(guān)注
關(guān)注
3文章
260瀏覽量
12897
發(fā)布評(píng)論請(qǐng)先 登錄
串行外設(shè)接口SPI模塊簡(jiǎn)析
ADIuC812的串行外設(shè)接口(SPI)及其在LonWork
串行外設(shè)接口SPI
理解ATE SPI (串行外設(shè)接口)
一文讀懂SPI串行外設(shè)接口
dsPIC33E/PIC24E器件之串行外設(shè)接口(SPI)
dsPIC30F系列參考手冊(cè)之串行外設(shè)接口(SPI)
PIC24F系列參考手冊(cè)之串行外設(shè)接口(SPI)
PIC24H系列參考手冊(cè)之串行外設(shè)接口(SPI)
SPI串行外設(shè)接口的編程說(shuō)明資料免費(fèi)下載
SPI 串行外設(shè)接口
SPI串行外設(shè)接口設(shè)計(jì)實(shí)現(xiàn)
SPI串行外設(shè)接口的特點(diǎn)概述
評(píng)論