使用示波器的10x探头观察,会发现高速时钟线上会出现驻波(standing wave)。其实信号线上都会有驻波,只是强度大小不同而已。
驻波强度和信号的0/1频率没有关系,而是上升下降的频率有关。
一般来说,判断电平值的信号线,驻波并没有多大的影响;但是读取边沿的信号线,驻波的影响就不可忽视。驻波造成了74HC595的时钟线读取错误:本来应该读取1个数据的时候,它读取了多个进去。
解决方法有两个:
第一,降低信号线频率,将GPIO_Speed_50MHz改为GPIO_Speed_2MHz。
降低了信号线频率,驻波的强度也会随之降低,原来会出现的乱码现象也会消失。
从前我一直不明白,既然STM能够做到50MH的IO口操作频率,为什么还要提供2M、10M、50M三种选项呢?直接都设置成50MHz不就可以了吗?
原来它们是有各自适用的范围的。
第二,使用GPIO_Speed_50MHz频率,但是在信号线上串联一个68欧姆的电阻。
在高速时钟线上,阻抗不匹配会导致信号的反射,也就是信号的振铃效应。一般来说,对直流通路而言,输出引脚的阻抗较低,而输入引脚的阻抗较高;在高速频率下,传输线还具备大概认为是50欧姆的特征阻抗。信号遇到高阻抗的输入引脚,反射回来叠加到输出引脚上,形成驻波。因此,通常在高速时钟线上串联一个47欧姆~100欧姆的电阻,吸收掉它。
如果串联的电阻为10欧姆,信号振铃几乎没有改善;
如果串联的电阻为120欧姆,信号变形严重;
如果串联的电阻为68欧姆,信号振铃得道很好的改善。