漫談傳輸介面-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







你可能感興趣的文章

Object and Arrays - Reference VS Copy

Object and Arrays - Reference VS Copy

Github Deploy Key && PATs

Github Deploy Key && PATs

Python Table Manners - 安全性檢查

Python Table Manners - 安全性檢查






留言討論