ams OSRAM AS5047P 标称 10MHz SPI,但 45cm 编码器电缆把 SCLK 上升沿拖到 180ns,会导致伺服驱动器校验错误和通信超时
首发于公众号「如是有为」 · 查看原文

上个月帮一个伺服驱动器客户排查编码器通信问题。客户一上来就说:“这批 AS5047P 可能有问题,我们已经换了 5 片,现象都一样。”
现象也确实挺像芯片坏了:MCU 侧用 10MHz SPI 读角度数据,有时候报校验错误,有时候直接通信超时。最烦的是它不是一直坏,而是偶发。刚换板、刚换芯片,能好一两天;设备跑一段时间,又开始报错。
客户那边已经准备走 RMA 了。
我说先别急着退料,先把示波器拿出来,看一眼编码器端的 SCLK。不是 MCU 端,是编码器连接器那一端。
探头一挂上去,现场几个人都不说话了。
主控端看着还像个方波,到了 45cm 电缆另一头,SCLK 上升沿已经被拖成一根斜线。原来几 ns 的边沿,在从机端量出来接近 180ns。
这时候再讨论“是不是芯片批次问题”,其实已经没什么意义了。
问题不在芯片,在电缆。
逻辑分析仪只能告诉你它读到了 0 还是 1,示波器才能告诉你:芯片引脚上到底有没有一个像样的边沿。
SPI 一接上电缆,味道就变了
很多人对 SPI 有个误会:觉得它简单、皮实、随便拉几根线就能跑。SCLK、MOSI、MISO、CS,四根线一接,协议也不复杂,datasheet 上还写着最高多少 MHz,看起来没什么门槛。
但 SPI 这个东西,本质上更像板级接口。它在 PCB 上几厘米、十几厘米的环境里很好用,可是一旦你把它接到电缆上,尤其是接到编码器这种靠近电机、靠近动力线、还要穿连接器的场景里,问题就完全变了。
AS5047P 官方资料里写得很清楚:SPI 是 slave 模式,最高通信时钟到 10MHz,模式是 mode=1,也就是 CPOL=0、CPHA=1。换句话说,10MHz 不是随便怎么接都能稳定跑的“保底值”,而是在满足时序和硬件条件下的接口能力。(ams OSRAM)
这次客户的结构很常见:编码器到驱动器之间一根 12 芯屏蔽电缆,大概 45cm。单看芯片输入脚,电容没有多大,几 pF 量级,似乎没什么威胁。可工程现场不是只看芯片输入脚。电缆有电容,连接器有电容,PCB 走线有电容,ESD 保护和输入结构也会叠进去。
最后落到 SCLK 上,实际负载早就不是 datasheet 里那个干干净净的小电容了。
你要是只按一个简单 RC 去算,会觉得“不至于啊,几十 pF 而已,上升沿不该这么慢”。这就是很多人第一次排查这类问题时最容易掉进去的坑。因为 45cm 电缆已经不能完全当成一颗电容看了,它开始像一段传输线。
有分布电容,有分布电感,有特征阻抗,有反射,还有回流路径问题。源端没有串联阻尼,远端又是高阻输入,SCLK 一冲过去,到了编码器端反射回来,回到源端再反射一次。最后你在远端看到的不是一个干脆的上升沿,而是一段慢吞吞、带台阶、带振铃的斜坡。
所以现场最扎心的地方就在这里:MCU 旁边量着没问题,编码器端已经不成样子了。
180ns 的上升沿,到底有多离谱
10MHz SCLK,一个周期是 100ns。
你想象一下,一个时钟周期才 100ns,而你的上升沿自己就拖了 180ns。这已经不是“边沿稍微慢一点”的问题了,而是这个 SCLK 在从机眼里到底什么时候算翻转,都开始变得不干净了。
正常情况下,从机看到一个明确的 SCLK 边沿,然后内部状态机往前走一步,MISO 推出下一位数据,主控再按约定时刻去采样。整个过程靠的就是边沿清楚、时序稳定。
但现在 SCLK 是一根斜线。它在输入缓冲器阈值附近磨磨蹭蹭,旁边再来一点反射、一点地弹、一点电源噪声、一点串扰,内部看到的边沿时刻就可能偏掉。
主控以为:“我在这个 CLK 后面读 MISO,没毛病。”
从机那边可能是:“不好意思,我刚刚才真的看到这个边沿。”
于是某一位数据就错了。错一位,后面的校验当然过不去。客户日志里看到的就是校验错误、通信失败、偶发超时。
最恶心的是,这种问题特别像芯片坏。它不是每次都错,也不是一上电就错。你换芯片,插拔了一次线,板子重新固定了一下,线缆姿态变了,接触状态也变了,它可能真就好了两天。
然后设备一振动,温度一上来,线缆位置慢慢回到原来的状态,故障又回来了。
这时候客户很容易说:“你看,换了还是会坏,肯定是这批芯片不稳定。”
但实际上,芯片只是背锅最方便。
很多编码器通信问题,第一嫌疑人不该是芯片
我自己现在遇到这类问题,已经很少第一反应怀疑芯片本体了。不是说芯片永远不会坏,而是现场里真正把通信搞崩的东西,往往更土、更脏、更不体面。
比如 CPOL/CPHA 配错。AS5047P 是 SPI mode=1,有些工程师顺手就按 mode=0 配了,读出来当然不对。
比如 CSn 被 GPIO 漏驱动。看代码觉得拉低了,实际上中间有毛刺,帧边界乱掉。
比如 SCLK 走线分叉,或者 SCLK 和 MISO 长距离平行跑。你以为是数字线,实际上已经在互相喂噪声。
再比如这次这种,电缆一长,SCLK 远端边沿直接被压扁。
这些问题都有一个共同点:它们在日志里长得很像。不是“通信失败”,就是“校验错误”,再不就是“读数偶发跳变”。最后客户最容易得出的结论就是:编码器芯片有问题。
但你真拿示波器去看,会发现很多时候芯片根本没来得及“坏”,它只是吃到了一个很烂的信号。
TI 的 TIDA-060017 参考设计也专门讲过 SPI 长距离传输的信号完整性问题。它的思路很直接:SPI 走远了以后,信号质量、传播延迟、外部噪声、串扰都会变成问题,所以可以把 SPI 通过 LVDS 差分链路传输,来改善长距离和噪声环境下的可靠性。(Texas Instruments)
说白了,SPI 不是不能跑快。
它的问题是:你不能把 PCB 上 3cm 的 10MHz,当成拖着 45cm 电缆、穿过连接器、贴着电机跑出来的 10MHz。
现场怎么救?先别换芯片,做三件事
第一件事,先量从机端 SCLK。
这个我觉得要反复强调:不是量 MCU 引脚,不是量板子上最方便下探头的测试点,而是量编码器端连接器位置,最好再往芯片引脚附近看。因为真正决定从机怎么工作的,是它自己引脚上吃到的波形。
而且不要只看逻辑分析仪。逻辑分析仪会把一条很难看的斜坡,最后翻译成 0 或 1。它看起来很冷静,但它会掩盖最关键的问题:边沿到底有多慢,振铃有多大,阈值附近有没有来回抖。
10MHz 的 SCLK,周期 100ns。我的经验是,10% 到 90% 上升时间一旦超过周期的 20%,也就是超过 20ns,就别再把它当理想数字边沿了。如果你在从机端看到几十 ns,甚至上百 ns 的上升沿,别急着怀疑芯片,先把链路处理掉。
第二件事,在源端加串联阻尼电阻。
最常见的做法是在 MCU 的 SCLK 输出脚旁边串一个 22Ω 到 47Ω,很多场景可以先从 33Ω 试起。注意位置要靠近 MCU,不是随便在线缆中间飞一颗。
这颗电阻不是为了“限流”,它的价值是把源端阻抗拉起来一点,压掉反射,让远端看到的边沿别那么乱。很多人第一次加这个电阻会觉得有点玄学,但你只要拿示波器看远端波形,效果通常很直观。
这次客户现场飞线验证,SCLK 源端补了一颗 33Ω 后,远端上升沿从接近 180ns 收敛到 20ns 以内,MISO 的数据窗口也重新打开了。
这比开会争论三个小时“是不是芯片批次问题”有用得多。
第三件事,降速。
前两步做完还不稳,就别硬扛 10MHz 了,先降到 5MHz,甚至 2MHz 验证。很多工程师一看到 datasheet 写最高 10MHz,就下意识把接口配到 10MHz,好像不用满就亏了。
但编码器通信不是跑分比赛。
以 5MHz 读一帧角度数据,对大多数伺服周期来说,并不会变成系统瓶颈。真正要命的不是慢一点,而是你以为系统很快,结果它每隔几千帧偷偷错一帧。伺服系统最怕的就是这种偶发错误,因为它很难复现,很难归因,最后还会把锅甩到最贵、最显眼的那颗芯片上。
如果线缆更长,现场干扰更重,或者编码器线必须跟动力线贴着走,那就别再幻想单端 SPI 直连了。该上差分就上差分,该调整系统架构就调整系统架构。工程上最贵的不是多加一颗收发器,而是量产之后现场一台一台去解释为什么“偶发”。
真正该改的,是排障顺序
很多现场排障顺序是反的。
先换芯片,再换板子,再怀疑批次,再找供应商,最后才拿示波器看波形。
正确顺序应该倒过来。先看从机端 SCLK,再看 MISO 数据窗口,再看 CSn 时序,再确认 SPI 模式,最后才讨论芯片本体有没有异常。
尤其是编码器这种东西,它不是躺在实验室评估板上的器件。它在电机边上,在机械振动里,在温升里,在连接器和线缆里,在屏蔽层接地不一定靠谱的真实机器里。芯片手册里的时序,只是告诉你芯片在什么条件下能工作;但客户现场会不会给它这个条件,是另一个问题。
所以下次 AS5047P 换了三片还不行,先别急着说芯片批次问题。
拿示波器去量从机端 SCLK。
很多时候你会看到的不是方波,而是一碗慢吞吞的斜线。
它其实已经把答案写在屏幕上了:
你的电缆,比你想象的长。
而编码器芯片真正的坑,很多不在芯片里面,而在芯片被接到真实机器上的那一刻。

关注公众号「如是有为」
微信扫一扫,新文章先在公众号发出。