漫談傳輸介面-SATA


前言

為什麼前天講PCI好好的昨天突然換到PATA呢?因為我個人認為SATA和PCIe在最底層的Physical Layer差不多,但Link Layer和Transport Layer較好理解,所以轉過來談SATA比較容易入門高速序列傳輸介面(serial interface),因為平行傳輸介面(parallel interface)靠傳輸線傳送data bits和clock,頻率上到一定程度就無法處裡傳輸時各條訊號線的落差,讓接收端無法正確接收data,而高速序列傳輸介面是每個cycle只有傳遞1 bit(會用差動訊號增強訊號品質,所以兩根訊號線,但只有1 bit data),因此電晶體製程有多快,就能把頻率拉多快,頻率只要是平行傳輸介面的data bits寬度的倍數(例如PATA是16)就能一樣快,但實際上倍率都是數十倍、上百倍的,所以現在需要高反應速度或大量傳輸資料的都會使用序列介面了。


SATA簡介

高速傳輸介面需要分層來看,分別是Physical Layer、Link Layer、Transport Layer、還有最上層spec沒取名的我就叫它Application Layer。

SATA Physical Layer

高速傳輸介面在這邊大同小異,最外面都是發送端(TX)訊號和接收端(RX)訊號,因為高頻希望有更好的訊號品質,所以使用差動訊號TX_p、TX_n和RX_p、RX_n,甚麼是差動訊號呢?原本像UART如果訊號線上電壓是0V就代表邏輯的0、5V就代表邏輯的1,而差動訊號則是電壓範圍有負值,像SATA用+0.5V~-0.5V,要打出邏輯的1就是把TX_p拉到+0.5V、TX_n拉到-0.5V,要打邏輯0就是TX_p拉到-0.5V、TX_n拉到+0.5V,這樣接收端參考兩根訊號更能正確判斷收進來的值是什麼,如果TX_p、TX_n都在0V稱為common mode,代表沒在打訊號。

再來是clock recovery部分,高速序列介面只有data線沒有clock線就是怕clock和data的傳遞差距而產生問題,因此接收端是從data訊號線的內容還原出clock,同時用這個clock產生正確的RX data,使用的技術可能是CDR(clock data recovery)或over sampling,有興趣的人可以再去找資料。

下一步是serial轉parallel的部分,它不是RX data各bit疊起來就好,因為高速序列傳輸一旦開始傳輸就必須隨時都在傳訊號,這樣clock才不會失鎖而產生錯誤,但master端和slave端雖然都想跑在同一頻率,還是會有些微差距,這個些微差距在數量累積多了也是可能造成幾DWORD的差距,因此高速序列介面都會定義一種dummy symbol可以被任意加入或刪除,在Physical Layer RX這邊做一個Elastic buffer,當RX data快要不夠Link Layer取用時就塞幾個dummy symbol進去,當RX比Link Layer快,Elastic buffer快滿的時候就抽掉幾個dummy symbol,在SATA的dummy symbol叫做ALIGN.

最後是建立傳輸調速度的部分,SATA有自己獨特的機制叫做OOB handshake,OOB是bus上有值沒值(common mode)的組合,有兩種,第一種是106ns的有值接著320ns的沒值,連打六組,在host稱COMRESET、在device稱COMINIT,第二種是106ns的值接著106ns的沒值,連打六組,這個叫COMAKE。

平時還沒建立連線就是每隔幾ms就打一次COMRESET/COMINIT看看對面有沒有反應,有反應就照著下圖的順序打,順序合法後就可以進行調速,細節再看spec。

SATA Link Layer

Link Layer要先知道編解碼,TX要編碼,RX要解碼,使用的技術叫做8b10 code,這是一種把8 bit data轉程10 bit symbol的行為,為什麼要這樣呢?因為Physical Layer要做clock recovery技術要有足夠的0-1變化,如果連打8-bit的0那就直接clock失鎖,因次8b10b編碼在SATA最多只會有連續5 bits的0或1,出現在8b10b code的K28.5。

再來是scramble,就是用shift register做XOR,如果bus上有週期性的出現相同形狀的pattern會形成電磁波干擾,SATA的spec很容易有這種事發生,因此SATA規定有這種事發生時可以加上scramble打亂資料形狀。

接著要瞭解的是primitive,SATA定義了ALIGN、SYNC、X_RDY、R_RDY...各種primitive,它是40 bits的固定8b10b code組合,像ALIGN是K28.5、D10.2、D10.2、D27.3,其他primitive是K28.3開頭的,handshake很簡單,都是打primitive然後等對面回對應的primitive,像是持續打X_RDY等著對面回應R_RDY...最後就能透過primitive handshake把Transprt Layer的FIS傳給對方或收下。

SATA Transport Layer

FIS(Fram Information Structure),就是資料封包,在這邊開始和PATA接軌,PATA的讀寫register就是靠著host發送的command FIS、control FIS、和device發送的response FIS、PIO setup FIS、set device bits FIS達成,data傳輸就是data FIS,透過正確的FIS handshake就能完成command動作

我稱呼最上層的Application Layer

就是Command FIS的內容,裡面的各種參數都是靠ATA spec規範,最簡單的Read、Write command,到複雜的磁碟管理SMART command,都是有用到查spec就好。


簡單的講過SATA,比較單純的高速序列傳輸,明天來講PCIe,它的master和slave各做各的事比較難理解一點。

#SATA







你可能感興趣的文章

Sticky Nav

Sticky Nav

CSS 定位 置中

CSS 定位 置中

How to build CICD with Jenkins as code based on container

How to build CICD with Jenkins as code based on container






留言討論