序言

C-PHY中的C表示bandwidth limited channels,即带宽受限通道。为了在带宽受限的条件下提高传输效率,C-PHY使用了一种称为“三相符号编码”的技术,通过三根线实现每个符号传输2.28bit数据。该技术是C-PHY与D-PHY的核心区别,也是C-PHY协议的核心技术。在网上查了很久都没有查到有相关文章详细介绍该技术,如是在看了三天协议后决定自己写一篇。

一、收发接口电路

首先,需要了解下C-PHY收发接口电路。其中发送端电路如下图,有两种发送电路,其中T1类型比较简单,可能用于传输速率较低的场景(在满足C-PYH相关电气规范前提下)。T2相比T1多了一组串阻100Ω的电路,主要为了确保所有场景下都能实现源端50Ω的阻抗匹配。

接收端接口电路如下,ZID正常值为100Ω(80Ω~120Ω),A、B、C三根线通过ZID/2端接到一起,然后通过一个公共的电容CCP(典型值22pf,最大90pf)到地,对于高速信号,电容相当于短路,因此在接收端,C-PHY接口的每根线也都实现了50Ω端接匹配。

二、6种线状态

C-PHY接口不需要单独的时钟信号线,而是直接从传输的数据中进行提取,而为了很好的从数据中提取时钟信息,A、B、C三根信号线上的电平最好都不一样。比如可以分为High、Middle、Low。三根线三种电平,按照排列组合,总共会有六种状态。

如下图,显示了C-PHY的六个线状态及每种线状态下的通道电流流向(红色路径)。其中左边是3种的正极性线态,从上到下分别称为x、y和z,右边是3种负极性线态,从上到下分别称为-x、-y和-z。正极性线状态具有与相应的负极性状态相同的线,但在被驱动线上的极性相反。例如:+x线状态定义为A驱动为高,B驱动为低,而-x线状态定义为B驱动为高,A驱动为低。

以+x状态为例,PU_A为1,PD_A为0,A线上发送端上面的MOS管导通,下面的MOS管截止。PU_B为0,PD_B为1,B线上发送端下面的MOS管截止,下面的MOS导通。接收端三线的端接匹配都使能。根据电阻分压原理,可以得到A的电平为3/4V,B的电平1/4V。PU_TC 和PD_TC同时为1,两个MOS全部导通,从而C上的电平为1/2V。C线的源端匹配电阻为两个100Ω并联,也就是50Ω。

为了便于数字编码,接收端内部使用差分结构,三根线两两差分,得到四种差分电平,分别为1/2V,1/4V,-1/2V,-1/4。其中1/2V,1/4V定义为数字信号”1″,-1/2V,-1/4定义为数字信号”0″。六种线状态的电平、数字信号对应关系如下表:

三、5种符号编码状态

C-PHY的编码和信息传输并不是直接通过6个线状态实现,而是通过线状态之间的转换来实现。如下图,每个线状态都有5种可能的转换态。5种状态需要用3位二进制表示,分别为000,001,010,011,100。比如+x转换到+y,表示传输的符号信息为010,从+y转换到-z,传输的符号信息为011。

四、端到端数据传输示意图

C-PHY的HS模式下,数据传输最小单元为16bit,传输的数据必须是16bit的整数倍。16bit数据需要至少7个5进制符号进行传输。5^7 = 78,125。2^16=65,536。16/7=2.28,这也就是三根线实现每个符号传输2.28bit数据来源。

如下图,发送端发送的16bit数据,映射到7个符号,每个符号3bit,总共21bits。21个bit通过并串转换,依次传输到编码和驱动模块。使 A\B\C线状态发生7次变化。接收端通过解码、串并转换、去映射最终转换成16bit数据。

五、映射与去映射

映射电路示意图如下,16bit数据转换成7组符号,每个符号3bit,每个bit位都代表一种线状态变化参数,从高位到低位依次为:翻转(flip)、旋转(rotate)和反极性(polarity)。即Sn=(Tx_flip[n]、Tx_rotate[n]、Tx_polarity[n]),n=0、1、2、3、4、5、6。

16bit数据与7个符号的映射&去映射关系如下表,7个符号中的7个翻转位将16bit数据(65,536)分成28个不同的区域,如下图的最左边,其中7个区域包含4096个值,20个区域包含1024个值,1个区域包含16384个值。

例如,要传输的16bit数据为0x3fff,对应二进制为(0011,1111,1111,1111),根据上图映射关系,可以得到Flip(6:0)=(000,0000),(ro6,po6,ro5,po5,ro4,po4,ro3,po3,ro2,po2,ro1,po1,ro0,po0)=(111,1111,1111),由此可以得到7个符号分别为,S0=(0,1,1),S1=(0,1,1),S2=(0,1,1),S3=(0,1,1),S4=(0,1,1),S5=(0,1,1),S6=(0,1,1)。

同理,在接收端,由7个符号位可以根据Figure19 去映射为16bit数据。、

六、编码&解码

前文已经讲过,每个符号3bit,每个bit位都代表一种线状态变化参数,从高位到低位依次为:翻转(flip)、旋转(rotate)和反极性(polarity)。其中:

反极性(polarity):"1"表示线状态在前一个状态基础上发生反极性变化,比如+x-->-x,+y-->-y,+z-->-z。"0"表示极性不发生变化。

旋转(rotate):"1"表示顺时针旋转,+x-->+y-->+z-->+x,"0"表示逆时针旋转+x-->+z-->+y-->+x。

翻转(flip):"1"表示,极性发生变化,但是不发生旋转,且忽略旋转位与反极性位的作用。"0"表示不发生变化。

根据上述定义,符号编码算法如下表4所示,定义了将3位符号值转换为线路上的一个线状态(基于上一个UI传输的线状态)。

例如:输入的3位符号值为011,对应参数定义(无flip,顺时针旋转,极性反转),前一个线状态为+y,则下一个线状态为-z。

传输编器和驱动器电路如下图所示:

上图中的代表前一个状态和当前状态的3位二进制数据,只是为了理解方便,并不一定是实际存在的电路,实际的电路可能使用6位预驱动器值[PU_A,PD_A,PU_B,PD_B,PU_C,PD_C]来定义当前的线状态值,如下表所示:

例如:输入的3位符号值为011,前一个线状态为+y,则[PU_A,PD_A,PU_B,PD_B,PU_C,PD_C]由[0,0,1,0,0,1]变为[1,0,0,0,0,1]。

符号解码电路如下图:

符号解码算法表如下:因为相同状态之间的转换无法检测,是一种无效状态转换,因此下表中用了“n/a”表示。符号解码根据从先前状态(间隔N-1)到当前线状态(间隔N)的转换来确定。例如:先前的状态为+y,当前的线状态为+z,则接收器输出的符号为“010”。

七、端到端传输举例

如需要传输的16bit数据为0x3fff,根据第五节中映射原理,得到7个符号分别为,S0=(0,1,1),S1=(0,1,1),S2=(0,1,1),S3=(0,1,1),S4=(0,1,1),S5=(0,1,1),S6=(0,1,1)。经过并串转换后,变为七组符号传输,传输顺序为S0、S1、S2、S3、S4、S5、S6。假设上一个状态为+y,根据编码算法表可知,线上传输的状态依次为:-z,+x,-y,+z,-x,+y,-z。

接收端,根据解码、串并转换及去映射规则,最终可以得到传输的16bit数据0x3fff。

实际测试波形如下图,图片来源:http://www.360doc.com/content/22/1123/20/67063969_1057263605.shtml

总结

“三相符号编码”的技术,通过三根线实现每个符号传输2.28bit数据。该技术是C-PHY与D-PHY的核心区别,也是C-PHY协议的核心技术。本文详细介绍了与“三相符号编码“技术( 3-Phase symbol encoding technology)相关的内容,如发送&接收接口电路、映射&去映射电路及规则、编码&解码电路及算法规则、以及端到端的传输过程。

参考文档:mipi_C-PHY_specification_v1-2