一、概述
SPI是Serial Peripheral interface的縮寫,是一種串行外設(shè)接口。全雙工通信,有4根信號線,在MCU、SOC、FLASH、DSP等芯片上常見。
SPI特點(diǎn)
SPI接口只有一個(gè)主機(jī),可以有一個(gè)或者多個(gè)從機(jī)。時(shí)鐘信號由主機(jī)發(fā)送,所以主機(jī)要讀一個(gè)字節(jié)就需要發(fā)送一個(gè)字節(jié),為從機(jī)提供時(shí)鐘信號。當(dāng)存在多個(gè)從機(jī)時(shí)由CS片選信號選擇從機(jī)。
一主一從連接框圖
一主多從連接框圖
SPI的片選信號
如果是一主一從也可以不使用片選信號,此時(shí)從機(jī)SPI的接收數(shù)據(jù)中斷使能,在中斷ISR里處理數(shù)據(jù);如果使用片選信號,可以不使用SPI硬件片選信號,可以使用一個(gè)帶外部中斷功能的IO作為CS。
SPI的4根信號
MISO: 主機(jī)輸入/從機(jī)輸出引腳。
MOSI: 主機(jī)輸出/從機(jī)輸入引腳。
CLK:串行時(shí)鐘信號,由主機(jī)產(chǎn)生。
CS:從機(jī)片選信號,由主機(jī)控制。
當(dāng)然,4根線也不是必須全用上,可以只發(fā)送或只接收??梢詤⒖?a href="http://www.nxhydt.com/v/tag/751/" target="_blank">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要匹配對應(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)注
552文章
7962瀏覽量
348308 -
STM32
+關(guān)注
關(guān)注
2266文章
10876瀏覽量
354927 -
SPI
+關(guān)注
關(guān)注
17文章
1701瀏覽量
91345 -
時(shí)鐘信號
+關(guān)注
關(guān)注
4文章
445瀏覽量
28512 -
MCU芯片
+關(guān)注
關(guān)注
3文章
248瀏覽量
11394
發(fā)布評論請先 登錄
相關(guān)推薦
評論