PCIe总线必须要先完成Flow Control初始化

在任何事务层包(tlp)发送之前,pcie总线必须要先完成flow control初始化。当物理层完成链路初始化后,便会将linkup信号变为有效,告知数据链路层可以开始flow control初始化了。
如下图所示:
注:由于vc0是默认使能的,所以当flow control初始化开始时,其会被自动的初始化。其他的virtual channel是可选的,只有当被配置为使能的时候才会被初始化。
flow control初始化被分为两个步骤,fc_init1和fc_init2,其在整个数据链路控制和管理状态机(data link control & management state machine)的位置如下图所示:
在fc_init1步骤中,pcie设备会连续地发送三个initfc1类型的flow control dllp来报告其接收buffer 的大小。三个dllp的顺序是固定的:posted、non-posted然后是completions。如下图所示:
fc_init2与fc-init1类似,同样是连续的发送三个initfc2类型的dllp,当完成后,dlcmsm(上一篇文章中提到的状态机)会切换到dl_active状态,表明数据链路层初始化完成。
注:可能有人会有疑惑了,fc_init1和fc_init2干的活不是差不多嘛,为什么还需要fc_init2呢?原因是,不同的设备完成fc_init1的时间可能是不同的,增加fc_init2是为了保证每个设备都能收到fc初始化dllp。
fc_init dllp的格式如下图所示:
在完成fc初始化之后,相邻的两个设备之间会周期性的通过updated fc dllp更新接收buffer的大小。如下图所示:
update fc dllp的格式与fc_init的格式是类似的,具体如下:
前面说到。update fc dllp是周期性发送的,周期的值可以通过以下公式计算得:
具体可以参考pcie的spec,这里不再详细介绍,下面给出gen1和gen2的周期表格(根据公式计算的结果)。其中af为ackfactor。
注:mindshare的书中,为了便于理解,把ackfactor一词修改为updatefactor,实际上指的是同一个东西。
gen1 (2.5gt/s)如下表所示:
gen2(5gt/s)如下表所示:

正确认识差分晶振与普通晶振的区别
快充、安全、智能,一次解决!这对“黄金搭档”真有这么牛?
AI智能引领便利生活,家电也应有“大智慧”
更高配!e络盟上新Raspberry Pi计算机8GB RAM版
通用电源管理芯片LTC3675
PCIe总线必须要先完成Flow Control初始化
中国电信户均移动互联网接入流量达11.3GB,再创历史新高
AI图像技术不断升级,对于数据隐私安全的保护也需同步跟进
IGBT是电动汽车及充电等设备的核心技术部件
基于SG3525和DC/DC变换器的大电流低电压开关电源设计
新型pSemi Sub-6 GHz射频开关,支持在5G大规模MIMO基站中创建混合波束成形架构
用硬卡纸打造F1赛车
传感器基础教程知识
仿脑科技飞龙芯超越了现时主流的框架和思路
电网互联的作用和意义_电网互联的优点缺点
分析定时开关和时间继电器,二者之间有什么区别
蒸汽冷凝水回收装置安装注意事项
ADI公司设计工具:ADIsimRF第1部分
线程、进程、多线程、多进程和多任务之间有何关系?
Silicon Labs电源隔离系列在线研讨会 1月的两场预告