[HPM电路设计]HPM6ExY网络断联分析
HPM6ExY网络断联分析
引言
HPM6ExY是先楫半导体最新推出HPM6E00系列的一款MCU,再保持了HPM6E00系列的功能的同时,内部合封了Flash和2个MII的PHY。针对EtherCAT的使用场合下,可以帮助客户进一步的减小PCB的布板空间,为更紧凑的产品,提供了实现的可能。
网络断联的现象
HPM6ExY在使用过程中,会出现随机的EtherCAT的断联现象。例如,当多台设备通过网线连接实现EtherCAT功能时,长期运行下会随机的出现某一台机器发生断联现象,从而导致整个EtherCAT的报错。再进一步的分析后发现,问题发生的时间,设备都是很随机的,完全没有规律可言。特别是在低温的时候,往往更能复现问题。
结论
芯片内部合封的2颗MII phy的电源和VioBank1连在一起(相关引脚名称为Vio_Bank1),如果对该组引脚的瞬态供电无法满足phy的负载需求,就会影响phy的工作,对网络连接产生误判,进而产生link lost的信号。
解决方式
电源拓扑采用下图所示,即有一路单独的DCDC生成的电源对VioBank供电。
上述的电源机构,使得VioBank和系统其他的电源完全解耦,杜绝了外部的干扰对phy瞬时供电的影响。从根本上杜绝了此类问题的发生。需要指出的是,上述的图例只是标明相关的拓扑结构,必要的分立器件没有特别标明,用户需要按照相关的手册进行设计。
改善方式
限于成本,空间或者开发阶段的影响,上述的解决方式无法实现。用户可以从以下几个方面着手,改善问题的发生的几率。无论用户使用哪种电源的拓扑结构,核心的思想就是减小A点(上图)上的的波动。
下图是比较典型的拓扑结构
DCDC的工作模式
目前市面上的DCDC普遍支持模式切换用以增强低功耗下的电源效率。DCDC本身会根据负载的功耗自动在CCM和DCM中切换。在CCM模式下,DCDC的发出的PWM占空比稳定且连续,而DCM模式下,DCDC的PWM会间歇性的生成PWM波形。可以这样理解,对于一个固定的电压,CCM是在其附近小范围的波动,而DCM则是大范围的波动。以上图为例,芯片内部的DCDC_IN在DCM模式下,尽管会提升电源轻载时的效率,但是对其输入点A点造成较大的冲击,A点就会产生较大的波动。因此,我们需要尽可能的将DCDC运行在CCM模式
-
通过更改DCDC的外部的电感的感值,使得其更大几率的工作在CCM模式下。电感计算的方式可以参见文章尾部的分析
-
通过增加负载的功耗,减小DCDC进入DCM模式的几率
-
通过修改软件配置,使DCDC只工作在CCM模式下。注:此修改只针对使用HPM6ExY内部DCDC的情况,修改方式见文章尾部
-
选择强制CCM模式的DCDC
上述的几种方式,只能减小对A点冲击的大小和几率,无法做到完全避免发生。因为在使用过程中,无论是电压,还是电流,都是一个均值数据,无法标定瞬态的数值。
增加器件减小波动
- 对于DCDC因为模式切换导致的输入测(A点)波动,可以增加磁珠用以抑制干扰。即在A点和DCDC_IN之间增加磁珠
- 同时在A点和VioBank之间电容,增加低ESR的电容,选择低ESR电容,主要的目的是应对低温时,容值减小的幅度不要过大
PCB的优化
- 增加的磁珠要接近DCDC_IN,这样其生成的干扰会尽快的得到抑制,A点到VioBank的电容,和VioBank引脚越近越好。
- 除了位置摆放,走线同样重要。对于HPM6ExY来讲,本身VioBank引脚和DCDC_IN引脚距离很近,而且中间又有很多需要扇出的引脚,这就造成了第一条中的摆放位置的建议收到了限制。如果在走线的过程中,对于电源采用了铺铜等方式,那么DCDC_IN产生的噪声会首先耦合到VioBank中,而远端的电容看似很多,但是没有起到真实的效果。一个好的布线的处理是,将DCDC_IN先经过磁珠后,绕道远端的A点,再从A点经过沿途的电容后,输入到VioBank上。
注:上述的几条建议,都是在现有的条件下的改进。因此需要用户进行更多的场景测试。
断联现象的成因分析
前面我们罗列了问题的现象,成因以及解决方法。这个章节,我们会根据不同的电源拓扑结构的实例进行问题分析。
典型拓扑1
这个拓扑是最为典型的应用。外部的电源通过DCDC生成3V3,分别供给DCDC_IN和VioBank,有一种基于这一拓扑的衍生结构,如下图
这个结构只是通过一个外部的DCDC生成1V2的电源给VDD_SOC供电。整体上,这两种电源的结构的问题可以等同。
这种供电结构几乎是所有HPM6E00系列的供电方式,为什么所有非合封的芯片没有出现断联的情况呢?核心原因就是距离。这个距离包括2个方面
- 为核心供电的3V3的输入点和为外置phy供电的3V3的物理距离
- 旁路电容和phy的电源引脚之间的物理距离
在非合封的应用场合,DCDC_IN的输入点和phy的电源的输入点,由于芯片摆放的原因,很自然的相距比较远,在加上DCDC_IN上的电容,phy电源旁边的旁路,去耦电容,使得真正汇入到phy的3V3的电压波动得到了极大的抑制,同时,另一个phy由于经历了不同的传输路径和电容,使得2个phy本身的电源的耦合性减少。因此,系统得以稳定的运行。
而对于合封的芯片,由于追求了小尺寸,集成性,导致了上述的设计条件发生了重大的变化。DCDC_IN和phy的3V3的引脚被合并到了一个芯片之内,而且,因为引脚数量的限制,所有phy的电源引脚都被内部连接在了一起,而且没有旁路电容。此外,内部实际是有2个phy的电源连在一起的。综上所述,这几个条件的叠加,使得phy本身的供电条件恶化。
这是一个基于上述拓扑的PCB布线,可以看到左下的DCDC_IN直接绕到了上面的VioBank,尽管沿途有一些电容,但是DCDC_IN的巨大的波动无法通过走线进行抑制,在某些特殊的时刻,例如2个phy在某种功能时会出现对源端进一步的抽电。如果DCDC_IN和phy同时抽电,那么在这一瞬间,外部的3V3会出现电压陷落,使得phy会出现断联的误判。
上图中,B点是3V3的源端,A点是DCDC_IN,C点是VioBank的输入端,那么在这个布局下,A点产生的扰动会绕一个很大的圈到C点,途径的电容,B点,都会对波动产生抑制,在这种布局下,芯片断联的现象消失了。
在现实的应用中,选择合封芯片的目的就是因为空间受限,所以需要设计者人为的增加2点之间的距离,同时使得添加的电容能够发挥真的效果。即先经过电容,再连到相关引脚上。
典型拓扑2
这也是一个比较典型的应用。用户外部有一个电源,一般为5V左右的低压。经过一个LDO生成3V3供给VioBank,另一路经过DCDC生成1V2为VDD_SOC供电。从常规的设计来讲,这是一个很不错的设计。但是,这种情况依然会出现断联的问题。
核心的原因是LDO的瞬态的供电的能力不如DCDC。从器件本身的特点讲,LDO是一个线性的输出,它的输出端通过相应的电容来稳定。而对于DCDC来讲,它的输出部分是一个LC的电路,其中电感是一个储能元件,因此,当某种应用场合下,如果负载瞬时增大,那么DCDC可以依靠其储能的电感来抑制这一瞬态的变化。而LDO则不行,电流的增大会线性的影响内部的分压,导致输出进一步降低。因此我们建议在LDO到VioBank的通路之间,增加低ESR的电容,用来抑制瞬时电流下,电压的波动。
附录
CCM代码配置
如果客户使用的是芯片内部集成的DCDC供电,可以通过以下代码将DCDC配置成CCM模式,这样的配置,会使DCDC通过固定的PWM频率输出,对A点的波动影响减小。
void pcfg_dcdc_switch_to_dcm_mode(PCFG_Type *ptr)
{
const uint8_t pcfc_dcdc_min_duty_cycle[] = {
0x6E, 0x6E, 0x70, 0x70, 0x70, 0x70, 0x72, 0x72,
0x72, 0x72, 0x74, 0x74, 0x74, 0x74, 0x76, 0x76,
0x76, 0x78, 0x78, 0x78, 0x78, 0x7A, 0x7A, 0x7A,
0x7A, 0x7C, 0x7C, 0x7C, 0x7E, 0x7E, 0x7E, 0x7E
};
uint16_t voltage;
ptr->DCDC_MODE |= 0x77000u;
ptr->DCDC_ADVMODE = (ptr->DCDC_ADVMODE & ~0x73F0067u) | 0x4120067u;
ptr->DCDC_PROT &= ~PCFG_DCDC_PROT_SHORT_CURRENT_MASK;
ptr->DCDC_PROT |= PCFG_DCDC_PROT_DISABLE_SHORT_MASK;
ptr->DCDC_MISC = 0x100000u;
voltage = PCFG_DCDC_MODE_VOLT_GET(ptr->DCDC_MODE);
voltage = (voltage - 600) / 25;
ptr->DCDC_ADVPARAM = (ptr->DCDC_ADVPARAM & ~PCFG_DCDC_ADVPARAM_MIN_DUT_MASK) | PCFG_DCDC_ADVPARAM_MIN_DUT_SET(pcfc_dcdc_min_duty_cycle[voltage]);
while (!pcfg_dcdc_is_stable(ptr)) {
NOP();
}
}
void pcfg_dcdc_switch_to_ccm_mode(PCFG_Type *ptr)
{
/* Attention: Need first switch to dcm */
pcfg_dcdc_switch_to_dcm_mode(ptr);
ptr->DCDC_MODE = (ptr->DCDC_MODE & ~0x70000u) | 0x10000u;
ptr->DCDC_ADVPARAM = (ptr->DCDC_ADVPARAM & ~PCFG_DCDC_ADVPARAM_MIN_DUT_MASK) | PCFG_DCDC_ADVPARAM_MIN_DUT_SET(0x6A);
while (!pcfg_dcdc_is_stable(ptr)) {
NOP();
}
}
上述的2个函数,在sdk_v1.12.0版本之后,可以直接调用,需添加相应的头文件
#include "hpm_pcfg_drv.h"
用户可以在系统初始化的时候,将上述2个函数添加其中,比如在board.c中
...
/* Bump up DCDC voltage to 1250mv */
pcfg_dcdc_set_voltage(HPM_PCFG, 1250);
pcfg_dcdc_switch_to_ccm_mode(HPM_PCFG);
board_delay_ms(100);
...
上述代码,在sdk_v1.12.0中已经包括,用户直接调用即可。
DCDC的工作模式区别
在文章的开篇,我们提到了一个关于DCDC的CCM和DCM的工作模式。目前市面上常见的DCDC基本是包括了这两种模式,并由DCDC本身和外部的电感来共同决定DCDC的具体的工作模式。因此说,绝大多数的DCDC的模式是不受软件控制的。
可以这么理解这2种模式的区别,对于电流来讲,我们测量的其实是一段时间的均值,在这个值固定的前提下,CCM的方差要小于DCM的方差。就是说CCM的工作会更均匀。
在上图显示的是电感电流,在一个DCDC的开关周期内T_{sw},会有相应峰值电流Ipeak和谷值电流I_{load},两者对应的就是负载I_{load}的纹波电流I_{ripple}对于不同的DCDC,其进入DCM模式的判定标准是不一样的
-
峰值模式
DCDC本身有一个门限峰值,这部分会在规格书中体现。比如说300mA。当
I_{peak}的电流小于300mA的时候,DCDC就会开始工作在DCM模式。 -
谷值模式
DCDC本身以0mA作为判定标准,当
I_{valley}的电流小于0mA的时候,就会进入DCM模式
用户需要根据自身选择的DCDC,明确进入DCM模式的方式。
从上图可以看出,无论是哪一种方式进入DCM,有2个参数是最重要的,一个是系统的电流I_{load},另一个则是纹波电流I_{ripple}。无论哪种模式进入DCM,提升I_{load},都可以变相的减小其进入DCM的模式。这也就是为什么在低温的情况下,往往容易出现问题的部分原因,因为整体的功耗下降了,使得DCDC进入DCM的几率更大了。
对于另一个因素I_{ripple},根据其公式
I_{ripple} = \frac{(V_{in} - V_{out}) * V_{out}}{V_{in} * L * F_{sw}}
F_{sw}为DCDC的开关频率,选定DCDC后,这是一个固定值。因此,从这个公式中,能决定I_{ripple}的实际上只有电感的感值。结合上面提到的DCDC进入DCM的模式的不同,需要用户选择是增大I_{ripple}还是减少I_{ripple}。
结语
HPM6ExY是一款高集成度的,适配小尺寸空间的EtherCAT的应用的芯片。因此,这其中对电源的设计有一定的要求。用户需要结合自身的应用场景,尺寸,成本等其他因素,综合考虑。