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 — Slave Select (active low; output from master)
有另一種命名方式也經(jīng)??梢姡?/p>
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 — Chip Select, Slave Transmit Enable (active low; output from master)
SPI通訊時(shí)Master首先需要配置一個(gè)時(shí)鐘(clock),這個(gè)值一般選擇小于或者大于Slave設(shè)備支持的頻率。 通用的頻率范圍為1-70MHz。
SPI工作在全雙工模式,這意味著數(shù)據(jù)可以在同一時(shí)間發(fā)送和接收。
時(shí)鐘極性polarity與時(shí)鐘相位phase
時(shí)鐘極性(CPOL)和時(shí)鐘相位(CPHA)用于設(shè)定從設(shè)備何時(shí)采樣數(shù)據(jù)。CPOL決定SCLK為高時(shí)總線為空閑(CPOL=1)還是SCLK為低時(shí)總線為空閑(CPOL=0)。CPHA決定在SCLK的哪一個(gè)邊沿將數(shù)據(jù)寫入。
按照下面的時(shí)序圖,
CPOL=0, SCLK為低時(shí)總線空閑:
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為高時(shí)總線空閑:
CPHA=0 數(shù)據(jù)在SCLK的下降沿(falling edge)被讀??;數(shù)據(jù)在上升沿(falling edge)寫入;
CPHA=1 數(shù)據(jù)在SCLK的上升沿(falling edge)被讀取;數(shù)據(jù)在下降沿(rising edge)寫入;
以下是時(shí)序圖:
CPOL和CPHA的兩個(gè)狀態(tài)允許四種時(shí)鐘極性和相位的不同組合。每一種都與其他三種不兼容。為了實(shí)現(xiàn)主、從設(shè)備間的通訊,主、從設(shè)備的CPOL和CPHA必須有相同的設(shè)置。以下是CPOL,CPHA與4種模式的關(guān)系圖。
SPI的菊花鏈配置
一個(gè)Master 與3個(gè)獨(dú)立的Slave組合, 每個(gè)Slave都有一個(gè)獨(dú)立的SS(Slave Select)。
一個(gè)Master與一組使用公用SS(Slave Select)的Slave組合。
以AD7873為例做一些SPI的典型的設(shè)置
根據(jù)時(shí)序圖,當(dāng)CS變成低電平時(shí),DCLK為低電平空閑,DIN在DCLK的上升沿?cái)?shù)據(jù)鎖存。所以SPI的polarity與phase設(shè)置為Mode 0。
Figure 38 -SPI設(shè)置為8bits通信模式,通信周期分為3個(gè)階段:
1》 DCLK前8個(gè)DCLK對應(yīng)指令周期。在這8個(gè)DCLK中,通過DIN向AD7873發(fā)送8bits命令字控制隨后進(jìn)行的串行數(shù)據(jù)傳輸。
2》 數(shù)據(jù)傳輸周期從第9個(gè)上升沿開始,輸入數(shù)據(jù)在時(shí)鐘上升沿寫入,輸出的數(shù)據(jù)則在時(shí)鐘的下降沿讀出。這里的輸入數(shù)據(jù)為8bits的0數(shù)據(jù)。DOUT同時(shí)也從DCLK的第10個(gè)上升沿開始數(shù)據(jù)輸出,到第二個(gè)DCLK周期結(jié)束時(shí),DOUT輸出位數(shù)為7bits。
3》 重新開始8個(gè)DCLK的指令周期,繼續(xù)通過DIN傳送8bits命令控制字,同時(shí)DOUT在第17個(gè)DCLK輸出最后的5bits數(shù)據(jù)。
可見在Figure 38中8bits數(shù)據(jù)通信模式下,AD7873要完成一個(gè)完整的SPI數(shù)據(jù)讀寫,需要3個(gè)周期,即發(fā)送24bits數(shù)據(jù)才能達(dá)到目標(biāo)。
Figure 39 -SPI設(shè)置為15bits通信模式,通信周期分為2個(gè)階段:
1》 DCLK前15個(gè)DCLK對應(yīng)指令周期。在這15個(gè)DCLK中,通過DIN向AD7873發(fā)送15bits命令字控制隨后進(jìn)行的串行數(shù)據(jù)傳輸(MSB 8bits為命令字, LSB 7bits為數(shù)據(jù)0)。DOUT同時(shí)也從DCLK的第9個(gè)上升沿開始數(shù)據(jù)輸出,第一次15 DLCK周期結(jié)束時(shí),DOUT輸出位數(shù)為MSB 6bits。
2》 重新開始15個(gè)DCLK的指令周期,繼續(xù)通過DIN傳送15bits命令控制字。同時(shí)DOUT在第16個(gè)DCLK輸出最后的LSB 6bits數(shù)據(jù)。
可見在Figure 39中8bits數(shù)據(jù)通信模式下,AD7873要完成一個(gè)完整的SPI數(shù)據(jù)讀寫,需要2個(gè)周期,即發(fā)送30bits 數(shù)據(jù)才能達(dá)到目標(biāo)。
可見Figure 38使用的DCLK最少,效率最高。不過再8bits傳送模式下需要采用連續(xù)發(fā)送3次8bits數(shù)據(jù)方式。
如果SPI想在一個(gè)周期內(nèi)一次性將數(shù)據(jù)讀取上來,可以把SPI通信設(shè)置為 傳送bits》= DIN+DOUT所需的時(shí)鐘數(shù)目,這里根據(jù)時(shí)序圖為22個(gè)DCLK。 就可以在22個(gè)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
評論
查看更多