1. 程式人生 > >SPI資料傳輸

SPI資料傳輸

 SPI 裝置間的資料傳輸之所以又被稱為資料交換, 是因為 SPI 協議規定一個 SPI 裝置不能在資料通訊過程中
僅僅只充當一個 "傳送者(Transmitter)" 或者 "接收者(Receiver)". 在每個 Clock 週期內, SPI 裝置都會發送
並接收一個 bit 大小的資料, 相當於該裝置有一個 bit 大小的資料被交換了.
 在資料傳輸的過程中,  每次接收到的資料必須在下一次資料傳輸之前被取樣. 如果之前接收到的資料沒有被讀取,
 那麼這些已經接收完成的資料將有可能會被丟棄,  導致 SPI 物理模組最終失效. 因此, 在程式中一般都會在 SPI
 傳輸完資料後, 去讀取 SPI 裝置裡的資料, 即使這些資料(Dummy Data)在我們的程式裡是無用的.


SPI通訊方式從機不能主動給主機發送資料.因為SPI是全雙工的,主機在傳送資料的同時也在接收資料.所以,主機可以
通過查詢(傳送資料給從機,檢視接收到的資料)方式來判斷從機是否有資料傳送給主機,如果有,則主機繼續傳送數
據給從機來獲取從機想要傳送給主機的資料.
1、主機想讀取從機資料,那麼就給從機發送一個特定的位元組(比如:0x11),那麼從機接收到0x11,就表示主機想讀
取從機的資料了。 2、SPI是全雙工,所以只要主從機之間有通訊,你所說的傳送線和接收線都是工作的,主機在接收
資料的同時也在傳送資料,如果主機發送線為0,從機接收到的就是0;為1,則從機接收到的就是1,從機接收完該資料
不做任何處理就可以了。 你問題中“這個時刻從機為什麼不認為主機在給他傳送資料?”,主機不會認為主機不給它發
送資料,從機是一直在接收主機所傳送的資料的,至於接收到的資料怎麼處理,就看你程式怎麼編了

【軟體中如何設定SPI的極性和相位】
SPI分主裝置和從裝置,兩者通過SPI協議通訊。
而設定SPI的模式,是從裝置的模式,決定了主裝置的模式。
所以要先去搞懂從裝置的SPI是何種模式,然後再將主裝置的SPI的模式,設定和從裝置相同的模式,即可正常通訊。
對於從裝置的SPI是什麼模式,有兩種:
(1)固定的,有SPI從裝置硬體決定的

SPI從裝置,具體是什麼模式,相關的datasheet中會有描述,需要自己去datasheet中找到相關的描述,即:
關於SPI從裝置,在空閒的時候,是高電平還是低電平,即決定了CPOL是0還是1;
然後再找到關於裝置是在上升沿還是下降沿去取樣資料,這樣就是,在定了CPOL的值的前提下,對應著可以推算出CPHA是0還是1了。

從圖中可以看到,最開始的SCLK和結束時候的SCLK,即空閒時刻的SCLK,是低電平,推匯出CPOL=0,然後可以看到資料取樣的時候,即資料最中間的那一點,對應的是SCLK的第一個邊沿,所以CPHA=0(此時對應的是上升沿)。

建立時間(setup time)是指在觸發器的時鐘訊號上升沿到來以前,資料穩定不變的時間,如果建立時間不夠,資料將不能在這個時鐘上升沿被打入觸發器;保持時間(hold time)是指在觸發器的時鐘訊號上升沿到來以後,資料穩定不變的時間,
如果保持時間不夠,資料同樣不能被打入觸發器。

建立時間不滿足,只能重新綜合設計,並以違例路徑為目標進行優化,以及對涉及到違例的組合邏輯以及子模組加緊約束。
保持時間不滿足,可在布圖前或者布圖後再修改這些違例,通常布圖後再修改。因為布圖前綜合,時序分析採用統計線載模型,在佈局前修正保持時間違例可能會導致布圖後建立時間違例。
1、setup time的意義:為什麼Data需要在Clock到達之前到達?

其實在實際的問題中,setup time並不一定是大於零的,因為Clock到達時刻並不等同於latch的傳輸門A關閉的時刻(更何況這種關閉並不是絕對的和瞬間完成的),這之間有一個未知的延遲時間。
     為使問題簡化,假設Clock的到達時刻為傳輸門A關閉、傳輸們B開啟的時刻。如果Data沒有在這之前足夠早的時刻到達,那麼很有可能內部的 feedback線路上的電壓還沒有達到足夠使得inv1翻轉的地步(因為inv0有延時,Data有slope,傳輸門B開啟後原來的Q值將通過 inv2迫使feedback保持原來的值)。如果這種競爭的情況發生,Q的舊值將有可能獲勝,使Q不能夠寄存住正確的Data值;當然如果 feedback上的電壓已經達到了足夠大的程度也有可能在競爭中取勝,使得Q能夠正確輸出。
      如果inv0、inv1和inv2的延時較大(Data的變化影響feedback和Q的時間越長),那麼為了保證正確性就需要更大的setup time。所以在實際測量setup time的時候,需要選取工藝中最慢的corner進行模擬測量。

2、hold time的意義:為什麼Data在Clock到達之後仍然要保持一段時間?
      和setuptime的情況不一樣,因為Clock到達時刻並不等同於latch的傳輸門A完全關閉的時刻。所以如果Data沒有在Clock到達之後 保持足夠長的時間,那麼很有可能在傳輸門A完全關閉之前Data就已經變化了,並且引起了feedback的變化。如果這種變化足夠大、時間足夠長的話, 很有可能將feedback從原本正確的低電壓拉到較高電壓的電壓。甚至如果這種錯誤足夠劇烈,導致了inv1和inv2組成的keeper發生了翻轉, 從而徹底改變了Q的正確值,就會導致輸出不正確。當然,如果這種錯誤電壓不是足夠大到能夠改變keeper的值,就不會影響到Q的正確輸出。
      如果inv0、inv1和inv2的延時較小(Data的變化影響feedback和Q的時間越短),那麼為了保證正確性,就需要更大的hold time。所以在實際測量hold time的時候,需要選取工藝中最快的corner進行模擬測量