SPI總線接口與簡單配置
SPI總線主要由4條線組成:
n SCLK —Serial Clock (output from master)
n MOSI/SIMO —Master Output, Slave Input (output from master)
n MISO/SOMI —Master Input, Slave Output (output from slave)
n SS — (; output from master)
有另一種命名方式也經(jīng)??梢姡?br />n SCK — Serial Clock (output from master)
n SDI, DI, SI — Serial Data In
n SDO, DO, SO — Serial Data Out
n nCS,笛莎旗艦店, CS, nSS, STE — ,美駱世家官網(wǎng), Slave Transmit Enable (; output from master)
SPI通訊時Master首先需要配置一個時鐘(clock),這個值一般選擇小于或者大于Slave設(shè)備支持的頻率。 通用的頻率范圍為1-70MHz。
SPI工作在全雙工模式,這意味著數(shù)據(jù)可以在同一時間發(fā)送和接收。
時鐘極性polarity與時鐘相位phase
時鐘極性(CPOL)和時鐘相位(CPHA)用于設(shè)定從設(shè)備何時采樣數(shù)據(jù)。CPOL決定SCLK為高時總線為空閑(CPOL=1)還是SCLK為低時總線為空閑(CPOL=0)。CPHA決定在SCLK的哪一個邊沿將數(shù)據(jù)寫入。
按照下面的時序圖,
CPOL=0, SCLK為低時總線空閑:
CPHA=0 數(shù)據(jù)在SCLK的上升沿(rising edge)被讀取;數(shù)據(jù)在下降沿(falling edge)寫入;
CPHA=1 數(shù)據(jù)在SCLK的下降沿(falling edge)被讀?。粩?shù)據(jù)在上升沿(rising edge)寫入;
CPOL=1, SCLK為高時總線空閑:
CPHA=0 數(shù)據(jù)在SCLK的下降沿(falling edge)被讀?。粩?shù)據(jù)在上升沿(falling edge)寫入;
CPHA=1 數(shù)據(jù)在SCLK的上升沿(falling edge)被讀取;數(shù)據(jù)在下降沿(rising edge)寫入;
以下是時序圖:
CPOL和CPHA的兩個狀態(tài)允許四種時鐘極性和相位的不同組合。每一種都與其他三種不兼容。為了實現(xiàn)主、從設(shè)備間的通訊,主、從設(shè)備的CPOL和CPHA必須有相同的設(shè)置。以下是CPOL,CPHA與4種模式的關(guān)系圖。
SPI的菊花鏈配置
一個Master 與3個獨立的Slave組合, 每個Slave都有一個獨立的SS(Slave Select)。
一個Master與一組使用公用SS(Slave Select)的Slave組合。
以AD7873為例做一些SPI的典型的設(shè)置
根據(jù)時序圖,當(dāng)CS變成低電平時,DCLK為低電平空閑,DIN在DCLK的上升沿數(shù)據(jù)鎖存.所以SPI的polarity與phase設(shè)置為Mode 0。
Figure 38 -SPI設(shè)置為8bits通信模式,通信周期分為3個階段:
1> DCLK前8個DCLK對應(yīng)指令周期。在這8個DCLK中,通過DIN向AD7873發(fā)送8bits命令字控制隨后進(jìn)行的串行數(shù)據(jù)傳輸。
2> 數(shù)據(jù)傳輸周期從第9個上升沿開始,輸入數(shù)據(jù)在時鐘上升沿寫入,輸出的數(shù)據(jù)則在時鐘的下降沿讀出。這里的輸入數(shù)據(jù)為8bits的0數(shù)據(jù)。DOUT同時也從DCLK的第10個上升沿開始數(shù)據(jù)輸出,到第二個DCLK周期結(jié)束時,DOUT輸出位數(shù)為7bits。
3> 重新開始8個DCLK的指令周期,繼續(xù)通過DIN傳送8bits命令控制字,紅蜻蜓官網(wǎng),同時DOUT在第17個DCLK輸出最后的5bits數(shù)據(jù),紅蜻蜓皮鞋。
可見在Figure 38中8bits數(shù)據(jù)通信模式下,AD7873要完成一個完整的SPI數(shù)據(jù)讀寫,需要3個周期,即發(fā)送24bits數(shù)據(jù)才能達(dá)到目標(biāo)。
Figure 39 -SPI設(shè)置為15bits通信模式,通信周期分為2個階段:
1> DCLK前15個DCLK對應(yīng)指令周期。在這15個DCLK中,通過DIN向AD7873發(fā)送15bits命令字控制隨后進(jìn)行的串行數(shù)據(jù)傳輸(MSB 8bits為命令字, LSB 7bits為數(shù)據(jù)0)。DOUT同時也從DCLK的第9個上升沿開始數(shù)據(jù)輸出,第一次15 DLCK周期結(jié)束時,DOUT輸出位數(shù)為MSB 6bits。
2>重新開始15個DCLK的指令周期,繼續(xù)通過DIN傳送15bits命令控制字。同時DOUT在第16個DCLK輸出最后的LSB 6bits數(shù)據(jù)。
可見在Figure 39中8bits數(shù)據(jù)通信模式下,AD7873要完成一個完整的SPI數(shù)據(jù)讀寫,需要2個周期,即發(fā)送30bits 數(shù)據(jù)才能達(dá)到目標(biāo)。
可見Figure 38使用的DCLK最少,效率最高。不過再8bits傳送模式下需要采用連續(xù)發(fā)送3次8bits數(shù)據(jù)方式。
如果SPI想在一個周期內(nèi)一次性將數(shù)據(jù)讀取上來,可以把SPI通信設(shè)置為 傳送bits>= DIN+DOUT所需的時鐘數(shù)目,這里根據(jù)時序圖為22個DCLK。 就可以在22個DCLK中一次性完成寫8bits的命令字與讀12bits的數(shù)據(jù)了。不過這里的8bits命令字是22bits中的 MSB 8bits。
不過此方法就沒有上面兩種通信模式的效率高了。:-)
以Freescale i.mx系列CSPI作為例:
采用CSPI1,POL=0,PHA=0,BIT_COUNT=22
CSPI1_CONTROL.bits.EN=1
CSPI1_CONTROL.bits.MODE=1
CSPI1_CONTROL.bits.POL = 0
CSPI1_CONTROL.bits.PHA = 0
CSPI1_CONTROL.bits.BIT_COUNT= 22
參考資料
1.Serial Peripheral Interface Bus
2.SPI Background
評論