SPI (Serial Peripheral Interface)串行外設接口 協議詳解+實例

SPI (Serial Peripheral Interface)串行外設接口 協議詳解+實例

1、協議簡介php

SPI協議簡介(轉) (2008-04-26 16:24)

來自:http://blog.chinaunix.net/space.php?uid=20697149&do=blog&id=1891451編程


SPI協議簡介

(下面內容摘自互聯網)
一 SPI協議歸納
二 SPI協議舉例
三 SPI協議心得
佈局

一 SPI協議歸納學習

SPI,是英語Serial Peripheral interface的縮寫,顧名思義就是串行外圍設備接口。是Motorola首先在其MC68HCXX系列處理器上定義的。SPI接口主要應用在 EEPROM,FLASH,實時時鐘,AD轉換器,還有數字信號處理器和數字信號解碼器之間。SPI,是一種高速的,全雙工,同步的通訊總線,而且在芯片的管腳上只佔用四根線,節約了芯片的管腳,同時爲PCB的佈局上節省空間,提供方便,正是出於這種簡單易用的特性,如今愈來愈多的芯片集成了這種通訊協議,好比AT91RM9200.ui

SPI的通訊原理很簡單,它以主從方式工做,這種模式一般有一個主設備和一個或多個從設備,須要至少4根線,事實上3根也能夠(單向傳輸時)。也是全部基於SPI的設備共有的,它們是SDI(數據輸入),SDO(數據輸出),SCK(時鐘),CS(片選)。spa

(1)SDO     – 主設備數據輸出,從設備數據輸入.net

(2)SDI      – 主設備數據輸入,從設備數據輸出設計

(3)SCLK   – 時鐘信號,由主設備產生unix

(4)CS        – 從設備使能信號,由主設備控制code

其中CS是控制芯片是否被選中的,也就是說只有片選信號爲預先規定的使能信號時(高電位或低電位),對此芯片的操做纔有效。這就容許在同一總線上鏈接多個SPI設備成爲可能。

接下來就負責通信的3根線了。通信是經過數據交換完成的,這裏先要知道SPI是串行通信協議,也就是說數據是一位一位的傳輸的。這就是SCK時鐘線存在的緣由,由SCK提供時鐘脈衝,SDI,SDO則基於此脈衝完成數據傳輸。數據輸出經過 SDO線,數據在時鐘上升沿或降低沿時改變,在緊接着的降低沿或上升沿被讀取。完成一位數據傳輸,輸入也使用一樣原理。這樣,在至少8次時鐘信號的改變(上沿和下沿爲一次),就能夠完成8位數據的傳輸。

要注意的是,SCK信號線只由主設備控制,從設備不能控制信號線。一樣,在一個基於SPI的設備中,至少有一個主控設備。這樣傳輸的特色:這樣的傳輸方式有一個優勢,與普通的串行通信不一樣,普通的串行通信一次連續傳送至少8位數據,而SPI容許數據一位一位的傳送,甚至容許暫停,由於SCK時鐘線由主控設備控制,當沒有時鐘跳變時,從設備不採集或傳送數據。也就是說,主設備經過對SCK時鐘線的控制能夠完成對通信的控制。SPI仍是一個數據交換協議:由於SPI的數據輸入和輸出線獨立,因此容許同時完成數據的輸入和輸出。不一樣的SPI設備的實現方式不盡相同,主要是數據改變和採集的時間不一樣,在時鐘信號上沿或下沿採集有不一樣定義,具體請參考相關器件的文檔。

在點對點的通訊中,SPI接口不須要進行尋址操做,且爲全雙工通訊,顯得簡單高效。在多個從設備的系統中,每一個從設備須要獨立的使能信號,硬件上比I2C系統要稍微複雜一些。

最後,SPI接口的一個缺點:沒有指定的流控制,沒有應答機制確認是否接收到數據。

AT91RM9200的SPI接口主要由4個引腳構成:SPICLK、MOSI、MISO及 /SS,其中SPICLK是整個SPI總線的公用時鐘,MOSI、MISO做爲主機,從機的輸入輸出的標誌,MOSI是主機的輸出,從機的輸入,MISO 是主機的輸入,從機的輸出。/SS是從機的標誌管腳,在互相通訊的兩個SPI總線的器件,/SS管腳的電平低的是從機,相反/SS管腳的電平高的是主機。在一個SPI通訊系統中,必須有主機。SPI總線能夠配置成單主單從,單主多從,互爲主從。

SPI的片選能夠擴充選擇16個外設,這時PCS輸出=NPCS,說NPCS0~3接4-16譯碼器,這個譯碼器是須要外接4-16譯碼器,譯碼器的輸入爲NPCS0~3,輸出用於16個外設的選擇。

二 SPI協議舉例

SPI
是一個環形總線結構,由sscs)、scksdisdo構成,其時序其實很簡單,主要是在sck的控制下,兩個雙向移位寄存器進行數據交換。
      
假設下面的8位寄存器裝的是待發送的數據10101010,上升沿發送、降低沿接收、高位先發送。
      
那麼第一個上升沿來的時候 數據將會是sdo=1;寄存器=0101010x。降低沿到來的時候,sdi上的電平將所存到寄存器中去,那麼這時寄存器=0101010sdi,這樣在 8個時鐘脈衝之後,兩個寄存器的內容互相交換一次。這樣就完成裏一個spi時序。

舉例:
      
假設主機和從機初始化就緒:而且主機的sbuff=0xaa,從機的sbuff=0x55,下面將分步對spi8個時鐘週期的數據狀況演示一遍:假設上升沿發送數據

圖片點擊可在新窗口打開查看
這樣就完成了兩個寄存器8位的交換,上面的上表示上升沿、下表示降低沿,sdisdo相對於主機而言的。其中ss引腳做爲主機的時候,從機能夠把它拉底被動選爲從機,做爲從機的是時候,能夠做爲片選腳用。根據以上分析,一個完整的傳送週期是16位,即兩個字節,由於,首先主機要發送命令過去,而後從機根據主機的命令準備數據,主機在下一個8位時鐘週期才把數據讀回來。
      SPI 總線是Motorola公司推出的三線同步接口,同步串行3線方式進行通訊:一條時鐘線SCK,一條數據輸入線MOSI,一條數據輸出線MISO;用於CPU與各類外圍器件進行全雙工、同步串行通信。SPI主要特色有:能夠同時發出和接收串行數據;能夠看成主機或從機工做;提供頻率可編程時鐘;發送結束 中斷標誌;寫衝突保護;總線競爭保護等。下圖示出SPI總線工做的四種方式,其中使用的最爲普遍的是SPI0和SPI3方式 (實線表示):
                    

                            

                                                    圖片點擊可在新窗口打開查看

                                                                                               SPI總線四種工做方式

SPI 模塊爲了和外設進行數據交換,根據外設工做要求,其輸出串行同步時鐘極性和相位能夠進行配置,時鐘極性(CPOL)對傳輸協議沒有重大的影響。若是 CPOL=0,串行同步時鐘的空閒狀態爲低電平;若是CPOL=1,串行同步時鐘的空閒狀態爲高電平。時鐘相位(CPHA)可以配置用於選擇兩種不一樣的傳輸協議之一進行數據傳輸。若是CPHA=0,在串行同步時鐘的第一個跳變沿(上升或降低)數據被採樣;若是CPHA=1,在串行同步時鐘的第二個跳變沿(上升或降低)數據被採樣。SPI主模塊和與之通訊的外設備時鐘相位和極性應該一致。



補充:

上文中最後一句話:SPI主模塊和與之通訊的外設備時鐘相位和極性應該一致。我的理解這句話有2層意思:其一,主設備SPI時鐘和極性的配置應該由外設來決定;其二,兩者的配置應該保持一致,即主設備的SDO同從設備的SDO配置一致,主設備的SDI同從設備的SDI配置一致。由於主從設備是在SCLK的控制下,同時發送和接收數據,並經過2個雙向移位寄存器來交換數據。工做原理演示以下圖:

圖片點擊可在新窗口打開查看

上升沿主機SDO發送數據1,同時從設備SDO發送數據0;緊接着在SCLK的降低沿的時候從設備的SDI接收到了主機發送過來的數據1,同時主機也接收到了從設備發送過來的數據0.


SPI協議心得

SPI接口時鐘配置心得:

在主設備這邊配置SPI接口時鐘的時候必定要弄清楚從設備的時鐘要求,由於主設備這邊的時鐘極性和相位都是以從設備爲基準的。所以在時鐘極性的配置上必定要搞清楚從設備是在時鐘的上升沿仍是降低沿接收數據,是在時鐘的降低沿仍是上升沿輸出數據。但要注意的是,因爲主設備的SDO鏈接從設備的SDI,從設備的SDO鏈接主設備的SDI,從設備SDI接收的數據是主設備的SDO發送過來的,主設備SDI接收的數據是從設備SDO發送過來的,因此主設備這邊SPI時鐘極性的配置(即SDO的配置)跟從設備的SDI接收數據的極性是相反的,跟從設備SDO發送數據的極性是相同的。下面這段話是Sychip Wlan8100 Module Spec上說的,充分說明了時鐘極性是如何配置的:

The 81xx module will always input data bits at the rising edge of the clock, and the host will always output data bits on the falling edge of the clock.

意思是:主設備在時鐘的降低沿發送數據,從設備在時鐘的上升沿接收數據。所以主設備這邊SPI時鐘極性應該配置爲降低沿有效。

又如,下面這段話是摘自LCD Driver IC SSD1289

SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.

意思是:從設備SSD1289在時鐘的上升沿接收數據,並且是按照從高位到地位的順序接收數據的。所以主設備的SPI時鐘極性一樣應該配置爲降低沿有效。

時鐘極性和相位配置正確後,數據纔可以被準確的發送和接收。所以應該對照從設備的SPI接口時序或者Spec文檔說明來正確配置主設備的時鐘。


2、加深瞭解

單片機軟件模擬SPI接口—加深理解SPI總線協議

分類: SPI總線學習 2011-11-01 00:01 2268人閱讀 評論(0) 收藏 舉報

來自: http://blog.csdn.net/ce123/article/details/6905630

單片機軟件模擬SPI接口—加深理解SPI總線協議

          SPI(Serial Peripheral Interfacer 串行外設接口)是摩托羅拉公司推出的一種同步串行通信接口,用於微處理器臌控制器和外圍擴展芯片之間的串行鏈接,現已發展成爲一種工業標準,目前,各半導體公司推出了大量的帶有SPI接口的具備各類各樣功能的芯片,如RAM,EEPROM,FlashROM,A/D轉換器、D/A轉換器、LED/LED顯示驅動器、I/O接口芯片、實時時鐘、UART收發器等等,爲用戶的外圍擴展提供了極其靈活而價廉的選擇。因爲SPI總線接口只佔用微處理器四個I/O口線,採用SPI總線接口能夠簡化電路沒計,節省不少常規電路中的接口器件和I/O口線,提升設計的可靠性。

        現以 AT89C205l單片機模擬SPI總線操做串行EEPROM 93CA6爲例,如圖1所示,介紹利用單片機的I/O口經過軟件模擬SPI總線的實現方法。在這裏,僅介紹讀命令的時序和應用子程序。

93C46存儲器SPI總線的工做原理

          93CA6做爲從設備,其SPI接口使用4條I/O口線:串行時鐘線(SK)、輸出數據線DO、輸入數據線DI和高電平有效的從機選擇線CS。其數據的傳輸格式是高位(MSB)在前,低位(LsB)在後。93C46的SPI總線接口讀命令時序如圖2所示。

軟件模擬SPI接口的實現方法 

          對於不帶SPI串行總線接口的AT89C2051單片 機來講,可使用軟件來模擬SPI的操做,圖1所示 爲AT89C2051單片機與串行EEPROM 93C46的硬件 鏈接圖,其中,P1.0模擬SPI主設備的數據輸出端 SDO,P1.2模擬SPI的時鐘輸出端SCK,P1.3模擬 SPI的從機選擇端SCS,P1.1模擬SPI的數據輸入 SDI。
         上電覆位後首先先將P1.2(SCK)的初始狀態設置爲0(空閒狀態)。
         讀操做:AT89C2051首先經過P1.0口發送1位起始位(1),2位操做碼(10),6位被讀的數據地址(A5A4A3A2A1A0),而後經過P1.1口讀1位空位(0),以後再讀l6位數據(高位在前)。
         寫操做:AT89C2051首先經過P1.0口發送1位起始位(1),2位操做碼(01),6位被寫的數據地址(A5A4A3A2A1A0),以後經過P1.0口發送被寫的l6位數據(高位在前),寫操做以前要發送寫容許命令,寫以後要發送寫禁止命令。
         寫容許操做(WEN)):寫操做首先發送1位起始位(1),2位操做碼(00),6位數據(11XXXX)。              
         寫禁止操做(WDS)):寫操做首先發送1位起始位(1),2位操做碼(00),6位數據(00XXXX)。
        下面介紹用C51模擬SPI的子程序。
  1. //首先定義好I/O口   
  2. sbit SDO=P1^0;  
  3. sbit SDI=P1^1;  
  4. sbit SCK=P1^ 2;  
  5. sbit SCS=P1^3;  
  6. sbit ACC_7= ACC^7;  
  7. unsigned int SpiRead(unsigned char add)  
  8. {  
  9.     unsigned char i;  
  10.     unsigned int datal6;  
  11.     add&=0x3f;/*6位地址*/  
  12.     add |=0x80;/*讀操做碼l0*/  
  13.     SDO=1;/*發送1爲起始位*/  
  14.     SCK=0;  
  15.     SCK=1;  
  16.     for(i=0;<8;i++)/*發送操做碼和地址*/  
  17.     {  
  18.         if(add&0x80==1)  
  19.             SDO=1;  
  20.         else   
  21.             SDO=0;  
  22.         SCK=0;/*從設備上升沿接收數據*/  
  23.         SCK=1;  
  24.         add<<= 1;  
  25.     }  
  26.     SCK=1;/*從設備時鐘線降低沿後發送數據,空讀1位數據*/  
  27.     SCK=0;  
  28.     datal6<<= 1;/*讀16位數據*/  
  29.     for(i=0;<16;i++)  
  30.     {  
  31.         SCK= 1;  
  32.         _nop_();  
  33.         if(SDI==1)  
  34.             datal6|=0x01;  
  35.         SCK =0;  
  36.         datal6< < =1;  
  37.     }  
  38.     return datal6;  
  39. }  
//首先定義好I/O口
sbit SDO=P1^0;
sbit SDI=P1^1;
sbit SCK=P1^ 2;
sbit SCS=P1^3;
sbit ACC_7= ACC^7;
unsigned int SpiRead(unsigned char add)
{
	unsigned char i;
	unsigned int datal6;
	add&=0x3f;/*6位地址*/
	add |=0x80;/*讀操做碼l0*/
	SDO=1;/*發送1爲起始位*/
	SCK=0;
	SCK=1;
	for(i=0;<8;i++)/*發送操做碼和地址*/
	{
		if(add&0x80==1)
			SDO=1;
		else 
			SDO=0;
		SCK=0;/*從設備上升沿接收數據*/
		SCK=1;
		add<<= 1;
	}
	SCK=1;/*從設備時鐘線降低沿後發送數據,空讀1位數據*/
	SCK=0;
	datal6<<= 1;/*讀16位數據*/
	for(i=0;<16;i++)
	{
		SCK= 1;
		_nop_();
		if(SDI==1)
			datal6|=0x01;
		SCK =0;
		datal6< < =1;
	}
	return datal6;
}
           對於不一樣的串行接口外圍芯片,它們的時鐘時序是不一樣的。上述子程序是針對在SCK的上升沿輸入(接收)數據和在降低沿輸出(發送)數據的器件。這些子程序也適用於在串行時鐘)的上升沿輸入和降低沿輸出的其它各類串行外圍接口芯片,只要在程序中改變P1.2(SCK)的輸出電平順序進行相應調整便可。
 
3、MSP430的SPI使用:
相關文章
相關標籤/搜索