SPI4.2总线的原理是什么?怎样进行调试?

引言 spi4.2总线(system packet interface,系统间数据包接口)是一种速度高达10 gb/s的芯片间互连总线,主要应用于atm信元传输、pos(packet over sonet/sdh,基于sonet/sdh的包传输)和10 gb/s以太网等高端场合。特别在通信领域,很多高端处理器和网络处理器,如intel公司的ixp2800、cavium公司的多内核处理器cn58xx系列、netlogic公司的xlr732、broadcom的bcm1480,几乎都集成了spi4.2接口,以提高芯片的吞吐能力,适应通信产业朝着lte(长期演进)发展的需求。还有众多的物理层芯片,例如cortina公司的cs1331,可以将spi4.2总线转换成8个千兆以太网接口。spi4.2总线之所以被众多的高端芯片所采用,与其高速、灵活、可靠的特性是密不可分的。
1 spi4.2总线基本原理 spi4.2总线是一种芯片间的互连总线,连接芯片的链路层和物理层模块。其工作时钟是源同步双边沿触发时钟,至少为311 mhz。图1是使用spi4.2总线连接两个芯片的示意图。可见,spi4.2总线的信号在发送和接收方向完全对称而又互相独立,数据链路和状态链路分开,并且其时钟也是完全分开的。因此,该总线不仅适合于双向通道,而且适合于只收不发或者只发不收的单向通道。
图1 spi4.2连接示意图
spi4.2总线具有以下特点:
① 点对点互连,收发数据链路宽度为16位。
② 发送和接收模块的信号各分为两组,即数据信号和状态信号,分别对应数据链路和状态链路,每个链路具有自己的时钟。数据链路发送和接收数据,状态链路传输相应链路的状态信息。
③ 数据链路包含dclk、dat[15:0]和ctl三种lvds(低压差分传输)信号。前面加“t”表示信号属于发送模块,加“r”表示信号属于接收模块。以发送模块为例,tdclk是双边沿触发时钟,tctl是控制信号,tdat[15:0]承载了数据和控制信息。当tctl为高电平时,tdat[15:0]传送的是数据包;当tctl为低电平时,tdat[15:0]传送的是控制包。数据采用dip4校验交织码。
④ 状态链路包括sclk时钟信号和stat[1:0]状态信号,信号类型是lvttl或lvds。spi4.2 发送时序如图2所示。如果选择lvttl,则sclk时钟频率是数据链路时钟速率的1/4。如果选择lvds,则sclk时钟频率和数据链路时钟频率相同。下文中均以lvds为例进行阐述。状态链路主要用于流控。
⑤ 接收和发送模块都含有一个fifo队列,用于缓存数据,队列长度由芯片设计而定。队列的状态信息通过状态链路周期性地发送,接收模块和发送模块的状态信息是独立的。状态信息附加了dip2交织校验码,以提高传输可靠性。
图2 spi4.2 发送时序
除了数据包中最后一段不满16字节的数据(eop)之外,spi4.2总线的数据实行突发传输,以16字节为单位(称为一个数据块),每次传输多个数据块。因为数据宽度是16位,所以一次突发传输至少需要4个时钟周期。数据的高地址位字节先发送(msb),低地址位字节后发送,数据块传输过程中不会被中断。每次突发传输的间隔期间传送控制包或者训练序列。图2中,tdat表示数据块,tctrl表示控制块。控制包长度为16位,包含了前次传输和下次传输的状态信息:包开始标志、包结束标志、逻辑端口地址和dip4交织校验码等。数据链路遵循有限状态机进行工作,状态包括5种:控制包传输、数据包传输、空闲包传输、训练序列传输以及训练序列控制[1]。
因为状态链路的宽度是2位,所以每次突发传输至少传输16位数据(4个时钟周期)。反映fifo队列的状态信息有3种:饱(satisfied)、饿(hungry)、极饿(starving),分别对应二进制数字10、01和00。11表示链路处于失步状态,正在同步过程中。当状态是“饱”时,说明队列几乎满了,只接收当前正在传送的数据包,其他数据包只有等状态更新后才能接收。当状态是“饿”时,可以接收最大maxburst2个数据块。当状态是“极饿”时,说明队列几乎空了,可以接收最大maxburst1个数据块。maxburst1和maxburst2是spi4.2总线初始化时设定的参数,maxburst1不得小于maxburst2。
2 spi4.2总线的初始化和同步 spi4.2总线初始化时必须设定一些基本参数,如表1所列。
spi4.2总线协议定义了一个叫“日历”的数据结构calendar[i](i=1,…,calendar_len)。calendar_len(日历长度)参数规定了逻辑端口(或称为虚拟通道)的数目,该数值不能小于实际的逻辑端口数目。例如,如果spi4.2总线用于10 gb/s以太网口,那么日历长度是1(即calendar_len = 1);如果spi4.2总线用于10个1 gb/s以太网口,那么日历长度是10(calendar_len = 10),calendar[i] = 1,2,…,10,代表了10个以太网端口。calendar[i]中承载的数据被周而复始地依次传输,重复次数是calendar_m次。图3为日历长度和重复次数都是4的数据传输示意图。spi4.2总线被初始化时,必须确保接口两端的calendar_len和calendar_m分别相等。从这个角度看,spi4.2是一种时分复用的总线:总带宽是固定的,“日历”数据结构决定了带宽和逻辑端口的分配。
当spi4.2正常工作时,数据和状态链路会不定期地发送训练序列。在数据链路,训练序列至少应该在data_max_t个时钟周期内发送一次。在状态链路,训练序列至少应该在fifo_max_t个时钟周期内发送一次。设置data_max_t或fifo_max_t为0将取消各自链路的训练序列,一般情况下不推荐这种设置。
图4以xlr732为参照描述了spi4.2总线的收发同步过程。启动之后,在发送方向,发送模块(tx)通过数据链路发送连续的训练序列,对端的接收模块成功收到训练序列后,会设置本端的接收同步标志;然后通过状态链路发送训练序列给对端,一旦发送模块成功接收到训练序列后,就设置本端的发送同步标志。
在接收方,接收模块(rx)在数据链路成功接收到对端发送的训练序列后,会设置本端的接收同步标志;然后通过状态链路发送训练序列,一旦发送模块成功接收到训练序列后,就设置本端的发送同步标志。在同步过程中,训练序列由指定的连续的dip4码字组成。发送模块必须连续发送训练序列,直到本端的状态链路收到有效信息。同时,接收模块忽视所有接收到的数据,直到观察到训练序列,获得数据同步。一旦数据链路同步之后, fifo队列状态信息就开始传送。
如果发送方接收到有效的状态信息,它就可以开始进行数据突发传输。如果在工作过程中,由于某些原因(例如一端器件掉电或重启)导致总线失步,那么为了再次获得同步,双方需要按照上述过程发送连续的训练序列,直到建立同步为止。
表1 spi4.2初始化基本参数
图3 日历长度和重复次数都为4的数据传输示意图
图4 收发同步过程示意图
3 spi4.2总线接口的调试 spi4.2总线接口的调试包括两个重要步骤:链路的同步和数据的正常收发。
在调试链路同步时,首先必须查看总线两端的初始化参数配置。因为spi4.2 总线协议是一个对等端数据传输协议,所以大部分参数需要双方的匹配和协商,特别是接收方和发送方的calendar_len和calendar_m参数。
如何查看同步呢?芯片通常会提供一个状态寄存器来反映总线的同步。“接收同步标志”只能说明在数据链路上成功接收到对端的训练序列,但不能保证接收的状态链路是正常的,如果需要确认可查看对端的“发送同步标志”。在收发双向通道应用中,只有两端的“接收同步标志”和“发送同步标志”都置位了,总线才算同步。此时,可以确认总线两端的物理连接是正确的,握手成功。
如果不能同步,就必须检查两端的“接收同步标志”和“发送同步标志”,判断是哪一端出了问题。检查是否有dip4和dip2错误,如果有此类错误,说明链路上信号质量可能不佳,可以用示波器测量信号波形。如果信号质量确实不好,可以通过提高信号驱动能力或者调整硬件匹配阻抗来优化。
如果两端的接收和发送都没有同步,就必须测量芯片的电压、工作频率、重启等信号。如果两端的“接收同步标志”和“发送同步标志”都已经置位,说明双方的接收和发送都同步,可以正常收发数据了。在大流量数据传输过程中,最相关的是fifo队列的参数配置,配置不当会导致错包或丢包。以netlogic公司的xlr732网络处理器为例[2],spi4.2总线的发送模块的所有逻辑端口共享一个fifo队列,宽度为16字节,长度为128;接收模块的所有逻辑端口共享一个fifo队列,宽度为16字节,长度为512。每个逻辑端口所占用的队列地址和大小都可以通过寄存器配置。
假如某个端口接收端队列的长度是48,maxburst1是12,maxburst2是8。那么当该模块接收数据时,如果由于某些原因(例如软件来不及处理),接收队列只剩下12个空位,也就是接收队列已经有48-12=36个空位被占用时,它将通过状态链路向对端发送“饿”的状态信号(反压信号)。对端收到该信号后实施流控策略,根据本端发送端的maxburst1设置值发送数据,该值表示接收到“饿”状态信号后最多还可以发送的数据块数目。所以接收端的maxburst1 的值一定要大于对端发送端的maxburst1,并且要留出一定的余量,因为数据在链路上的传输也是需要时间的。同理,接收端的maxburst2要大于对端发送端的maxburst2。值得注意的是,流控是基于逻辑端口的,而不是整条链路。
为保证不发生接收端fifo队列溢出等问题,尽量将接收端的maxburst1和maxburst2设置大一些, 只要小于fifo入口总数就可以,而发送端maxburst1和maxburst2的 设置不要超过本端接收能力。
如果出现eop(结束包)和sop(起始包)错误或缺失,或者其他错包(例如包长变短、帧校验错误等),但没有dip4 错误,该怎么办?这类问题一般出现在fifo队列设置上,尤其是接收端的fifo队列可能溢出,从而丢失了某些数据块,可以通过以下3种方法来检测和解决:
① 通过查看接收端fifo溢出标志来判断fifo队列是否溢出;
② 通过调整接收端的maxburst1和maxburst2来防止fifo队列溢出;
③ 如果方法②的调整足够大,还有此问题,可以查看对端是否收到反压信号,以及对端的状态等。
为了方便,通常将发送端的maxburst1和maxburst2设置为相同数值,将接收端的maxburst1和maxburst2也设置成相同数值。
结语 随着处理器的速度越来越快,处理器集成的内核越来越多,处理器与外围器件之间,处理器之间,以及外围器件之间的连接速度逐渐成为制约平台性能的瓶颈。许多芯片同时集成了多个总线接口,例如xlr732同时拥有spi4.2、ht、以太网3种总线接口。spi4.2总线在与其他总线的竞争中体现出了强大的生命力,希望本文所介绍的经验对正在应用或计划应用spi4.2总线的同行有所帮助。

网络分析仪维修有那几点问题-安泰网分维修
端子箱导轨式多回路智能型温湿度控制器
雷曼光电称控股股东李跃宗质押463万股
可靠的逻辑高电平I/O电路
各个方向稳定飞行的机器人蜜蜂创建
SPI4.2总线的原理是什么?怎样进行调试?
小米Note10黑色包装盒曝光 Note系列或重新复活
三星Exynos“自供”模式有苦衷?三星AP芯片蓄势待发
环保数采仪
基于区块链技术框架的Substrate智能合约平台解析
iPhone11内部拆解示意图公布 采用双层主板拆解维修难度较高
搭建C语言开发环境(Windows平台)汇总
Autopilot究竟存在哪些技术局限性
德州仪器推出完整RF开发套件
华为麒麟9000s超线程手机芯片是真的 超线程和不超线程区别大吗
霍尔传感器—振幅测量
0-10v输出电路驱动能力的计算方法
耐火电缆和矿物绝缘电缆的区别是什么
中芯国际迎来复旦大学教授刘明
小米生态链企业华米增收不增利