转载请注明出处:https://www.eefocus.com/constyu/blog
1. 前言
I.MXRT1060处理器是NXP基于Cortex-M7内核跨界处理器中的一员,内部配备1MB 片内RAM,同时也支持通过SEMC并行总线用于外扩SDRAM,速度最高支持到166M。但在实际应用中,由于器件布局,走线设计,阻抗匹配以及layout等原因,个别客户反馈SDRAM电路产生的EMI导致系统无法通过合规性测试。
通常用于改善和解决EMI辐射排放的方法,包括屏蔽、去耦、滤波、串联电阻减少过冲、磁珠吸能、信号边沿控制以及在良好PCB布局的基础上使用附加电源层和地面等。其中屏蔽是相对简单的方法,不适用于手持和便携式设备。电容滤波和信号边沿控制对于低频信号有效,不适合高速信号。使用EMI/RFI滤波器等被动元器件,会增加成本。而通过Layout技巧降低EMI显然比较费时,需考虑重新布板贴片的成本。那能否通过软件的办法可以改善SDRAM系统的EMI呢?答案是肯定的,RT系列支持SDRAM时钟扩频spread spectrum功能,通过实际测试发现,RT的时钟扩频特性,可以很大程度改善SDRAM电路的EMI性能。
2. 扩频的原理和控制参数
​扩展频谱是将信号进行频率调制,把信号能量扩展到一个比较宽的频率范围上,从而达到降低系统电磁辐射峰值的目的。该方法通过时钟内部集成电路调制频率的手段来达到抑制EMI峰值的目的,所以需要半导体器件本身的支持, 而且区别于被动的EMI抑制器件,使能扩展频谱会带来额外的能量消耗。
​时钟展频有三个主要的控制参数:调制速度、调制深度和调制方式。
2.1. 调制速度(Modulation Rate)
调制速度是指输出时钟频率 fo 在设定的调制频率范围内的变化速度。调制速度应远小于源时钟的频率 fc 以免引起时序问题(建立/保持时间等), 同时应当高于人耳可识别的声音的频率范围(20Hz~20KHz)以免产生噪音。在实际应用中,调制速度一般选择30KHz~120KHz。
2.2. 调制深度(Modulation Depth)
​调制深度是指展频后输出时钟频率 fo 以调制速度MR偏移源时钟频率 fc 的大小。调制深度以偏移(Δf)源时钟频率的百分比(%)来表示。调制深度决定降低EMI峰值的大小。通常调制深度越大,EMI峰值越低。在应用时,需要合理预计系统可接受的频率调制范围。下图表示在不同调制深度下,EMI峰值的对比。
 
 
 
 
 
 
 
 
 
 
 
 
 
图2. 调制深度对降低EMI程度的影响
​在许多系统中,基频的奇次谐波才是产生EMI问题的根源,时钟扩频不仅衰减基频的EMI辐射,同时也抑制奇次谐波上的能量辐射,而且相比于基频,时钟扩频对于奇次谐波的衰减作用更为显著。这是因为奇次谐波的(展频后)频带范围相比基频的频带更宽(整数倍)。如图3表征这种影响。
图3. EMI衰减 VS 奇次谐波
2.3. 调制方式(Modulation Profile)
​调制方式决定EMI峰值的表现形式,时钟扩频常用的两种调制方式包括Linear和Hershey Kiss。
​线性调制相对简单,顾名思义,线性调制后输出的时钟频率是线性变化的。这种调制方法的缺点,输出频谱旁瓣比中间频率幅度高1-2dB,但在任何频率EMI的失效也就意味着整个EMI测试的失败。旁瓣的辐射峰值可能超出SPEC范围,设计者需要考虑到这点的影响。
​Hershey Kiss调制的特点是在调制范围的两端,频率变化速度更快,在调制范围的中间值,频率变化较慢,这样信号在频率两端的能量得到更大的衰减,分散到中间位置,整体的表现就是整个频谱的能量近似平坦。下图分别是两种调制方式的对比,可以看到采用Hershey Kiss调制方式,EMI峰值更近一步衰减了1.13dB。
3. RT1060使能Spread Spectrum对EMI性能的影响
如下图是RT1060 SDRAM运行在166M,同样SEMC引脚驱动能力配置条件下,是否使能时钟扩展的测试结果对比图,左图表示未使能使能时钟扩频,右图表示已经使能时钟扩频,可以看到使能时钟扩频后,EMI提升了超过8dBm,极大的提升了EMI性能。
测试条件:SDRAM speed = 166M、Pin Drive Strength = Lowest (R0)、Disable/Enable Spread Spectrum(30M@60K) 
4. 使能RT1060 SDRAM扩频的步骤
4.1 RT1060 时钟扩频相关寄存器
​上文中介绍了时钟扩频常用的两种调制方式Linear和Hershey Kiss,RT1060的SDRAM时钟扩频仅支持Linear向下扩频,主要涉及的配置包括两个寄存器:CCM_ANALOG_PLL_SYS_SS 和CCM_ANALOG_PLL_SYS_DENOM,两个寄存器中各位含义如下:
- STOP位:用于配置扩频范围,即调制深度,其计算公式=STOP/CCM_ANALOG_PLL_SYS_DENOM[B]*24M;
- ENABLE位:用于决定使能Spread Spectrum,默认都是disable状态;
- STEP位:用于配置线性调制的调制速度,其计算公式=STEP/CCM_ANALOG_PLL_SYS_DENOM[B]*24M;
- B位:用于设置用于计算调制深度和调制速度的分母。
举例来说,由于SDRAM默认的时钟源是SYSTEM Clock,如果打算**设置扩频范围为26M,即调制深度为5%, 调制速度为60K**,那么按照以上两个公式可以设置**CCM_ANALOG_PLL_SYS_DENOM[B] = 2400,ST0P = 2600,STEP = 6**,即可实现设定目标。调制深度 = 24Mx2600/2400 = 26M, 调制速度 = 24Mx6/2400 = 60K,对应CCM_ANALOG_PLL_SYS_SS寄存器值 = 0x0A288006, CCM_ANALOG_PLL_SYS_DENOM = 0x960。
4.2 配置扩频的位置和代码
如下图是RT1060内部时钟树,其内部包含多个PLL,分别为内核、System、USB1、Audio、Video、Ethernet以及USB2提供时钟源,但是只有红色框中的PLL2支持扩频。在使能PLL2的扩频时有两个点需要注意,首先,一旦PLL2使能扩频,PLL2对应的分频PFD0-PFD3的输出时钟也会相应的改变,如果有定时器Timer或其他外设使用PLL2或者PFD0-PFD3的输出时钟作为时钟源,会导致计时时间不准,需要在应用中考虑到这个点。其次,在使能PLL2的扩频之前,PLL2需要先被shut down,在配置扩频参数并使能扩频功能后,再次power on,并且在PLL2 offline期间,需另外一个时钟源去临时替代PLL2,然后再切换回去。
了解完扩频的配置和注意点后,具体在哪里去修改代码呢?分两种情况:第一种,芯片一上电代码就从SDRAM运行或者一上电就需要将部分代码搬移到SDRAM地址空间,这种情况下就需要在第一行用户代码运行前完成SDRAM引脚和SEMC外设的初始化,也就是在RT DCD初始化代码中完成。第二种,在芯片代码运行到system initial以后,才完成对SDRAM的初始化,此时用户可以直接在初始化代码中完成SDRAM的配置。对于实际应用,大部分情况都是第一种,也就是需要在DCD初始化过程中完成。以下以MCUBootUtility\src\targets\dcd_model\ ISSI_IS42S16160J中dcd.cfg描述符文件的修改为例,line9-11代码完成了对扩频的配置,详见注解。
5. 使能扩频带来的影响分析
​如前文提到,一旦PLL2使能扩频,PLL2对应的分频PFD0-PFD3的输出时钟也会相应的改变,如果有定时器等外设使用PLL2或者PFD0-PFD3的输出时钟作为时钟源,会导致计时时间不准,需要用户特别考虑,那是不是意味着需要一旦PLL2使能扩频,需要对SDK代码中的时钟配置做很大的修改呢?笔者分析了RT1020和RT1060 SDK中默认的时钟配置,如下截图是RT1060 SDK默认的时钟配置框图,发现PLL2仅用来为SEMC和SDHC提供时钟源,这也就意味着在SDK默认的时钟配置中使能PLL2扩频不会影响到 SDHC之外的其他外设的时钟精度,用户在使能PLL2扩频后SDK代码中的时钟配置无需做很大的修改。
RT1060 SDK默认的时钟配置框图
参考资料: 
Reducing EMI in digital systems through spread spectrum clock generators 
https://www.cnblogs.com/jacklong-yin/p/10252430.html