在任何事務(wù)層包(TLP)發(fā)送之前,PCIe總線必須要先完成Flow Control初始化。當(dāng)物理層完成鏈路初始化后,便會(huì)將LinkUp信號(hào)變?yōu)橛行?,告知?shù)據(jù)鏈路層可以開始Flow Control初始化了。
如下圖所示:
注:由于VC0是默認(rèn)使能的,所以當(dāng)Flow Control初始化開始時(shí),其會(huì)被自動(dòng)的初始化。其他的Virtual Channel是可選的,只有當(dāng)被配置為使能的時(shí)候才會(huì)被初始化。
Flow Control初始化被分為兩個(gè)步驟,F(xiàn)C_Init1和FC_Init2,其在整個(gè)數(shù)據(jù)鏈路控制和管理狀態(tài)機(jī)(Data Link Control & Management State Machine)的位置如下圖所示:
在FC_Init1步驟中,PCIe設(shè)備會(huì)連續(xù)地發(fā)送三個(gè)InitFC1類型的Flow Control DLLP來(lái)報(bào)告其接收Buffer 的大小。三個(gè)DLLP的順序是固定的:Posted、Non-Posted然后是Completions。如下圖所示:
FC_Init2與FC-Init1類似,同樣是連續(xù)的發(fā)送三個(gè)InitFC2類型的DLLP,當(dāng)完成后,DLCMSM(上一篇文章中提到的狀態(tài)機(jī))會(huì)切換到DL_Active狀態(tài),表明數(shù)據(jù)鏈路層初始化完成。
注:可能有人會(huì)有疑惑了,F(xiàn)C_Init1和FC_Init2干的活不是差不多嘛,為什么還需要FC_Init2呢?原因是,不同的設(shè)備完成FC_Init1的時(shí)間可能是不同的,增加FC_Init2是為了保證每個(gè)設(shè)備都能收到FC初始化DLLP。
FC_Init DLLP的格式如下圖所示:
在完成FC初始化之后,相鄰的兩個(gè)設(shè)備之間會(huì)周期性的通過Updated FC DLLP更新接收Buffer的大小。如下圖所示:
Update FC DLLP的格式與FC_Init的格式是類似的,具體如下:
前面說(shuō)到。Update FC DLLP是周期性發(fā)送的,周期的值可以通過以下公式計(jì)算得:
具體可以參考PCIe的Spec,這里不再詳細(xì)介紹,下面給出Gen1和Gen2的周期表格(根據(jù)公式計(jì)算的結(jié)果)。其中AF為AckFactor。
注:Mindshare的書中,為了便于理解,把AckFactor一詞修改為UpdateFactor,實(shí)際上指的是同一個(gè)東西。
Gen1 (2.5GT/s)如下表所示:
Gen2(5GT/s)如下表所示:
-
總線
+關(guān)注
關(guān)注
10文章
2947瀏覽量
89331 -
PCIe
+關(guān)注
關(guān)注
16文章
1322瀏覽量
84656 -
數(shù)據(jù)鏈路層
+關(guān)注
關(guān)注
0文章
61瀏覽量
12150
原文標(biāo)題:【博文連載】PCIe掃盲——Flow Control基礎(chǔ)(二)
文章出處:【微信號(hào):ChinaAET,微信公眾號(hào):電子技術(shù)應(yīng)用ChinaAET】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
RT-Thread自動(dòng)初始化詳解

手機(jī)模塊初始化向?qū)?/a>
FPGA的ROM初始化問題討論

8253初始化程序分享_8253應(yīng)用案例

Flow Control機(jī)制可以顯著地提高總線的傳輸效率

PCIe總線中的鏈路初始化與訓(xùn)練

IIC總線初始化基本驅(qū)動(dòng)參考程序應(yīng)用代碼免費(fèi)下載

在51平臺(tái)下初始化文件的引入導(dǎo)致全局變量無(wú)法初始化的問題如何解決

評(píng)論