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通訊時Master首先需要配置一個時鐘(clock),這個值一般選擇小于或者大于Slave設備支持的頻率。 通用的頻率范圍為1-70MHz。
SPI工作在全雙工模式,這意味著數(shù)據(jù)可以在同一時間發(fā)送和接收。
時鐘極性polarity與時鐘相位phase
時鐘極性(CPOL)和時鐘相位(CPHA)用于設定從設備何時采樣數(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)主、從設備間的通訊,主、從設備的CPOL和CPHA必須有相同的設置。以下是CPOL,CPHA與4種模式的關系圖。
SPI的菊花鏈配置
一個Master 與3個獨立的Slave組合, 每個Slave都有一個獨立的SS(Slave Select)。
一個Master與一組使用公用SS(Slave Select)的Slave組合。
以AD7873為例做一些SPI的典型的設置
根據(jù)時序圖,當CS變成低電平時,DCLK為低電平空閑,DIN在DCLK的上升沿數(shù)據(jù)鎖存。所以SPI的polarity與phase設置為Mode 0。
Figure 38 -SPI設置為8bits通信模式,通信周期分為3個階段:
1》 DCLK前8個DCLK對應指令周期。在這8個DCLK中,通過DIN向AD7873發(fā)送8bits命令字控制隨后進行的串行數(shù)據(jù)傳輸。
2》 數(shù)據(jù)傳輸周期從第9個上升沿開始,輸入數(shù)據(jù)在時鐘上升沿寫入,輸出的數(shù)據(jù)則在時鐘的下降沿讀出。這里的輸入數(shù)據(jù)為8bits的0數(shù)據(jù)。DOUT同時也從DCLK的第10個上升沿開始數(shù)據(jù)輸出,到第二個DCLK周期結束時,DOUT輸出位數(shù)為7bits。
3》 重新開始8個DCLK的指令周期,繼續(xù)通過DIN傳送8bits命令控制字,同時DOUT在第17個DCLK輸出最后的5bits數(shù)據(jù)。
可見在Figure 38中8bits數(shù)據(jù)通信模式下,AD7873要完成一個完整的SPI數(shù)據(jù)讀寫,需要3個周期,即發(fā)送24bits數(shù)據(jù)才能達到目標。
Figure 39 -SPI設置為15bits通信模式,通信周期分為2個階段:
1》 DCLK前15個DCLK對應指令周期。在這15個DCLK中,通過DIN向AD7873發(fā)送15bits命令字控制隨后進行的串行數(shù)據(jù)傳輸(MSB 8bits為命令字, LSB 7bits為數(shù)據(jù)0)。DOUT同時也從DCLK的第9個上升沿開始數(shù)據(jù)輸出,第一次15 DLCK周期結束時,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ù)才能達到目標。
可見Figure 38使用的DCLK最少,效率最高。不過再8bits傳送模式下需要采用連續(xù)發(fā)送3次8bits數(shù)據(jù)方式。
如果SPI想在一個周期內一次性將數(shù)據(jù)讀取上來,可以把SPI通信設置為 傳送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
評論
查看更多