上一篇文章中,對(duì)SATA協(xié)議的物理層做了簡要的分析,物理層是SATA的基礎(chǔ),是處理串行傳輸信號(hào)的最前端,物理層之后就是鏈路層,下面對(duì)鏈路層做簡要的分析和描述。
數(shù)據(jù)鏈路層位于物理層和傳輸層之間,其根本任務(wù)是信道編碼,維持鏈路的通暢。與物理層類似,數(shù)據(jù)鏈路層也分為發(fā)送和接收兩部分,由數(shù)據(jù)鏈路層控制狀態(tài)機(jī)模塊進(jìn)行協(xié)調(diào)與控制。數(shù)據(jù)鏈路層只負(fù)責(zé)按協(xié)議規(guī)定的格式接收和發(fā)送幀信息,不需要關(guān)注幀信息的具體內(nèi)容。數(shù)據(jù)鏈路層根據(jù)傳輸層的控制信號(hào)發(fā)送原語和接收物理層的原語并轉(zhuǎn)換為相應(yīng)的控制信號(hào)報(bào)告給傳輸層以完成握手、流量控制等信息交互,通過采用CRC校驗(yàn)、數(shù)據(jù)加/解擾、8B/10B 編碼等機(jī)制提供數(shù)據(jù)的可靠傳輸。
SATA協(xié)議規(guī)定鏈路層的主要功能是負(fù)責(zé)把傳輸層傳遞的信息幀進(jìn)行編碼,校驗(yàn),擾碼,封裝幀邊界,對(duì)物理層傳遞的信息幀進(jìn)行解碼,校驗(yàn),擾碼,解析出幀的有效數(shù)據(jù)。鏈路層主要通過控制原語的傳遞來控制信息幀的整個(gè)傳輸過程,保證該傳輸過程的有效性并進(jìn)行相應(yīng)的流量控制。
數(shù)據(jù)鏈路層結(jié)構(gòu)框圖如圖1:
圖1 數(shù)據(jù)鏈路層結(jié)構(gòu)圖
鏈路層的CRC生成和校驗(yàn)?zāi)K、加擾和解擾模塊、8b/10b編碼和解碼模塊用于對(duì)傳輸數(shù)據(jù)的處理,保證數(shù)據(jù)傳輸?shù)目煽啃?;原語生成和探測(cè)模塊用于產(chǎn)生發(fā)送原語和檢測(cè)接收原語;FIFO模塊用于緩存輸入輸出的數(shù)據(jù)。
數(shù)據(jù)的收發(fā)過程為:
當(dāng)收到傳輸層發(fā)來的幀傳輸請(qǐng)求后,數(shù)據(jù)鏈路層完成的操作如下:
1、與對(duì)方數(shù)據(jù)鏈路層協(xié)商,避免發(fā)生幀傳輸沖突;若出現(xiàn)沖突,設(shè)備端優(yōu)先傳輸;
2、從傳輸層接收有效數(shù)據(jù)并進(jìn)行封裝(添加SOFP、CRC、EOFP等);
3、計(jì)算有效數(shù)據(jù)的CRC校驗(yàn)值;
4、發(fā)送幀信息給物理層,根據(jù)己方FIFO和對(duì)方數(shù)據(jù)鏈路層狀態(tài)進(jìn)行流量控制;
5、接收對(duì)方數(shù)據(jù)鏈路層的反饋信息,向傳輸層報(bào)告當(dāng)前傳輸狀態(tài);
6、對(duì)數(shù)據(jù)進(jìn)行加擾、8B/10B 編碼操作。
當(dāng)接收物理層傳回?cái)?shù)據(jù)時(shí),數(shù)據(jù)鏈路層完成的操作如下:
1、通知對(duì)方數(shù)據(jù)鏈路層已經(jīng)準(zhǔn)備好接收幀信息;
2、從物理層接收已經(jīng)過編碼處理的數(shù)據(jù);
3、10B/8B 解碼并去除封裝(SOFP、CRC、EOFP等);
4、對(duì)接收到的數(shù)據(jù)進(jìn)行CRC 校驗(yàn);
5、根據(jù)己方FIFO和對(duì)方數(shù)據(jù)鏈路層狀態(tài)進(jìn)行流量控制;
6、對(duì)比接收到的和計(jì)算所得的CRC校驗(yàn)值;
7、向?qū)Ψ降臄?shù)據(jù)鏈路層和己方傳輸層報(bào)告當(dāng)前傳輸狀態(tài);
8、對(duì)數(shù)據(jù)進(jìn)行解擾。
鏈路層在傳輸層指令控制下選擇要發(fā)送的原語或數(shù)據(jù)幀,每次處理一個(gè)DWORD 數(shù)據(jù),如果所處理的DWORD 數(shù)據(jù)是幀封裝頭SOF(Start Of Frame)和幀封裝尾EOF(End Of Frame)中間的數(shù)據(jù),對(duì)于從傳輸層接收到的數(shù)據(jù)幀,鏈路層首先進(jìn)行CRC 計(jì)算,得到CRC生成碼,CRC生成碼作為幀內(nèi)容的最后一個(gè)DWORD,將數(shù)據(jù)幀送入擾碼模塊對(duì)數(shù)據(jù)加擾,發(fā)送EOF原語作為數(shù)據(jù)發(fā)送結(jié)束標(biāo)志,最后經(jīng)過8b/10b 編碼,將數(shù)據(jù)變成適合物理層傳輸?shù)拇a型并傳送至物理層。在傳輸?shù)倪^程中,鏈路層通過在數(shù)據(jù)包上插入原語來進(jìn)行流量控制,完成數(shù)據(jù)傳輸后,鏈路層等待物理層的應(yīng)答,并把流量控制信息傳遞至傳輸層。
對(duì)于從物理層接收的數(shù)據(jù),鏈路層首先進(jìn)行8b/10b解碼,然后將數(shù)據(jù)送入解擾器,同時(shí)探測(cè)原語,判斷原語信息,將解擾后的數(shù)據(jù)進(jìn)行CRC校驗(yàn),檢測(cè)當(dāng)前接收到的數(shù)據(jù)CRC與計(jì)算CRC 是否一致,若正確,則將數(shù)據(jù)發(fā)送到傳輸層,若不正確,則通過錯(cuò)誤機(jī)制上報(bào)傳輸層和數(shù)據(jù)發(fā)送方。
8B/10B編碼:為了增強(qiáng)數(shù)據(jù)傳輸過程中差分信號(hào)的抗干擾能力,SATA規(guī)范采用了 8b/10b編碼機(jī)制。采用8b/10b 編碼機(jī)制主要是保證數(shù)據(jù)傳輸?shù)挠行院涂垢蓴_性。采用8b/10b 編碼機(jī)制,能使發(fā)送的“0”、“1”頻率保持基本一致,并且連續(xù)的“1”或“0”不超過 5 位,即每 5 個(gè)連續(xù)的“1”或“0”后必須插入一位“0”或“1”,從而保證信號(hào) DC 平衡。因?yàn)樵诟咚俚拇袛?shù)據(jù)傳輸中,如果比特流中邏輯0或邏輯1
有連續(xù)多個(gè)數(shù)據(jù)信息位沒有發(fā)生狀態(tài)跳變時(shí),數(shù)據(jù)信息之間的跳變信號(hào)將會(huì)受到影響減弱而出錯(cuò),而直流平衡技術(shù)則解決了這個(gè)問題。
8B/10B 編碼的基本思想是將一個(gè)8 位數(shù)據(jù)劃分為低5 位和高3 位兩部分,對(duì)低5位部分進(jìn)行 5B/6B編碼,對(duì)高3位兩部分進(jìn)行3B/4B 編碼,如此分為兩部分進(jìn)行編碼使得硬件上能更有效地對(duì)更小的子塊進(jìn)行編解碼。通過兩部分分別編碼,最終8位數(shù)據(jù)被編碼為 10 位數(shù)據(jù),其原理如圖2所示。編碼后的10 位中所有“1”或“0”的個(gè)數(shù)不會(huì)超過 6個(gè),并且連續(xù)的“1”或“0”的個(gè)數(shù)不會(huì)超過4個(gè)。解碼原理與編碼類似,只不過是逆過程而已。
圖2、8B/10B編碼原理圖
8b/10b的編碼過程是將一組需要連續(xù)發(fā)送的8位數(shù)據(jù)信息分解成兩組數(shù)據(jù),一組3位,一組5位,然后經(jīng)過編碼后分別成為一組4 位的代碼和一組6位的代碼,最后組成一組10位的數(shù)據(jù)發(fā)送出去。而
8b/10b解碼電路的基本原理就是將接收到的10位數(shù)據(jù)分為4 位和 6 位兩個(gè)部分,分別解碼而將其變成3位和5位,然后將新數(shù)據(jù)用于高速串行傳輸。其具體編碼過程如圖3所示,編碼數(shù)據(jù)一般都表示為 DX.Y 或 KX.Y,其中D表示為數(shù)據(jù)代碼,K表示為包含特殊信息的命令代碼,X 表示輸入的原始數(shù)據(jù)的低5位EDCBA,Y 表示輸入的原始數(shù)據(jù)的高3位HGF。SATA協(xié)議通過8b/10b編碼機(jī)制,能夠增加協(xié)議數(shù)據(jù)傳輸中的控制手段來保證數(shù)據(jù)傳輸?shù)恼_有效性,并且通過利用這些特殊信息的命令代碼,還可以幫助數(shù)據(jù)接收端進(jìn)行還原的工作,并可以在早期發(fā)現(xiàn)數(shù)據(jù)位的傳輸錯(cuò)誤,抑制傳輸錯(cuò)誤的繼續(xù)產(chǎn)生。
圖3 8b/10b 編碼過程
為了使編解碼過程利于描述和理解,8B/10B 編碼規(guī)范對(duì)所有二進(jìn)制數(shù)進(jìn)行了約定:用a~j表示編碼后10位數(shù)據(jù)的bit0~bit9;用A~H表示編碼前8 位數(shù)據(jù)的bit0~bit7并以Zxx.y 的形式命名。Z 作為控制位,當(dāng)傳輸?shù)氖菙?shù)據(jù)字符時(shí),Z 為 D;當(dāng)傳輸?shù)氖强刂谱址麜r(shí),Z為 K;xx 代表低 5位EDCBA 的十進(jìn)制值,y 代表高3 位HGF 的十進(jìn)制值。表1的示例有助于理解數(shù)字和字符之間的轉(zhuǎn)換關(guān)系。如表 1 中所示,當(dāng)需要對(duì)BCh控制字符進(jìn)行轉(zhuǎn)換時(shí),首先可以確定Z 為 K,然后用HGFEDCBA 表示“1011 1100”,那么HGF 為“101”,EDCBA 為“11100”,BCh控制字符就可以用“K28.5”來表示了;同理,4Ah 數(shù)據(jù)字符可以用“D10.2”表示。
表1 字符轉(zhuǎn)換關(guān)系表
8B/10B編碼過程可以分為兩個(gè)階段:
第一階段利用5B/6B編碼表,參考當(dāng)前“運(yùn)行不均等性”值將低5 位編碼成 6 位。
第二階段利用3B/4B編碼表,參考經(jīng)過第一階段更新的“運(yùn)行不均等性”值將剩下的高3位編碼成4位。
“運(yùn)行不均等性”(Running Disparity)是一個(gè)用正值“+”或負(fù)值“-”表示的二進(jìn)制參數(shù),它會(huì)對(duì)下一次編碼結(jié)果產(chǎn)生影響。每完成一次編碼,編碼器都會(huì)根據(jù)之前編碼的值計(jì)算出一個(gè)新的“運(yùn)行不均等性”值,然后參與下一次編碼的運(yùn)算。編碼運(yùn)算規(guī)則如下:
1、當(dāng)?shù)玫降?/span>6位/4位數(shù)據(jù)中,“1”的個(gè)數(shù)大于“0”或者“000111”、“0011”,那么“運(yùn)行不均等性”值為“+”;
2、當(dāng)?shù)玫降?/span>6位/4位數(shù)據(jù)中,“1”的個(gè)數(shù)小于“0”或者“111000”、“1100”,那么“運(yùn)行不均等性”值為“-”;
3、當(dāng)?shù)玫降?/span>6位/4位數(shù)據(jù)中,“1”的個(gè)數(shù)等于“0”(除了以上4種情況),那么“運(yùn)行不均等性”值保持不變。
數(shù)據(jù)字符的5B/6B、3B/4B編碼表分別如表2、3 所示,控制字符的編碼表如表4所示。表中“rd+”、“rd-”代表上一次編碼完成后的“運(yùn)行不均等性”值;“rd’”代表本次編碼完成后“運(yùn)行不均等性”值,在“rd’”列中“-rd”代表“運(yùn)行不均等性”值正負(fù)變化,而“rd”代表“運(yùn)行不均等性”值不變化。
表2 數(shù)據(jù)字符5B/6B編碼表
表3 數(shù)據(jù)字符3B/4B編碼表
表4控制字符編碼表
CRC 校驗(yàn):添加 CRC校驗(yàn)的主要目的是降低數(shù)據(jù)傳輸時(shí)通信線路受到外界電磁干擾而產(chǎn)生誤碼的概率,它是通信系統(tǒng)中常用的一種差錯(cuò)校驗(yàn)方式,在SATA協(xié)議中采用的是CRC32校驗(yàn)方式。鏈路層計(jì)算的CRC值與從物理層發(fā)送的CRC值相比較,如果比較結(jié)果一致,則說明發(fā)送數(shù)據(jù)沒有出現(xiàn)錯(cuò)誤;若比較結(jié)果不一致,則需要將錯(cuò)誤信息反饋至應(yīng)用層,應(yīng)用層根據(jù)錯(cuò)誤信息進(jìn)行相應(yīng)處理。CRC校驗(yàn)計(jì)算SOF和EOF之間的所有數(shù)據(jù)(不包括數(shù)據(jù)間插入的原語),以 DWORD(32位)為一個(gè)計(jì)算單位長度,如果校驗(yàn)數(shù)據(jù)的長度不是32 位的整數(shù)倍,則在校驗(yàn)數(shù)據(jù)后面補(bǔ)充相應(yīng)位數(shù)的“0”。SATA協(xié)議規(guī)定的CRC初始值為0x52325032,SOF和EOF之間的校驗(yàn)數(shù)據(jù)長度最大為 2064個(gè)DWORDs。
SATA協(xié)議為了保證數(shù)據(jù)傳輸?shù)恼_性,采用了CRC數(shù)據(jù)校驗(yàn)機(jī)制(Cyclic Redundancy Check)。循環(huán)冗余校驗(yàn)CRC具有強(qiáng)大的檢錯(cuò)能力,并在以太網(wǎng)鏈路層等多種數(shù)據(jù)傳輸協(xié)議的數(shù)據(jù)校驗(yàn)功能中得到應(yīng)用。它具有檢錯(cuò)能力強(qiáng),計(jì)算開銷小,易于編碼器實(shí)現(xiàn)等優(yōu)點(diǎn)。與奇偶校驗(yàn)及算術(shù)和校驗(yàn)等方式相比,雖然校驗(yàn)算法較為復(fù)雜,但是其校驗(yàn)性能和所需系統(tǒng)開銷都遠(yuǎn)遠(yuǎn)優(yōu)于兩者。SATA協(xié)議中的CRC主要對(duì)信息幀進(jìn)行串行校驗(yàn)計(jì)算,以信息幀起始原語(SOF)和結(jié)束原語(EOF)之間的所有有效數(shù)據(jù)位為計(jì)算對(duì)象。該校驗(yàn)計(jì)算的一個(gè)基本校驗(yàn)計(jì)算單位為32 位數(shù)據(jù),當(dāng)一個(gè)信息幀的容量沒有達(dá)到DWORD的整數(shù)倍時(shí),所缺數(shù)據(jù)位在信息幀后面補(bǔ)充0即可。循環(huán)冗余碼CRC機(jī)制在 SATA發(fā)送端進(jìn)行編碼和SATA接收端接收進(jìn)行校驗(yàn)時(shí),根據(jù)協(xié)議規(guī)定 CRC生成多項(xiàng)式G(X)來得到各個(gè)數(shù)據(jù)位的校驗(yàn)公式,K位要發(fā)送的數(shù)據(jù)信息位可對(duì)應(yīng)一個(gè)(K-1)次多項(xiàng)式K(X),R 位冗余位對(duì)應(yīng)于一個(gè)(R-1)次多項(xiàng)式 R(X),由K位數(shù)據(jù)信息位后面加上R位冗余位組成的校驗(yàn)信息碼則對(duì)應(yīng)于一個(gè)(N-1)次多項(xiàng)式 T(X)X×K(X)+R(X)。發(fā)送端產(chǎn)生一個(gè)循環(huán)冗余校驗(yàn)數(shù)據(jù),跟隨在信息幀有效數(shù)據(jù)后發(fā)送,接收端在接收到信息幀中的校驗(yàn)數(shù)據(jù)后將其除以CRC生成多項(xiàng)式G(X),如結(jié)果為零則表示數(shù)據(jù)傳輸正確。SATA協(xié)議采用的CRC生成多項(xiàng)式為:G(X)=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1。
假設(shè)待發(fā)送數(shù)據(jù)有K位,校驗(yàn)碼有R位,G(x)是產(chǎn)生校驗(yàn)碼的生成多項(xiàng)式,校驗(yàn)碼多項(xiàng)式和完整碼多項(xiàng)式分別由P(x)、C(x)表示,則待發(fā)送數(shù)據(jù)可表示為:M(x)=mk-1xk-1+mk-2xk-2+…+mixi+…+m1x+x0
上式中,系數(shù)mi取值為0 或 1,由于是二進(jìn)制表示,x 取值為2。那么,完整碼多項(xiàng)式為 C(2)= xRM(2)+P(2),校驗(yàn)碼多項(xiàng)式P(2)為2RM(2)除以 G(2)得到的余數(shù)。
目前CRC校驗(yàn)方法根據(jù)生成多項(xiàng)式分為多種,如 CRC-4、CRC-8、CRC-16、CRC-ITU和CRC-32等。由于數(shù)據(jù)鏈路層以DW為最小傳輸單位,所以采用的生成多項(xiàng)式為G(X)=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1。校驗(yàn)時(shí)計(jì)算對(duì)象包括SOFP和EOFP之間所有的FIS 數(shù)據(jù)內(nèi)容,以DW為最小單位,不足整數(shù)的需要在數(shù)據(jù)末尾補(bǔ)“0”,計(jì)算所得的校驗(yàn)碼放在最后一位FIS和EOFP之間,隨幀信息一起發(fā)送出去;接收端接收時(shí),同樣需要對(duì)SOFP和EOFP之間所有的FIS數(shù)據(jù)內(nèi)容進(jìn)行CRC運(yùn)算,所得到的CRC值與原來的值比較,若相等則說明傳輸正確沒有錯(cuò)誤。SATA標(biāo)準(zhǔn)協(xié)議規(guī)定CRC校驗(yàn)的初始值為52325032h,SOFP和 EOFP之間最大的DW數(shù)量不能超過2064個(gè)。
擾碼器:添加擾碼器的作用是為提取數(shù)據(jù)幀中的位定時(shí)信息、擴(kuò)散信號(hào)頻譜并保持穩(wěn)定,避免電路的周期性基帶信號(hào)對(duì)數(shù)據(jù)傳輸帶來的干擾,它在發(fā)送端將發(fā)送的數(shù)據(jù)幀轉(zhuǎn)換成“0”“1”發(fā)生概率近似相等、前后相互獨(dú)立的偽隨機(jī)碼流。擾碼器是由線性反饋移位寄存器和“異或門”組成,以輸入的數(shù)據(jù)和線性反饋寄存器輸出值的模2加為輸出。SATA協(xié)議規(guī)定,線性反饋移位寄存器的初始值為0xFFFF,在 SOF和EOF之間的數(shù)據(jù),包括CRC值都需要加擾。對(duì)于原語信息則不需要加擾,在設(shè)計(jì)擾碼器時(shí)要首先將操作原語和數(shù)據(jù)分開,不能影響對(duì)數(shù)據(jù)的加擾,也不能對(duì)原語進(jìn)行加擾。
SATA協(xié)議為了保證時(shí)鐘數(shù)據(jù)采樣信號(hào)的質(zhì)量,需要保持信號(hào)的穩(wěn)定性和足夠的比特定時(shí)信息含量,因而采用擾碼機(jī)制來進(jìn)一步調(diào)整連續(xù)1或連續(xù)0等信號(hào),將傳輸數(shù)據(jù)擾亂形成“0”,“1”近似等概率的有效跳變信號(hào),可以最大程度地避免連續(xù)信號(hào)在傳輸過程中所收的干擾。擾碼的主要工作原理實(shí)際是一個(gè)偽隨機(jī)數(shù)據(jù)序列的生成模塊,主要利用異或門和線性反饋移位寄存器實(shí)現(xiàn),SATA 協(xié)議采用擾碼生成多項(xiàng)式方程為:G(X) = X16 + X15+X13+ X4+1。當(dāng)鏈路層對(duì)數(shù)據(jù)進(jìn)行擾碼時(shí),SATA接口會(huì)先將線性反饋移位寄存器中生成的隨機(jī)數(shù)據(jù)碼與有效數(shù)據(jù)進(jìn)行異或操作,得到擾碼數(shù)據(jù)后再將其進(jìn)行8b/10b編碼,編碼完畢后送入物理層發(fā)送出去;當(dāng)鏈路層對(duì)數(shù)據(jù)進(jìn)行解擾碼操作時(shí),SATA 接口現(xiàn)將數(shù)據(jù)進(jìn)行8b/10b解碼,然后將解碼后的數(shù)據(jù)與線性反饋移位寄存器中相對(duì)應(yīng)的隨機(jī)碼進(jìn)行異或操作,最后得到幀有效數(shù)據(jù)信息。
除了 SOFP和 EOFP之間所有的 FIS數(shù)據(jù)內(nèi)容(包括 CRC 校驗(yàn)值)需要加擾之外,介于CONTP和新的原語之間重復(fù)的原語也需要進(jìn)行加擾。SATA 標(biāo)準(zhǔn)協(xié)議規(guī)定線性反饋移位寄存器的初始值為FFFFh。
鏈路層控制原語:鏈路層總共有18個(gè)原語,用來控制和表示串行線路的工作狀態(tài),在傳輸過程中也用來調(diào)整流量控制,每個(gè)控制原語長度均為 4 個(gè)字符,原語之間采用握手機(jī)制來完成狀態(tài)的控制。
SATA協(xié)議鏈路層的控制原語主要是用來控制和維持串行鏈路數(shù)據(jù)傳輸狀態(tài)的一系列信息原語。鏈路層數(shù)據(jù)傳輸過程的控制主要由 SATA主機(jī)和設(shè)備相互之間發(fā)送、接收控制原語實(shí)現(xiàn)的。SATA 協(xié)議通信的雙方都可以向?qū)Ψ桨l(fā)送數(shù)據(jù)傳輸請(qǐng)求,并在接收到對(duì)方準(zhǔn)備好信號(hào)后開始數(shù)據(jù)傳輸,主機(jī)端和設(shè)備端在鏈路層完全是對(duì)等關(guān)系。在數(shù)據(jù)傳輸過程中,當(dāng)數(shù)據(jù)發(fā)送方發(fā)送數(shù)據(jù)緩沖不足時(shí),發(fā)送HOLD 原語進(jìn)行流量控制,直到數(shù)據(jù)準(zhǔn)備好進(jìn)入發(fā)送緩沖區(qū)則繼續(xù)發(fā)送數(shù)據(jù);而接收方在接收數(shù)據(jù)緩沖已滿時(shí),也同樣會(huì)發(fā)送HOLD 原語進(jìn)行流量控制。我們利用一個(gè)完整信息幀的詳細(xì)傳輸過程來說明控制原語是如何對(duì)其控制的:
1. 發(fā)送方發(fā)現(xiàn)有數(shù)據(jù)需要傳輸時(shí),則對(duì)接收方發(fā)送X_RDY 原語,來表示發(fā)送數(shù)據(jù)的請(qǐng)求并告知接收方準(zhǔn)備接收。
2. 接收方接收到X_RDY原語時(shí),開始檢查自身狀態(tài),確認(rèn)無誤可以接收數(shù)據(jù)后,向發(fā)送方發(fā)送R_RDY,表示接收方已準(zhǔn)備接收。
3.發(fā)送方得到接收方已準(zhǔn)備接收信號(hào)好,開始發(fā)送數(shù)據(jù),首先發(fā)送SOF原語,然后是若干有效數(shù)據(jù)。
4.接收方在收到SOF原語及信息幀中的有效數(shù)據(jù)時(shí),向發(fā)送發(fā)返回 R_IP原語表示接收方正在接收。
5.發(fā)送方在該信息幀的發(fā)送過程中,發(fā)現(xiàn)發(fā)送緩沖區(qū)內(nèi)某些數(shù)據(jù)沒有準(zhǔn)備好導(dǎo)致無法發(fā)送時(shí),則向接收方傳遞HOLD原語讓其等待進(jìn)行流量控制。
6.接收方收到HOLD原語后,進(jìn)入等待狀態(tài)并以HOLDA原語回復(fù)。
7.發(fā)送方的數(shù)據(jù)準(zhǔn)備好后,則發(fā)送HOLD原語和有效數(shù)據(jù),告之接收發(fā)繼續(xù)數(shù)據(jù)傳輸過程。
8.接收方收到HOLD 原語和有效數(shù)據(jù)后,結(jié)束等待狀態(tài),接收數(shù)據(jù)并以R_IP表示接收狀態(tài)正常。
9.發(fā)送方數(shù)據(jù)發(fā)送完畢后,進(jìn)行CRC校驗(yàn)并將校驗(yàn)和加入信息幀尾部發(fā)送出去,最后發(fā)送EOF原語表示信息幀發(fā)送完畢,最后發(fā)送 WTRM原語表示等待接收方的最終驗(yàn)證結(jié)果。
10.接收方接收整個(gè)信息幀后進(jìn)行CRC校驗(yàn),校驗(yàn)正確后,發(fā)送 R_OK 原語表示數(shù)據(jù)發(fā)送過程無誤。
11. 發(fā)送方,接收方相繼進(jìn)入空閑狀態(tài),發(fā)送SYNC原語,等待下一次數(shù)據(jù)傳輸請(qǐng)求。
數(shù)據(jù)鏈路層發(fā)送和接收幀信息以 DW 為最小傳輸單位,包括兩種類型:原語(Primitives)和幀(Frame)。原語由 1個(gè) DW 組成,用于主機(jī)和設(shè)備之間實(shí)時(shí)狀態(tài)信息、傳輸控制信息的交互,協(xié)調(diào)主機(jī)和設(shè)備的通信,保證數(shù)據(jù)正常傳輸。原語內(nèi)部 4個(gè)字節(jié)都是固定不變的,包括1個(gè)控制字符和3個(gè)數(shù)據(jù)字符,除了ALIGNP的控制字符是 28.5 之外,其余的原語都采用K28.3 作為控制字符。所以說 ALIGNP是唯一擁有 comma 特征的原語。各個(gè)原語的符號(hào)功能和字符編碼分別如表5所示。
表5 原語功能定義
表6 原語字符編碼
幀:幀由多個(gè)DWs組成,通常以SOFP作為開始,以EOFP作為結(jié)束,中間包括FIS、CRC校驗(yàn)值。CRC校驗(yàn)值是EOFP之前最后一個(gè)非原語DW。有時(shí)為了速率匹配的目的,幀中間也會(huì)插入一些原語(CONTP、HOLDP、HOLDAP)用于流量控制。一幀數(shù)據(jù)的典型結(jié)構(gòu)如圖 4所示。
圖4 典型的幀結(jié)構(gòu)
總體上看,鏈路層在物理層和傳輸層之間,承上啟下,完成8B/10B編解碼、CRC效驗(yàn)、加擾/解擾和原語控制等操作。通過以上的描述,基本上可以對(duì)SATA的鏈路層有一個(gè)清晰的認(rèn)識(shí)和理解。后續(xù)文章將繼續(xù)關(guān)注SATA的傳輸層的技術(shù)原理和細(xì)節(jié)。




