ADμC812的串行外設接口(SPI)及其應用
關(guān)鍵詞:ADμC812 串行通信 SPI串行端口
概述
ADμC812是一種全集成的12位數據采集系統。它在單個(gè)芯片內包含了高性能的自校準多通道ADC、2個(gè)12位DAC以及可編程的8位MCU(與8051兼容)。為便于MCU與各種外圍設備進(jìn)行通信,ADμC812提供了3種串行I/O端口:UART接口、I2C兼容的串行接口和串行外設接口(SPI)。其中,SPI接口是工業(yè)標準的同步串行接口,是一種全雙工、三線(xiàn)通信的系統。它允許MCU與各種外圍設備以串行方式(8位數據同時(shí)、同步地被發(fā)送和接收)進(jìn)行通信。在SPI接口中,數據的傳輸需要1個(gè)時(shí)鐘信號和兩條數據線(xiàn)。
SPI可工作在主模式或從模式下。在主模式,每一位數據的發(fā)送/接收需要1次時(shí)鐘作用;而在從模式下,每一位數據都是在接收到時(shí)鐘信號之后才發(fā)送/接收。1個(gè)典型的SPI系統包括1個(gè)主MCU和1個(gè)或幾個(gè)從外圍器件。SPI接口可設置成在發(fā)送/接收1個(gè)字節的結束時(shí)產(chǎn)生1次中斷。
主時(shí)鐘可以通過(guò)編程而成為不同的狀態(tài),既可編程為4種不同主波特率的任一種,又可對時(shí)鐘的極性和相位進(jìn)行編程。
SPI也可用于那些需要比微控制器上的并行I/O端口更多輸入或輸出端的場(chǎng)合中。SPI提供了一種擴展I/O功能的最簡(jiǎn)單的辦法,只需使用最少的微控制器引腳。
一、工作原理
1.SPI的信號說(shuō)明
SPI系統使用4條線(xiàn)可與多種標準外圍器件直接接口:串行時(shí)鐘線(xiàn)(SCLOCK)、主機輸入/從機輸出數據線(xiàn)MISO、主機輸出/從機輸入數據線(xiàn)MOSI和低電平有效的從機選擇線(xiàn)SS。
SCLOCK是主機的時(shí)鐘線(xiàn),為MISO數據的發(fā)送和接收提供同步時(shí)鐘信號。每一位數據的傳輸都需要1次時(shí)鐘作用,因而發(fā)送或接收1個(gè)字節的數據需要8個(gè)時(shí)鐘的作用。主機的時(shí)鐘是通過(guò)主機的硬件設置的,并和各個(gè)從機的SCLOCK相連。時(shí)鐘的波特率、極性、相位是由SPICON(SPI控制寄存器)來(lái)設置的。
MISO是主機的輸入/從機的輸出數據線(xiàn)。主機的MISO應與從機的MISO相連進(jìn)行高位在前的數據交換。
MOSI是SPI接口的SPI主機輸出/從機輸入數據引腳。這一引腳應當連接主微控制器的數據輸出和從微控制器的數據輸入端MOSI,進(jìn)行高位在前數據的交換。
SS只在從方式中用于低電平選中從。SS對應的是P1.5,在初始化時(shí)P1口被設置為模擬輸入,因而通過(guò)清除P1.5可將其設置為數據輸入,才可完成主、從機的通信。
2.SPI的寄存器
SPI有2個(gè)相關(guān)寄存器:SPICON和SPIDAT,其中SPICON包含各種標志位、使能位、方式位及時(shí)鐘位。各位都是可尋址的,如表1及表2所列。
表1 SPICON寄存器
ISPI | WCOL | SPE | SPIM | CPOL | CPHA | SPR1 | SPR0 |
FFH 0 | FEH 0 | FDH 0 | FCH 0 | FBH 0 | FAH 0 | F9H 0 | F8H 0 |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
表2 SPICON各位功能
位 | 功 能 |
ISPI | 中斷標志位。 當發(fā)送和接收1字節數據完畢時(shí)自動(dòng)置全。該位也可以通過(guò)軟件控制。當于中斷時(shí),應當打開(kāi)中斷EA,將IE2.0置位。當執行中斷服務(wù)程序時(shí),硬件自動(dòng)清除該位 |
WCOL | 寫(xiě)沖突錯誤標志位。 當SPI正進(jìn)行數據交換時(shí),若向SPIDAT中寫(xiě)數據將產(chǎn)生寫(xiě)沖突錯誤,寫(xiě)入的數據將無(wú)效,原有交換繼續執行。必須由軟件清除 |
SPE | SPI使能位。 SPE=0,I2C串口使能,SPI串口禁止; SPE=1,I2C串口禁止,SPI串口使能 |
SPIM | 主模式選擇位。 SPIM=0,SPI工作于從模式; SPIM=1,SPI工作于主模式 |
CPOL | 時(shí)鐘極性選擇位。 CPOL=0,主機時(shí)鐘有高到低的跳變讀取數據,數據字節之間傳輸時(shí),時(shí)鐘處于高電平空閑狀態(tài); CPOL=1,主機時(shí)鐘有低到高的跳變讀取數據,各數據字節之間傳輸時(shí)時(shí)鐘處于低電平空閑狀態(tài)(見(jiàn)圖1) |
CPHA | 時(shí)鐘相位選擇位。 CPHA=0,傳輸數據的高位MSB在SS的降沿出現,在時(shí)鐘第1個(gè)前沿讀入;之后下一數據位在時(shí)鐘后沿出現,在下一個(gè)前沿讀入;直到8位數據讀完。 CPHA=1,數據在時(shí)鐘前沿出現,在同一時(shí)鐘周期的后沿讀入(見(jiàn)圖1)。 讀位還可控制從機的同步方式 |
SPR1 SPR0 | SPI波行選擇位。 SPR1 SPR0 波特率 0 0 fosc/4 0 1 fosc/8 1 0 fosc/32 1 1 fosc/64 注:從方式下這兩位都清零 |
另一個(gè)SPI寄存器是SPIDAT。對這一寄存器的寫(xiě)操作會(huì )產(chǎn)生從高位開(kāi)始的一位位的數據發(fā)送。如果寫(xiě)操作發(fā)生在其他數據正在傳遞的過(guò)程中,那么WCOL將置位。如果寫(xiě)操作進(jìn)行時(shí)沒(méi)有其他數據在傳遞,SPIDAT中的數據將自動(dòng)鎖存到移位寄存器中,移位寄存器從高位開(kāi)始發(fā)送數據,發(fā)送結束后輸入的字節將鎖存到SPIDAT中,可進(jìn)行軟件讀出。
3.主模式
發(fā)送和接收可以同時(shí)工作在主模式下。主模式的顯著(zhù)特征是不論是發(fā)送還是接收始終有SCLOCK信號,SS信號不是必需的。因為SPI串口只能有一片主機,因而不存在主機的選擇問(wèn)題。
發(fā)送操作是由向SPIDAT中寫(xiě)數據而觸發(fā)的。在主模式下,時(shí)鐘信號的1次作用對應一位數據的發(fā)送(MISO)和另一位數據的接收(MOSI)。如圖2所示,在主機中數據從移位寄存器中自左向右發(fā)出送到從機(MOSI),同時(shí)從機中的數據自右向左發(fā)到主機(MISO),經(jīng)過(guò)8位時(shí)鐘周期完成1個(gè)字節的發(fā)送。輸入字節保留在移位寄存器中,此時(shí)ISPI自動(dòng)置位(如果有中斷設置,則產(chǎn)生中斷),移位寄存器的數據將被鎖存到SPIDAT中,此后對SPIDAT的讀操作將把數據讀出。
將主機的SS和從機SS的相連的方式?jīng)]有意義,因為P1.5只可作輸入,所以主機的SS不能為從機的SS提供選通信號。為了解決這一問(wèn)題,可利用主機其他輸入/輸出口線(xiàn)與從機的SS相連,實(shí)現選通控制,可以有多根口線(xiàn)控制多個(gè)從機。如果要讀取主機SS的狀態(tài),需要將主機的SS與主機上另一根輸入/輸出口線(xiàn)相連,通過(guò)對該口線(xiàn)讀操作獲取主機SS的狀態(tài)。
4.從模式
發(fā)送和接收可以同時(shí)工作在從模式下。從模式的顯著(zhù)特征是:不論是發(fā)送還是接收始終必須在SCLOCK信號作用下進(jìn)行,并且SS信號必須有效。SS在初始化之后,要設置為數字輸入(CLR P1.5),當SS信號無(wú)效時(shí),數據的發(fā)送無(wú)法進(jìn)行并且輸入的數據視為無(wú)效。這是因為輸入的時(shí)鐘信號是與SCLOCK的邏輯與操作,而SCLOCK信號是SS的反轉。這樣當SS為高時(shí),就沒(méi)有時(shí)鐘信號輸入。
當CPHA=1時(shí),SS始終置地;當CPHA=0時(shí),在從機接收到第1個(gè)時(shí)鐘之前SS必然置低,在接收完畢之后必然置高。數據的發(fā)送和接收的過(guò)程見(jiàn)圖2,與主模式下基本相似,只是移位寄存器的數據移出和輸入方向與之相反。從模式下的SS信號也須通過(guò)連接其他口線(xiàn)來(lái)讀取狀態(tài)。
5.從模式下的時(shí)鐘同步
通過(guò)設置CPHA位可以獲得從模式下的兩種同步方式。由于SCLOCK信號線(xiàn)可能存在干擾脈沖,如果這些干擾脈沖大到一定程序,從機時(shí)就會(huì )誤認為收到了時(shí)鐘信號,將導致接收數據錯誤。這樣依靠同步結構的SPI將失去同步的意義。
CPAH=1時(shí),如果有其他脈沖的干擾,ADμC812將無(wú)法與主機獲得同步。選擇這種方式,當SS為低時(shí),時(shí)鐘計數器才開(kāi)始工作。每經(jīng)過(guò)8個(gè)時(shí)鐘同周期,ISPI將置位(如果中斷設置正確將產(chǎn)生中斷),并且移位寄存器的數據鎖存到SPIDAT中。SS保持低電平不會(huì )使時(shí)鐘計數器復位。
CPHA=0時(shí),如果有其他脈沖的干擾,ADμC812也可與主機獲得同步。在這種方式下,從機通過(guò)SS信號獲得的,而不是通過(guò)時(shí)鐘信號獲得的。當SS信號變低時(shí),時(shí)鐘計數器復位,數據位在此后的每一個(gè)時(shí)鐘發(fā)送和接收;當SS變高時(shí),ISPI位置位(如果中斷設置正確,將產(chǎn)生中斷),并且移位寄存器的數據鎖存到SPIDAT中。ISPI置位與數據的鎖存始終與時(shí)鐘計數值無(wú)關(guān),因此當SS的觸發(fā)在多于或少于8個(gè)時(shí)鐘時(shí),在SS返回高電平瞬間,ADμC812將產(chǎn)生中斷,并且收到或發(fā)送的數據將不可靠。在這種方式下,SS不可始終置低,如果始終置低,那么從機將始終發(fā)送00。
當了與主機獲得同步,從機SS的下降沿必然由主機控制。當SS變低時(shí),從機產(chǎn)生外部中斷,中斷服務(wù)中SPE位由軟件清除,然后重新置位。SPE位的置位將使時(shí)鐘計數器復位到零。須注意的一點(diǎn)是這一中斷必須有比其他中斷更高的優(yōu)先級,才可使從機在主機第1個(gè)時(shí)鐘到來(lái)之間獲得同步。主機程序必須為從機中斷執行中斷服務(wù)提供足夠的時(shí)間,以對SPE進(jìn)行操作。典型的操作是在清除SS和向SPIDAT中寫(xiě)數據之間用12~15個(gè)NOP指令。
二、實(shí)際應用
圖3所示為1個(gè)主機和1個(gè)從機典型的電路連接圖。注意主、從機要有公共的地。
根據圖3的連接情況及前面分析的主、從機工作工程,繪制流程圖如圖4所示。
主機程序:
SET EA ;打開(kāi)中斷允許
SET IE2.0 ;打開(kāi)SPI中斷
MOV SPICON,#30H ;送SPI控制字
MASTER:CLR P3.5 ;置SS為低
NOP ;等待從機中斷執行完畢
NOP
NOP
NOP
MOV SPIDAT,#DATA;向SPIDAT中寫(xiě)數據
LCALL DELAY ;根據選擇的分頻比算出數據傳輸的時(shí)間,確定DELAY子程序的延時(shí)時(shí)間(也可用中斷方式)
SETB P3.5 ;將SS置高
LJMP MASTER ;送下一個(gè)數
從機程序:
ORG 0013H ;外部中斷INT0入口
CLR SPE ;SPE位清除
SETB SPE ;與主機時(shí)鐘獲得同步
SETB P3.2 ;撤銷(xiāo)中斷
RETI
……
SETB EA ;打開(kāi)中斷允許
SETB IE2.0 ;打開(kāi)SPI中斷
SETB EX0 ;打開(kāi)外部中斷
MOV SPICON,#20H ;送SPI控制字
CLR P1.5 ;設置為數字輸入
JB P3.1$ ;判斷P3.1是否為低
CLR P3.2 ;產(chǎn)生INT0中斷
CLALL DELAY ;等待數據傳送完畢
MOV A,SPIDAT ;讀取數據
ADμC812作為主機的程序與前面相同。8051模擬SPI串口接收數據程序如下:
ORG 0013H
INT0:MOV R0,#8 ;移位計數值
INT0':JB P3.4,INT0 ;輸入時(shí)鐘位高電平時(shí)等待
MOV C,P3.3 ;輸入時(shí)鐘下降沿接收數據
RLC A ;將數據存入A中
DJNZ R0,INT0' ;8位是否傳送完
SETB P3. ;8位數據接收完畢,關(guān)中斷
MOV @R1,#DATA ;將接收數據存到內部RAM
INC R1 ;指向下一個(gè)內部RAM單元
CJNE R1,#00H,REC
MOV R1,#80H
RETI
……
SETB EA
SETB EX0
MOV R1,#80H ;內部存儲器80H~FFH單元存儲接收的數據
……
總結
通過(guò)對SPI串口原理的介紹,SPI串行接口可以在短距離內進(jìn)行主機與從機的數據傳送,并且具有多種可調的傳輸方式、連接電路簡(jiǎn)單、使用方便等優(yōu)點(diǎn)。為實(shí)現主機和從機及從外圍設備的通信提供了一種簡(jiǎn)單、易行的方案。
評論