• 正文
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

一文講透串行通信---SPI基礎(chǔ)

03/03 11:30
2686
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

在本篇文章中,我們將介紹數(shù)字通信以及串行外設(shè)接口(Serial Peripheral Interface,簡稱SPI通信)的基礎(chǔ)知識。主要包括通信結(jié)構(gòu)和所需的數(shù)字線路。許多精密模擬器件在微控制器(稱為控制器)和被控設(shè)備(稱為外設(shè))之間具有數(shù)字接口。以精密模數(shù)轉(zhuǎn)換器ADC)為例,外設(shè)ADC測量輸入電壓,而控制器微控制器通過數(shù)字通信讀取該數(shù)據(jù)。以精密數(shù)模轉(zhuǎn)換器(DAC)為第二個例子,控制器微控制器向DAC寫入一個數(shù)字字,以設(shè)置輸出電壓。在這兩種類型的設(shè)備中,這種通信可能是雙向的。

許多精密數(shù)據(jù)轉(zhuǎn)換器可能需要一些配置和編程。需要對設(shè)備進行寫入和讀取操作,因此需要數(shù)字通信。為了使兩個設(shè)備之間能夠進行通信,需要一個共同的標(biāo)準(zhǔn),以便控制器和外設(shè)能夠相互理解。

通信是通過二進制表示的字進行傳輸?shù)?。這些通信位由1和0組成,通常被組織成8位一組,稱為一個字節(jié)。為了方便,字節(jié)可以被組織成兩個數(shù)字十六進制數(shù)。通常,在微控制器(控制器)和外設(shè)之間發(fā)送和接收數(shù)據(jù)時,會使用多個字節(jié)。多個字節(jié)可能用于表示模數(shù)轉(zhuǎn)換器(ADC)的輸出數(shù)據(jù)、數(shù)模轉(zhuǎn)換器(DAC)的輸出電壓,或者向數(shù)據(jù)轉(zhuǎn)換器發(fā)送命令和配置信息。

數(shù)字通信可以采用多種形式,但主要有兩種結(jié)構(gòu)經(jīng)常被使用。首先,通信可以是并行的,其中每位數(shù)據(jù)使用一條線路。例如,一個字節(jié)同時通過八條并行數(shù)字線路傳輸。其次,通信可以是串行的,其中所有數(shù)據(jù)位都在同一條數(shù)字線路上。在串行通信中,數(shù)據(jù)位是按順序一個接一個地發(fā)送的。

在現(xiàn)代設(shè)備中,串行通信使用更為廣泛,減少了控制器與外設(shè)之間的通信線路數(shù)量。這里的圖示展示了數(shù)據(jù)從控制器傳輸?shù)酵庠O(shè)的過程,但從外設(shè)傳輸數(shù)據(jù)回控制器則需要單獨的線路。對于精密數(shù)據(jù)轉(zhuǎn)換器,大多數(shù)都使用串行通信的形式。

大多數(shù)設(shè)備廠家使用兩種不同串行接口標(biāo)準(zhǔn)中的一種,即4線串行外設(shè)接口(SPI)或2線I2C

控制器和外設(shè)之間的線路被驅(qū)動到兩個電壓水平之一。如果電壓接近0,則該線路被解碼為數(shù)字0。如果電壓接近數(shù)字電源電壓,則該線路被解碼為數(shù)字1。請注意,控制器和外設(shè)都需要就這些電平達成一致,以確保通信能夠被正確解碼。數(shù)字輸出必須被驅(qū)動到足夠高的電平以被解碼為數(shù)字1,并且被驅(qū)動到足夠低的電平以被解碼為數(shù)字0。

數(shù)據(jù)手冊定義了數(shù)字輸出的最小高電平輸出電壓和最大低電平輸出電壓。此外,數(shù)據(jù)手冊還定義了定義高電平的最小輸入電壓和定義低電平的最大輸入電壓。它們的通信標(biāo)準(zhǔn)根據(jù)數(shù)字電源電壓定義了這些電平。如果控制器和外設(shè)的數(shù)字電源電壓不匹配,則可能會出現(xiàn)通信問題。此時,可能需要使用電平轉(zhuǎn)換設(shè)備來橋接從一個電源電壓到另一個電源電壓的通信。

通信還需要控制器和外設(shè)之間有一個共同的時序。這兩個設(shè)備必須在時序上達成一致,即知道外設(shè)應(yīng)該在何時讀取電壓水平,以確定位傳輸何時發(fā)生。通常,會使用來自控制器的串行時鐘來定義通信的時序。讀取位可能在串行時鐘的上升沿或下降沿進行。在此示例中,數(shù)據(jù)是在串行時鐘的下降沿讀取的。

在精密數(shù)據(jù)轉(zhuǎn)換器中最常用的串行接口是一種稱為串行外設(shè)接口(Serial Peripheral Interface,簡稱SPI)的標(biāo)準(zhǔn)。SPI有兩條控制線??刂破鳎ㄍǔJ俏⒖刂破骰?a class="article-link" target="_blank" href="/baike/496771.html">數(shù)字信號處理器)控制外設(shè)選擇和用于數(shù)據(jù)同步的串行時鐘。一個SPI總線可以控制多個外設(shè),但只能有一個控制器。每個外設(shè)都需要從控制器接收自己的外設(shè)選擇線。

此外,還有兩條數(shù)據(jù)線。一條線用于從控制器發(fā)送數(shù)據(jù)到外設(shè),另一條線用于從外設(shè)發(fā)送數(shù)據(jù)到控制器。數(shù)據(jù)傳輸可以是全雙工的,這意味著可以使用相同的SCLK脈沖為數(shù)據(jù)時鐘,同時在兩個方向上傳輸數(shù)據(jù)。接下來將描述SPI的四條線。

SS上劃線(Slave Select,從機選擇)是外設(shè)選擇線。這條線用于選擇要進行通信的外設(shè)。如果SPI總線上有多個設(shè)備,則每個設(shè)備都有自己的外設(shè)選擇線。外設(shè)選擇線通常用作低電平有效,用一條上劃線表示。

當(dāng)設(shè)備被選中時,外設(shè)選擇線變?yōu)榈碗娖揭约せ钔ㄐ拧.?dāng)設(shè)備未被選中時,外設(shè)選擇線被設(shè)置為高電平。外設(shè)選擇線也可能被標(biāo)記為SSEL、CS、CS#(CS bar,即CS上加一條上劃線表示低電平有效)、CE、nSS或SS#。在德州儀器(TI)的許多精密模數(shù)轉(zhuǎn)換器(ADC)中,這條芯片選擇線通常被標(biāo)記為CS#(CS上加一條上劃線),用作低電平有效。在許多精密數(shù)模轉(zhuǎn)換器(DAC)中,這條線通常被標(biāo)記為SYNC#(SYNC上加一條上劃線),同樣用作低電平有效。

SCLK是串行時鐘。如前所述,SCLK由控制器使用,用于同步控制器和外設(shè)之間發(fā)送的數(shù)據(jù)。SCLK起源于控制器,并發(fā)送給所有外設(shè)。這個串行時鐘并不總是處于工作狀態(tài),它可能作為高電平或低電平信號處于空閑狀態(tài)。數(shù)據(jù)在串行時鐘的上升沿或下降沿被送入控制器或外設(shè)。SCLK線也可能被標(biāo)記為SCK。

MISO(Master In Slave Out,主入從出)是控制器輸入、外設(shè)輸出線。這條線用于從外設(shè)設(shè)備發(fā)送數(shù)據(jù)到控制器。如果控制器未通過外設(shè)選擇線選擇該設(shè)備為活動狀態(tài),則這條線會變?yōu)楦?a class="article-link" target="_blank" href="/baike/481492.html">阻抗狀態(tài)(Hi-Z),允許包含多個設(shè)備的系統(tǒng)共享這條線。

外設(shè)設(shè)備在MISO線上發(fā)送數(shù)據(jù),并與SCLK同步。在外設(shè)設(shè)備上,它可能被稱為SOMI、SDO、DO、DOUT或SO。這條線在控制器設(shè)備上連接到一個標(biāo)有SDI、DI或DN的串行接口上。在許多精密數(shù)據(jù)轉(zhuǎn)換器中,通常將此數(shù)字輸出標(biāo)記為DOUT。

控制器和外設(shè)的數(shù)據(jù)可以在SCLK的上升沿或下降沿上進行讀取。此外,時鐘極性在定義數(shù)據(jù)進出設(shè)備的領(lǐng)先邊和滯后邊時非常重要。這使得SPI通信具有多種模式。

有兩個參數(shù)用于確定操作模式。第一個參數(shù)是CPOL,它決定了串行時鐘的時鐘極性。當(dāng)CPOL等于0時,時鐘在空閑狀態(tài)下為低電平。此時,領(lǐng)先邊是上升沿,滯后邊是下降沿。當(dāng)CPOL等于1時,時鐘在空閑狀態(tài)下為高電平。此時,領(lǐng)先邊是下降沿,滯后邊是上升沿。

第二個參數(shù)CPHA決定了數(shù)據(jù)是在哪個時鐘相位被采集的。當(dāng)CPHA等于0時,數(shù)據(jù)在時鐘脈沖的領(lǐng)先邊被采集。當(dāng)SS#(片選信號的低電平有效形式)被拉低時,第一個數(shù)據(jù)位會在SCLK的滯后邊準(zhǔn)備好。當(dāng)CPHA等于1時,數(shù)據(jù)在SCLK的滯后邊被采集。在這兩種時鐘相位模式下,數(shù)據(jù)都是在前一個時鐘邊沿準(zhǔn)備好的。CPOL和CPHA的組合允許SPI有四種操作模式。本篇文章中的表格展示了SPI模式0到3。每種模式都為SPI通信定義了不同的時鐘極性和相位。請注意,不同的SPI設(shè)備和微控制器制造商可能對SPI模式編號有不同的定義。要確定時鐘極性和相位信息,請查閱控制器和外設(shè)的數(shù)據(jù)手冊。

SPI可以用于與多個設(shè)備進行通信,這可以通過兩種不同的方式實現(xiàn)。首先,由于SPI使用外設(shè)選擇線,控制器可以與多個設(shè)備進行通信。每個外設(shè)都從控制器接收自己的外設(shè)選擇信號,而其余線路是共享的。

當(dāng)某個設(shè)備的外設(shè)選擇線被選中時,其余的SPI線路處于活動狀態(tài)。當(dāng)外設(shè)選擇線未被選中時,SPI線路將被忽略。當(dāng)未被選中時,每個外設(shè)的MOSI和SCLK線路都會被忽略,而每個MISO線路會變?yōu)楦咦杩範(fàn)顟B(tài)(Hi-Z),這樣活動的外設(shè)就可以驅(qū)動MISO線路,而不會與其他試圖驅(qū)動同一線路的外設(shè)發(fā)生沖突。

在某些系統(tǒng)中,單個SPI總線驅(qū)動一個外設(shè),而其他外設(shè)則以菊花鏈的方式連接在一起。在菊花鏈系統(tǒng)中,SCLK(串行時鐘)和外設(shè)選擇線可以由所有外設(shè)共享。然而,控制器僅連接到第一個外設(shè)的單個MOSI(主出從入)線。第一個外設(shè)的MISO(主入從出)線連接到下一個外設(shè)的MOSI線。這樣,所有外設(shè)就從一個MISO線連接到下一個MOSI線,形成了鏈條。

對于最后一個外設(shè)設(shè)備,其MISO線連接到控制器。來自所有設(shè)備的數(shù)據(jù)都通過鏈條傳遞,并在最后由最后一個外設(shè)收集。并不是所有設(shè)備都能通過菊花鏈SPI連接進行控制和讀取。設(shè)備必須專門為此種通信方式而設(shè)計。

以下是一個SPI數(shù)據(jù)通信的示例,它來自于某精密模數(shù)轉(zhuǎn)換器(ADC)的通信。這是一款16位ADC,使用SPI模式1,其中CPOL等于0,CPHA等于1。在這種情況下,SCLK在空閑狀態(tài)下為低電平,數(shù)據(jù)在SCLK的滯后邊被輸入和輸出設(shè)備。

在16位數(shù)據(jù)傳輸周期中,兩個字節(jié)的數(shù)據(jù)被時鐘信號輸入到一個配置寄存器中。同時,16位的ADC數(shù)據(jù)被時鐘信號從設(shè)備中輸出。該ADC具有一個16位的配置寄存器,其設(shè)置如表格所示。這些配置寄存器的值將設(shè)備編程為描述中所示的設(shè)置。在此示例中,我們希望寫入設(shè)備的設(shè)置值為81C3(十六進制)。

繼續(xù)以上面的ADC為例,這是其16位數(shù)據(jù)傳輸周期,展示了SPI線路的情況。同樣,SCLK在空閑狀態(tài)下為低電平,數(shù)據(jù)在SCLK的下降沿傳輸。向設(shè)備寫入數(shù)據(jù)是通過MOSI完成的,或者在這個設(shè)備上,對應(yīng)的引腳標(biāo)記為DN。配置寄存器被設(shè)置為81C3(十六進制)。

同時,數(shù)據(jù)從ADC中被時鐘信號輸出。在這里,一個隨機的輸出數(shù)據(jù)字被時鐘信號從設(shè)備中輸出。觀察DOUT線,輸出的二進制數(shù)據(jù)被讀取為E476(十六進制)。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄