Can
刚刚过去的周六周日,真是“充实”,特别是周六晚上和周日晚上。调试 CAN 调试的真心激动。最开始的时候数据就不通。这里记录下自己的排查过程吧:
1.怀疑 GPIO 复用问题导致 CANTX 的没有关联到 PA12,当时我也疑惑,有些 GPIO 可以复用多个外设的功能,当两个外设均为使能状态时,该怎么选择复用为哪个功能呢,我看网上有人说,两个外设都无效,我也没有实际去测试,看下 PA12 和 PA11,分别对应 CAN_TX 和 CAN_RX 了。
当时我看到 PA12 是不是复用为 UART0_RTS 了?然后我就尝试关闭 UART0 的时钟发现还是不行,使用示波器检测 CAN_H 和 CAN_L 的差分波形,只能捕捉到一瞬间的低电平。看来不是管脚复用的问题。
2.当时我也测试了是不是 ADM3053 这个 CAN 的转换芯片电路出问题,根据手册:

可以看出来 TXD 输出为低电平时,CANH 和 CANL 的查分是高电压,我直接将 PA12 管脚接地,示波器发现 CANH 和 CANL 的查分的确是高电压,此时我感觉 CAN ADM3053 外部电路应该是没有问题的。
3.后来尝试看手册,看有人用回环模式测试外部电路是否存在问题的,所以看了 32 的手册,回环模式,只是输入和外部断开了,输出是可以发送到外部,如图所示:

我怀着试试的心态切换到换回模式,通过示波器发现 TX 断有 CAN 的帧发送出来。此时的心情是意外的惊喜。看网上的描述如果回环模式正常,normal 模式应该也正常,此时我切换到正常模式,发现尴尬,没什么反应。又变成了之前情况,仅仅能捕捉到一个低电平,没有完整的 CAN 帧数据。这时候我尝试看看能不能用 CAN 的调试器在电脑上是否可以接收到数据,理论上来讲是可以的,因为环回模式发送端是正常接收到外部的 CAN_TX 的管脚的,即 PA12 是有 CAN 的数据帧的,但是尴尬了,发现 CAN 的调试器还是没有打印出数据。这时候我在想是不是 CAN_RX 有问题呢,就是没有收到正常的应答导致,接到调试器后就不往外面发送数据了呢。这时候我就用电压表在我老婆的帮助下测试看看 PA11 和 CAN_RX 有没有接通,竟然没有接通。此时我补焊了一下,重新测试接通了。测试 CAN 的调试器发现还是接收到不到数据。这时候我很郁闷。用示波器继续观察 CAN_H 和 CAN_L 的差分波形,发现高电压的时候只有 0.5V 左右,感觉不对啊。因为之前测试高电压的时候是可以达到 2.8V 附近的。想想这么贵的芯片 ADM3053 (接近 30 块钱 /pcs)不能这么容易就坏掉啊。仔细看下芯片的管脚,电表测试是通的,但是看着有些地方是有虚焊的地方,补焊一下了。惊喜来了,补焊后,商店测试,发现 CAN_H 和 CAN_L 的压差高的时候可以达到 2.8V 附近了。并且可以看到 CAN 的数据帧的,连接 CAN 的调试器,久违的数据终于看到了,对了之前我还用示波器测试了 CAN_H 和 CAN_L 的确定了 CAN bit 的频率是我设置的 10KHz。果然,接到 CAN 的调试器后数据就收到了,对了这个时候是回环模式,是可以顺利发送数据到外部的。因为 RX 我也已经重新补焊了,这时候修改代码,添加读取 CAN 数据的代码,发现可以读到 CAN 调试器发送的数据了,至此 CAN 的双向通讯已经通了,开心。
- 最后的结论是焊接问题!!!
- 总结就是,示波器是一个好东西
- 首先排查硬件 CAN 转换电路,手动修改 CAN_TX 看 CAN_H 和 CAN_L 的压差是否随着变化
- 然后测试回环模式,看输出的 CAN_TX 以及 CAN_H 和 CAN_L 的压差是否正常
- 在正常模式下,连接 CAN 的调试器,确认下 CAN_RX 是否正常联通