2016.12.02_SPI通訊方式的使用總結
1 SPI的簡介及基本特點
1 SPI的簡單介紹
最近工作中使用了SPI通訊方式來做TM4C129和STM32之間的通訊,為了更好地解決問題就學習了SPI原理的相關內容,完成了專案之後,也對這種通訊方式有了較為深入的瞭解,現在來對SPI的使用方法進行詳細的總結。
SPI 是英語 Serial Peripheral interface 的縮寫,顧名思義就是序列外圍裝置介面。SPI匯流排是Motorola公司推出的三線同步介面,同步序列3線方式進行通訊:一條時鐘線SCK,一條資料輸入線MOSI,一條資料輸出線MISO; SPI 介面主要應用在 EEPROM, FLASH,實時時鐘, AD 轉換器,還有數字訊號處理器和數字訊號解碼器之間。 SPI,是一種高速的,全雙工,同步的通訊匯流排,並且在晶片的管腳上只佔用四根線,節約了晶片的管腳,同時為 PCB 的佈局上節省空間,提供方便,正是出於這種簡單易用的特性,現在越來越多的晶片集成了這種通訊協議. 下圖為SPI 的內部簡明圖:
SPI全雙工的特點:一邊傳送一邊接收,硬體上只有一個SPI_DR暫存器和兩個緩衝器(傳送緩衝器和接收緩衝器),主模式:SPI_DR會先從傳送緩衝器讀出資料,然後通過MOSI引腳一位一位地將資料發出去,在傳送的過程中,SPI_DR的資料會左移(如果是高位先發送),並且會從MISO引腳讀入資料填補SPI_DR左移後的空缺。傳輸8位元資料後,SPI_DR再把資料並行寫入接收緩衝暫存器。
2 SPI的通訊介面
MISO :主裝置資料輸入,從裝置資料輸出。 MOSI :主裝置資料輸出,從裝置資料輸入。 SCLK : 時鐘訊號,由主裝置產生。 CS : 從裝置片選訊號,由主裝置控制。當從裝置的片選被拉低的時候,才能從SPI總線上獲取資料資訊。 這裡需要知道的地方是,根據SPI被配置成主或者從模式,MIMO和MOSI引腳的功能會自動改變,實現傳送和接收的切換。
3 SPI 主要特點:
- 1.可以同時發出和接收序列資料;
- 2.可以當作主機或從機工作;主機發送時鐘頻率可程式設計控制;
- 3.有傳送結束中斷標誌;
- 4.寫衝突保護;
- 5.匯流排競爭保護;
2 SPI的四種工作方式
SPI 匯流排根據時鐘極性和時鐘相位的不同有四種工作方式 ,根據我們所需要通訊的外設工作要求的不同,給SPI控制器配置為不同的工作模式,以滿足
1. 時鐘極性( CPOL) :
如果 CPOL=0,串行同步時鐘的空閒狀態為低電平。
如果 CPOL=1,串行同步時鐘的空閒狀態為高電平。
時鐘極性對傳輸協議沒有重大影響,只是規定了串行同步時鐘在空閒時的電平為高還是為低。
2. 時鐘相位( CPHA) :
如果 CPHA=0,在串行同步時鐘的第一個跳變沿(上升或下降)資料被取樣。
如果 CPHA=1,在串行同步時鐘的第二個跳變沿(上升或下降)資料被取樣。
時鐘相位主要是在設定資料在什麼時候改變和什麼時候被取樣。
注意:在配置SPI模組時,SPI 主機和與之通訊的外裝置時鐘相位和極性應該一致。
注意:
1. 如果時鐘相位為0,則主從都需要在第一個時鐘沿跳邊之前將需要傳送的資料準備好並上線。在第一個時鐘沿來臨的時候進行資料取樣。
2. 如果時鐘相位為1,則主從都在第一個時鐘沿到來的時候開始準備資料並上線,等待第二個時鐘沿來臨的時候對資料進行取樣。
3. 如果主從雙方的時鐘極性和相位不同,則會出現資料移位錯誤的問題。SPI通訊方式中要求從器件先工作,然後主器件才開始傳送資料,否則可能發生資料傳輸錯誤,而且之後的資料都會出錯。
SPI的引數設定
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|
RCC_APB2Periph_SPI1, ENABLE ); //GPIO,SPI 時鐘使能
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);
//①初始化 GPIO
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
//設定 SPI 全雙工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
//設定 SPI 工作模式:設定為主 SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // 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);
//②根據指定的引數初始化外設 SPIx 暫存器
SPI_Cmd(SPI1, ENABLE); / /③使能 SPI 外設
SPI1_ReadWriteByte(0xff); / /④啟動傳輸
連續和非連續傳輸:當在主模式下發送資料時,如果軟體足夠快,能夠在檢測到每次TXE的上升沿(或者TXE中斷),並立即在正在進行的傳輸結束之前寫入SPI_DR暫存器,則能夠實現連續的通訊;此時,在每個資料項的傳輸之間的SPI時鐘保持連續,同時BSY位不會被清除。如果軟體不夠快,則會導致不連續的通訊,這時狀態位在每個資料傳輸之間會被清除。
為了達到最大通訊速度,需要及時的往SPI傳送緩衝器填充資料,同樣接收緩衝器中的資料也必須及時讀走以防止溢位。為了方便高速率的資料傳輸,SPI實現了一種採用簡單的請求、應答的DMA機制。
直接儲存器存取,DMA是電腦科學中的一種記憶體訪問技術。他允許某些電腦內部的硬體子系統,可以獨立的直接讀寫系統儲存器,而不需要繞道CPU,在同等程度的CPU負擔下,DMA是一種快速的資料傳送方式。它允許不同速度的硬體裝置來溝通,而不需要依賴於CPU的大量中斷請求。
SPI的狀態標誌
狀態標誌:
應用程式可以通過三個狀態標誌可以完全監控SPI匯流排的狀態。
傳送緩衝器空閒標誌(TXE)
此標誌為1時表明傳送緩衝器為空,可以寫入下一個待發送的資料進入緩衝器。當寫入傳送暫存器SPI_DR時,TXE被清除。
接收緩衝器為非空(RXNE)
此標誌為1時表明在接收緩衝器中包含有效的接收資料。讀SPI資料暫存器可以清除此標誌。
忙(BUSY)標誌
BSY標誌由硬體設定與清除(寫入此位無效果),此標誌表明SPI通訊層的狀態,當被設定為1時,說明SPI正在忙於通訊,但有一個例外:在主模式的雙線接收模式下,(MSTR=1),BDM=1,並且BDOE=0,在接收期間BSY標誌保持為低。
在軟體要關閉SPI模式並進入停機模式之前,可以使用BSY標誌檢測傳輸是否結束,這樣可以避免破壞最後一次傳輸,因此需要嚴格按照下述過程執行。
BSY標誌還可以用於在多主系統中避免寫衝突。
SPI的應用總結
使用總結:
1.在使用SPI通訊的時候首先要確定引腳對接正確;主器件和從器件的MISO,MOSI,CLK連在一起。CS引腳根據採用軟體和硬體NSS來確定。如果有多個器件公用一個SPI則必須採用分時複用的方法,通過片選控制。
2.注意SPI通訊主從機的時鐘極性和時鐘相位須一致。
3.使用合適的SPI通訊速率,不要超過從裝置的最大通訊速率。
4.NSS引腳一定要接,保證被硬體或者軟體控制,否則可能會出現誤碼。
5.建議在主裝置傳送時鐘之前使能SPI從裝置,否則可能會發生意外的資料傳輸。在通訊時鐘的第一個邊沿到來之前或者正在進行的通訊結束之前,從裝置IDE資料暫存器必須就緒。在使能從裝置和主裝置之前,通訊時鐘的極性必須處於穩定的數值。
6.使用STM32向SPI匯流排寫資料時要注意檢查:1.傳送緩衝器是否空閒。2.SPI匯流排是否忙,否則可能會發送亂碼。關閉SPI之前也要檢查匯流排是否為忙,否則會破壞最後一次SPI傳輸。
SPI的常見錯誤以及解決辦法
還有溢位錯誤和移位錯誤和其它的一些錯誤可以在下面的網頁中找到。
裡面介紹的很詳細。