在本篇文章中,我們將介紹數(shù)字通信以及串行外設(shè)接口(Serial Peripheral Interface,簡(jiǎn)稱SPI通信)的基礎(chǔ)知識(shí)。主要包括通信結(jié)構(gòu)和所需的數(shù)字線路。許多精密模擬器件在微控制器(稱為控制器)和被控設(shè)備(稱為外設(shè))之間具有數(shù)字接口。以精密模數(shù)轉(zhuǎn)換器(ADC)為例,外設(shè)ADC測(cè)量輸入電壓,而控制器微控制器通過(guò)數(shù)字通信讀取該數(shù)據(jù)。以精密數(shù)模轉(zhuǎn)換器(DAC)為第二個(gè)例子,控制器微控制器向DAC寫入一個(gè)數(shù)字字,以設(shè)置輸出電壓。在這兩種類型的設(shè)備中,這種通信可能是雙向的。
許多精密數(shù)據(jù)轉(zhuǎn)換器可能需要一些配置和編程。需要對(duì)設(shè)備進(jìn)行寫入和讀取操作,因此需要數(shù)字通信。為了使兩個(gè)設(shè)備之間能夠進(jìn)行通信,需要一個(gè)共同的標(biāo)準(zhǔn),以便控制器和外設(shè)能夠相互理解。
通信是通過(guò)二進(jìn)制表示的字進(jìn)行傳輸?shù)?。這些通信位由1和0組成,通常被組織成8位一組,稱為一個(gè)字節(jié)。為了方便,字節(jié)可以被組織成兩個(gè)數(shù)字十六進(jìn)制數(shù)。通常,在微控制器(控制器)和外設(shè)之間發(fā)送和接收數(shù)據(jù)時(shí),會(huì)使用多個(gè)字節(jié)。多個(gè)字節(jié)可能用于表示模數(shù)轉(zhuǎn)換器(ADC)的輸出數(shù)據(jù)、數(shù)模轉(zhuǎn)換器(DAC)的輸出電壓,或者向數(shù)據(jù)轉(zhuǎn)換器發(fā)送命令和配置信息。
數(shù)字通信可以采用多種形式,但主要有兩種結(jié)構(gòu)經(jīng)常被使用。首先,通信可以是并行的,其中每位數(shù)據(jù)使用一條線路。例如,一個(gè)字節(jié)同時(shí)通過(guò)八條并行數(shù)字線路傳輸。其次,通信可以是串行的,其中所有數(shù)據(jù)位都在同一條數(shù)字線路上。在串行通信中,數(shù)據(jù)位是按順序一個(gè)接一個(gè)地發(fā)送的。
在現(xiàn)代設(shè)備中,串行通信使用更為廣泛,減少了控制器與外設(shè)之間的通信線路數(shù)量。這里的圖示展示了數(shù)據(jù)從控制器傳輸?shù)酵庠O(shè)的過(guò)程,但從外設(shè)傳輸數(shù)據(jù)回控制器則需要單獨(dú)的線路。對(duì)于精密數(shù)據(jù)轉(zhuǎn)換器,大多數(shù)都使用串行通信的形式。
大多數(shù)設(shè)備廠家使用兩種不同串行接口標(biāo)準(zhǔn)中的一種,即4線串行外設(shè)接口(SPI)或2線I2C。
控制器和外設(shè)之間的線路被驅(qū)動(dòng)到兩個(gè)電壓水平之一。如果電壓接近0,則該線路被解碼為數(shù)字0。如果電壓接近數(shù)字電源電壓,則該線路被解碼為數(shù)字1。請(qǐng)注意,控制器和外設(shè)都需要就這些電平達(dá)成一致,以確保通信能夠被正確解碼。數(shù)字輸出必須被驅(qū)動(dòng)到足夠高的電平以被解碼為數(shù)字1,并且被驅(qū)動(dòng)到足夠低的電平以被解碼為數(shù)字0。
數(shù)據(jù)手冊(cè)定義了數(shù)字輸出的最小高電平輸出電壓和最大低電平輸出電壓。此外,數(shù)據(jù)手冊(cè)還定義了定義高電平的最小輸入電壓和定義低電平的最大輸入電壓。它們的通信標(biāo)準(zhǔn)根據(jù)數(shù)字電源電壓定義了這些電平。如果控制器和外設(shè)的數(shù)字電源電壓不匹配,則可能會(huì)出現(xiàn)通信問題。此時(shí),可能需要使用電平轉(zhuǎn)換設(shè)備來(lái)橋接從一個(gè)電源電壓到另一個(gè)電源電壓的通信。
通信還需要控制器和外設(shè)之間有一個(gè)共同的時(shí)序。這兩個(gè)設(shè)備必須在時(shí)序上達(dá)成一致,即知道外設(shè)應(yīng)該在何時(shí)讀取電壓水平,以確定位傳輸何時(shí)發(fā)生。通常,會(huì)使用來(lái)自控制器的串行時(shí)鐘來(lái)定義通信的時(shí)序。讀取位可能在串行時(shí)鐘的上升沿或下降沿進(jìn)行。在此示例中,數(shù)據(jù)是在串行時(shí)鐘的下降沿讀取的。
在精密數(shù)據(jù)轉(zhuǎn)換器中最常用的串行接口是一種稱為串行外設(shè)接口(Serial Peripheral Interface,簡(jiǎn)稱SPI)的標(biāo)準(zhǔn)。SPI有兩條控制線。控制器(通常是微控制器或數(shù)字信號(hào)處理器)控制外設(shè)選擇和用于數(shù)據(jù)同步的串行時(shí)鐘。一個(gè)SPI總線可以控制多個(gè)外設(shè),但只能有一個(gè)控制器。每個(gè)外設(shè)都需要從控制器接收自己的外設(shè)選擇線。
此外,還有兩條數(shù)據(jù)線。一條線用于從控制器發(fā)送數(shù)據(jù)到外設(shè),另一條線用于從外設(shè)發(fā)送數(shù)據(jù)到控制器。數(shù)據(jù)傳輸可以是全雙工的,這意味著可以使用相同的SCLK脈沖為數(shù)據(jù)時(shí)鐘,同時(shí)在兩個(gè)方向上傳輸數(shù)據(jù)。接下來(lái)將描述SPI的四條線。
SS上劃線(Slave Select,從機(jī)選擇)是外設(shè)選擇線。這條線用于選擇要進(jìn)行通信的外設(shè)。如果SPI總線上有多個(gè)設(shè)備,則每個(gè)設(shè)備都有自己的外設(shè)選擇線。外設(shè)選擇線通常用作低電平有效,用一條上劃線表示。
當(dāng)設(shè)備被選中時(shí),外設(shè)選擇線變?yōu)榈碗娖揭约せ钔ㄐ?。?dāng)設(shè)備未被選中時(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是串行時(shí)鐘。如前所述,SCLK由控制器使用,用于同步控制器和外設(shè)之間發(fā)送的數(shù)據(jù)。SCLK起源于控制器,并發(fā)送給所有外設(shè)。這個(gè)串行時(shí)鐘并不總是處于工作狀態(tài),它可能作為高電平或低電平信號(hào)處于空閑狀態(tài)。數(shù)據(jù)在串行時(shí)鐘的上升沿或下降沿被送入控制器或外設(shè)。SCLK線也可能被標(biāo)記為SCK。
MISO(Master In Slave Out,主入從出)是控制器輸入、外設(shè)輸出線。這條線用于從外設(shè)設(shè)備發(fā)送數(shù)據(jù)到控制器。如果控制器未通過(guò)外設(shè)選擇線選擇該設(shè)備為活動(dòng)狀態(tài),則這條線會(huì)變?yōu)楦?a class="article-link" target="_blank" href="/baike/481492.html">阻抗狀態(tài)(Hi-Z),允許包含多個(gè)設(shè)備的系統(tǒng)共享這條線。
外設(shè)設(shè)備在MISO線上發(fā)送數(shù)據(jù),并與SCLK同步。在外設(shè)設(shè)備上,它可能被稱為SOMI、SDO、DO、DOUT或SO。這條線在控制器設(shè)備上連接到一個(gè)標(biāo)有SDI、DI或DN的串行接口上。在許多精密數(shù)據(jù)轉(zhuǎn)換器中,通常將此數(shù)字輸出標(biāo)記為DOUT。
控制器和外設(shè)的數(shù)據(jù)可以在SCLK的上升沿或下降沿上進(jìn)行讀取。此外,時(shí)鐘極性在定義數(shù)據(jù)進(jìn)出設(shè)備的領(lǐng)先邊和滯后邊時(shí)非常重要。這使得SPI通信具有多種模式。
有兩個(gè)參數(shù)用于確定操作模式。第一個(gè)參數(shù)是CPOL,它決定了串行時(shí)鐘的時(shí)鐘極性。當(dāng)CPOL等于0時(shí),時(shí)鐘在空閑狀態(tài)下為低電平。此時(shí),領(lǐng)先邊是上升沿,滯后邊是下降沿。當(dāng)CPOL等于1時(shí),時(shí)鐘在空閑狀態(tài)下為高電平。此時(shí),領(lǐng)先邊是下降沿,滯后邊是上升沿。
第二個(gè)參數(shù)CPHA決定了數(shù)據(jù)是在哪個(gè)時(shí)鐘相位被采集的。當(dāng)CPHA等于0時(shí),數(shù)據(jù)在時(shí)鐘脈沖的領(lǐng)先邊被采集。當(dāng)SS#(片選信號(hào)的低電平有效形式)被拉低時(shí),第一個(gè)數(shù)據(jù)位會(huì)在SCLK的滯后邊準(zhǔn)備好。當(dāng)CPHA等于1時(shí),數(shù)據(jù)在SCLK的滯后邊被采集。在這兩種時(shí)鐘相位模式下,數(shù)據(jù)都是在前一個(gè)時(shí)鐘邊沿準(zhǔn)備好的。
CPOL和CPHA的組合允許SPI有四種操作模式。本篇文章中的表格展示了SPI模式0到3。每種模式都為SPI通信定義了不同的時(shí)鐘極性和相位。請(qǐng)注意,不同的SPI設(shè)備和微控制器制造商可能對(duì)SPI模式編號(hào)有不同的定義。要確定時(shí)鐘極性和相位信息,請(qǐng)查閱控制器和外設(shè)的數(shù)據(jù)手冊(cè)。
SPI可以用于與多個(gè)設(shè)備進(jìn)行通信,這可以通過(guò)兩種不同的方式實(shí)現(xiàn)。首先,由于SPI使用外設(shè)選擇線,控制器可以與多個(gè)設(shè)備進(jìn)行通信。每個(gè)外設(shè)都從控制器接收自己的外設(shè)選擇信號(hào),而其余線路是共享的。
當(dāng)某個(gè)設(shè)備的外設(shè)選擇線被選中時(shí),其余的SPI線路處于活動(dòng)狀態(tài)。當(dāng)外設(shè)選擇線未被選中時(shí),SPI線路將被忽略。當(dāng)未被選中時(shí),每個(gè)外設(shè)的MOSI和SCLK線路都會(huì)被忽略,而每個(gè)MISO線路會(huì)變?yōu)楦咦杩範(fàn)顟B(tài)(Hi-Z),這樣活動(dòng)的外設(shè)就可以驅(qū)動(dòng)MISO線路,而不會(huì)與其他試圖驅(qū)動(dòng)同一線路的外設(shè)發(fā)生沖突。
在某些系統(tǒng)中,單個(gè)SPI總線驅(qū)動(dòng)一個(gè)外設(shè),而其他外設(shè)則以菊花鏈的方式連接在一起。在菊花鏈系統(tǒng)中,SCLK(串行時(shí)鐘)和外設(shè)選擇線可以由所有外設(shè)共享。然而,控制器僅連接到第一個(gè)外設(shè)的單個(gè)MOSI(主出從入)線。第一個(gè)外設(shè)的MISO(主入從出)線連接到下一個(gè)外設(shè)的MOSI線。這樣,所有外設(shè)就從一個(gè)MISO線連接到下一個(gè)MOSI線,形成了鏈條。
對(duì)于最后一個(gè)外設(shè)設(shè)備,其MISO線連接到控制器。來(lái)自所有設(shè)備的數(shù)據(jù)都通過(guò)鏈條傳遞,并在最后由最后一個(gè)外設(shè)收集。并不是所有設(shè)備都能通過(guò)菊花鏈SPI連接進(jìn)行控制和讀取。設(shè)備必須專門為此種通信方式而設(shè)計(jì)。
以下是一個(gè)SPI數(shù)據(jù)通信的示例,它來(lái)自于某精密模數(shù)轉(zhuǎn)換器(ADC)的通信。這是一款16位ADC,使用SPI模式1,其中CPOL等于0,CPHA等于1。在這種情況下,SCLK在空閑狀態(tài)下為低電平,數(shù)據(jù)在SCLK的滯后邊被輸入和輸出設(shè)備。
在16位數(shù)據(jù)傳輸周期中,兩個(gè)字節(jié)的數(shù)據(jù)被時(shí)鐘信號(hào)輸入到一個(gè)配置寄存器中。同時(shí),16位的ADC數(shù)據(jù)被時(shí)鐘信號(hào)從設(shè)備中輸出。該ADC具有一個(gè)16位的配置寄存器,其設(shè)置如表格所示。這些配置寄存器的值將設(shè)備編程為描述中所示的設(shè)置。在此示例中,我們希望寫入設(shè)備的設(shè)置值為81C3(十六進(jìn)制)。
繼續(xù)以上面的ADC為例,這是其16位數(shù)據(jù)傳輸周期,展示了SPI線路的情況。同樣,SCLK在空閑狀態(tài)下為低電平,數(shù)據(jù)在SCLK的下降沿傳輸。向設(shè)備寫入數(shù)據(jù)是通過(guò)MOSI完成的,或者在這個(gè)設(shè)備上,對(duì)應(yīng)的引腳標(biāo)記為DN。配置寄存器被設(shè)置為81C3(十六進(jìn)制)。
同時(shí),數(shù)據(jù)從ADC中被時(shí)鐘信號(hào)輸出。在這里,一個(gè)隨機(jī)的輸出數(shù)據(jù)字被時(shí)鐘信號(hào)從設(shè)備中輸出。觀察DOUT線,輸出的二進(jìn)制數(shù)據(jù)被讀取為E476(十六進(jìn)制)。