一、概述
SPI是Serial Peripheral interface的縮寫,是一種串行外設(shè)接口。全雙工通信,有4根信號(hào)線,在MCU、SOC、FLASH、DSP等芯片上常見。
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
所謂的模式,是指可以通過配置CPOL(時(shí)鐘極性)來設(shè)定CLK空閑狀態(tài)的電平是高還是低;通過配置CPHA(時(shí)鐘相位)來設(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)注
555文章
8141瀏覽量
355127 -
STM32
+關(guān)注
關(guān)注
2289文章
11011瀏覽量
362270 -
SPI
+關(guān)注
關(guān)注
17文章
1775瀏覽量
94648 -
時(shí)鐘信號(hào)
+關(guān)注
關(guān)注
4文章
465瀏覽量
29063 -
MCU芯片
+關(guān)注
關(guān)注
3文章
256瀏覽量
11961
發(fā)布評(píng)論請(qǐng)先 登錄
串行外設(shè)接口SPI模塊簡析
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è)接口的編程說明資料免費(fèi)下載

SPI 串行外設(shè)接口

SPI串行外設(shè)接口設(shè)計(jì)實(shí)現(xiàn)

評(píng)論