ams OSRAM AS5047P 标称 10MHz SPI,但 45cm 编码器电缆把 SCLK 上升沿拖到 180ns,会导致伺服驱动器校验错误和通信超时

首发于公众号「如是有为」 · 查看原文

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。

很多时候你会看到的不是方波,而是一碗慢吞吞的斜线。

它其实已经把答案写在屏幕上了:

你的电缆,比你想象的长。

而编码器芯片真正的坑,很多不在芯片里面,而在芯片被接到真实机器上的那一刻。

应作如是观
公众号「如是有为」二维码

关注公众号「如是有为」

微信扫一扫,新文章先在公众号发出。