CAN Omega 1.1版本开发笔记(一)
关于CAN Omega:
CAN Omega项目是我发起的,由浙江大学USS Lab.支持的一个开源汽车总线安全分析/测试工具,之所以叫这个名字,顾名思义,Omega是希腊字母的最后一个,代表终结,也就是说希望这款开源工具可以作为一个终极工具出现,可以支持一切已知协议的分析和调试。关键在于,这个项目是以MIT协议开源的,大家可以随意使用其中的成果在自己的项目或者产品里。
目前支持的协议有:
ISO15765 CAN250Kbps 标准11bit协议
ISO15765 CAN250Kbps 扩展29bit协议
ISO15765 CAN500Kbps 标准11bit协议
ISO15765 CAN500Kbps 扩展29bit协议
ISO9141-2 5波特率初始化
ISO14230 KWP2000 5波特率初始化
ISO14230 KWP2000 快速初始化
SAE J1850 PWM
SAE J1850 VPW
以及对CAN协议的“多帧”模式支持
另外,在电路设计上是考虑了将来很可能会普及的CAN FD协议,因此收发器已经使用了对CAN FD优化的收发器,而CAN Controller由于MCP2517FD还未量产,量产后估计是和MCP2515的引脚应该是兼容的,所以在这一版中仍然采用2515,等2517发布了之后,换芯片也应该比较容易,不需要重新画PCB。
关于CAN Omega的1.0版本:
首版在2016年10月23日已经公布了所有的源代码,大家可以在我的github上找到:
https://github.com/zjlywjh001/CAN_OMEGA
另外其中项目的软件部分,也就是下位机STM32的固件以及上位机用Java写的跨平台图形界面我分成了2个子项目以方便代码的维护和版本管理:
下位机程序:
https://github.com/zjlywjh001/CAN_Omega_Firmware
上位机软件:
https://github.com/zjlywjh001/CAN_OMEGA_Tools
1.0版本上位机支持的功能有:
1.CAN总线、K线和J1850的协议收发,
2.CAN总线报文差分分析(按ID分类)
3.CAN总线fuzz测试
4.下位机固件升级
其中下位机的串口协议也是完全公开的,也方便有需要的朋友开发自己的上位机软件。
在2016年11月20号左右的时候,那时候老师给了个任务,让我带学弟去参加一下SysCan360的冬季汽车破解大赛,主要是针对CAN总线协议的分析,想想这个机会正好可以测试一下这款工具,毕竟工具还是需要在实战中检验的,而且目前设备只在模拟器上调试过,而对于真实环境还没有很完备的测试,所以就报名参加了。看了规则之后,比赛设定的CAN总线是工作在125kbps 11bit协议上的,这不是一个标准的OBD协议,所以在比赛之前,我又发布了1.01版上位机软件,增加了2个协议,同时修了一些新发现的bug:
CAN125Kbps 标准11bit协议
CAN125Kbps 扩展29bit协议
虽然最后得了冠军,但在比赛过程中还发现了工具存在的一些不足和严重问题,虽然不足以影响到比赛操作,也感谢这次机会吧,让我发现了一些工具的不足和缺陷,所以就萌生后续的开发计划,所以1.1版本就要就来了。
CAN Omega 1.1版本硬件上的改变:
由于1.0版本硬件已经足够稳定,所以1.1版本并没有对其大刀阔斧的修改,而是针对之前的问题做了一些小改动:
原理图改动:
1.1版本原理图基本上没有改动其他地方,而是在CAN总线发送处增加了一个模拟开关:
1.0版本是直接在CAN_H和CAN_L之间并联了120欧姆电阻,要去掉只能拆除。
实际上当时设计时对120欧姆电阻的理解是有偏差的,120欧姆的含义在于,为了匹配线路阻抗和消除反射,通常我们将CAN总线看成是无限长的,而120欧姆是两根无限长平行导线的等效端阻抗,所以这个120欧姆并不是随便选取的,另外,120欧姆是总线的端电阻,也就意味着只需要在CAN总线最远的2个端点接上即可,而不是每个CAN总线设备都需要加上120欧姆的端电阻。
如上图所示,其中Node#1~3在接入CAN_H和CAN_L之间时是不需要接入120欧姆端电阻的,且中间节点的接入线长通常不超过3m,当然,我们这里再讨论另一种情况,就是两个CAN总线设备对发的情况,这种情况就是比赛时候的情况,主办方使用一个发送设备,而我们比赛选手的接收方使用的设备都是并联在CAN总线上的,在只有2个设备对发的情况下,确实对于每个终端设备都需要并联120欧姆匹配电阻。而如果接收方想要接多个监听设备,则只需其中1个接入120欧姆电阻即可,其他设备无需接入电阻。
这也就是说:
CAN_H和CAN_L之间的电阻应该是60欧姆!(两个最远点的120欧姆并联),并不存在其他情况,另外,实际比赛时候,主办方表示需要我们把终端匹配电阻设成60欧姆,这个实际上是对CANalyst-II的2个120欧姆的错误理解,关于这一点,我会专门写一篇文章来分析120欧姆电阻的问题。
因此,由于之前CAN Omega的终端电阻是直接焊死的120欧姆,虽然在大多数传输线长度不长的使用环境下都不会有特别大的问题,但这样的设计并不严谨,因此在1.1版本中予以改进。本来是想弄个拨码开关来控制,但是这个并不符合当下的潮流,毕竟机械式的控制容易坏且存在噪声和静电的影响,所以在CAN Omeage 1.1的设计里,我还是打算采用我最喜爱的单片机软件来控制,这样就可以直接在上位机界面中选择了,用模拟开关来控制终端120欧姆电阻的接入。
另外,在PCB的layout上也有些调整,例如1.0版本在CP2102的QFN封装底下走了一根线:(如黑色箭头所示)
实际上这样是非常危险的做法,一旦覆盖这根线的阻焊层脱落,由于QFN封装底部会有一个方形的散热用的pad,这个pad一般是接地的,此时若在这个pad与裸露的走线接触,就会造成这跟信号线对地短路,造成不可预料的问题,图中那根线恰好是UART的RX线,因此会造成单片机能发送但收不到UART数据,不要认为这个是多虑,在实际焊接当中,我确实碰到了因为阻焊层脱落而短路的这个问题,因此最后改成下图这样:
这样底部就完全没有走线了,比前面那种layout方法要安全稳定得多。
到此CAN Omega 1.1版本硬件已经介绍完毕,打算量产一批,关于上位机的分析功能也还有很大改进空间,这个待硬件完成后会很快跟进。
CANOmega的原理图大家感兴趣可以在这里下载:
如果你对本项目感兴趣,欢迎关注项目的github主页: