SPI協議簡介:網絡
SPI是摩托羅拉公司提出的一種通訊協議,運用了全雙工的通訊方式。其通信速率能夠達到Mbps的數量級,是一種普遍使用,優秀的通訊協議。在STM32的開發中,常常被用來進行Flash存儲器的通訊,也被用做向一些小的液晶屏幕發送數據。spa
物理層:code
在SPI的通訊中,信號線有兩條,MOSI,MISO,對應的兩個通訊方向,即主機》從機。從機》主機,在一些狀況下,咱們只使用主到從的這條信號線(例如控制液晶屏的顯示,液晶屏不返回信息),時鐘信號線有一條,即SCK。而後即是若干條片選信號線(SS)。對象
片選信號線是SPI通訊的特色之一,SPI通訊總線上有幾個設備,就存在幾條片選信號線。當某一個片選信號線的電平被拉低,這個設備就被選中,即被選爲通訊對象。(圖源網絡)blog
協議層:ip
在協議層中,SPI經過SCK時鐘信號線來統一時間基準。具體通訊流程有三步:(圖源網絡)開發
開始:SS信號線拉低,通訊開始。it
傳輸數據:MOSI\MISO在每一個時鐘週期都會傳輸一位數據。io
結束:SS信號拉高,傳輸結束。ast
須要注意的是,在SPI中,存在着幾個不一樣的傳輸數據模式:首先,SCK在空閒時,有高電平和低電平兩種狀態(圖中爲空閒高電平)。其次,信號線會在時鐘信號對的邊緣進行採樣(虛線位置),而採樣的邊緣選擇有兩種:奇數邊緣和偶數邊緣(圖中爲偶數邊緣)。一般,咱們使用SCK空閒高電平,偶數邊緣採樣。或者SCK空閒低電平,奇數邊緣採樣。
STM32中的SPI:
STM32中的SPI初始化:
void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE ); 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_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI設置爲雙線雙向全雙工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //定義此設備爲主機 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI發送接收8位幀結構 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //選擇了串行時鐘的穩態:時鐘懸空高 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //數據捕獲於第二個時鐘沿 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信號由軟件控制 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定義波特率預分頻的值:波特率預分頻值爲256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //數據傳輸從MSB位開始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值計算的多項式 SPI_Init(SPI1, &SPI_InitStructure); //初始化外設SPI1寄存器 SPI_Cmd(SPI1, ENABLE); //使能SPI外設