车机CAN总线模拟器的自制

2016-02-05 16:44:47| 分类: 兴趣 (从我的网易博客复制)

  前段时间数码之家论坛上有人卖车机,可能是高尔夫7上升级了新导航,换下旧的单色屏车机,是德赛西威的,编号5GG 035 185,主要是不到30元还包邮,实在抵抗不住诱惑入手了一台。
  尾线啥的都好弄,从备件里找出接插件焊上线就搞定了,主要是该车机还需要有解码器,否则蓝牙、电话功能不能用,而且一个小时后会自动关机。当时觉得觉得一起买的太贵了,就从另一家店铺里买了个解码器,结果没注意看内容,竟然买回来不能用(卖家说有高速和低速两种,我的这种车机是高速的),在淘宝上一搜,比车机还贵不少,一气之下就准备自己做一个。
  开始先研究了下淘宝买的低速解码器,见图:
在这里插入图片描述
很明显用了一个单片机,不过不知道是什么型号,我看了下管脚,1和8脚是电源正负极。在我的印象中,STM是没有SOP8封装的,然后在用过的AVR、PIC、STC里回忆了一下,应该是PIC系列的。其他的部分应该是MOS管和二极管啥的,电路没看,应该不复杂。
  然后开始啃CAN协议知识,一边啃一边觉得CAN这个东西真是好,应该大力推广。先介绍下历史,CAN总线是汽车设备厂家bosch公司发明的,因为随着汽车里设备的增加,设备之间的连线也成几何级数的增加,bosch公司就发明了CAN,通过两根双绞线可以完成所有设备之间的互联,而且CAN天生就具有防冲突的功能,能够实现控制设备之间的高速通信。两个线分别是CAN+和CAN-,CAN+只有高电平和悬浮两种状态,CAN-只有低电平和悬浮两种状态,当发送0信号就是支配信号时,CAN+和-分别是高低电平,如果发送1信号,两个线处于悬浮状态,即释放信号。这样就算有多个设备同时发出不同的信号,也会由于只有支配信号起作用,不会出现其他总线的互相干扰或者烧毁器件的情况。
  CAN总线学习的差不多了,在淘宝上买了一个CAN收发模块(采用MCP2515和TJA1050),准备先做一个RS232转CAN的收发器,我给它启了个名字叫TTL2CAN。单片机用PIC18F1824,MCP2515的驱动在网上也是现成的,做起来很简单。主要碰到一个问题是单片机速度不够,当PC发送19200BPS的串口数据时,接收会丢数据,而此时已经用到最高32MHz的主频了,因此只能实现9600BPS的串口通信(用C写的,改用汇编可能会更快点,不过主要目的是能收发CAN数据,波特率不是很重要)。
  开始准备破解车机的协议,发现用PC连上TTL2CAN,发送各种数据尝试,发现车机都没有响应(其实此时离成功太遥远了),后调试程序,发现CAN发送总是失败,TXERR总是被置位。悲剧的是MCP2515也不提供详细错误的标识,于是开始到网上寻求帮助。百度里居然没有任何相关的有用的信息,只好想法google,终于在一个德文论坛上找到一段对话,大概意思是没有接收者就不能发送,因为CAN消息中有一个bit是接收方反馈的,如果总线上没有任何接收方,这个bit将会是1,表示没有响应,发送方就会认为没有一个接收方确认此消息,也间接表明发送的数据是无效的,因此反复重发。
  弄清这个原理,就好理解为什么市售的模拟器都没有用CAN控制器来做了,因为必须要同时模拟出发送和接收方的电平,因此必须得用单片机直接模拟电平信号,想到这里,我开始设计一个硬件电路,满足CAN总线对线路电平的需要。电路图大致如下,开始的时候用的是三极管,测试的波形惨不忍睹,0的时候还好,1的时候下降延时有100us左右,要知道500Kbps的CAN一个bit的时间才2us,后来调整了电路,换成MOS管基本符合要求了。Q1、Q2用的是N-MOS,Q3用的是P-MOS,随便型号,封装SOT-23就行。
在这里插入图片描述
  单片机的选型没什么悬念,我手里正好有PIC12F1822,也是8脚的,推测淘宝卖的低速模拟器用的就是这个,内置RC主频最高32MHz(8MHz的指令频率),如果要完成500Kbps,需要16个指令周期完成一个bit的发送。这个要求貌似比较简单,其实很难,C代码经过编译以后一个循环就10个周期了,还要先寻址字节,再寻址位,单片机内存总共就128字节,后来改变了思路,采用空间换时间的方法来解决。修改了延迟代码,用MICRO X IDE模拟时间隔正好2us。
  再后来就是反复调试,车机也一直无响应。期间还从国外网站上搜大众汽车的CAN_id列表,也都没有测试成功。就在准备放弃的时候,我坚持再进行一次测试,就是用我自制的模拟器,用我的TTL2CAN看能否收到,测试果然收不到,说明模拟器还是有问题,经过1天的思考,我用自制的示波器观察后判断问题还是在发送时序的代码上,后来发现问题是X IDE的stopwatch不准,如果把里面一个复位的选项去掉,显示的周期就是对的。我之前的代码实际上发送bit的间隔有22或者23个指令周期,后来耐心的调整汇编代码,终于实现16个周期的精准发送。
  看前后的波形就能发现差异还是很明显的,下面两个图中上面的是调整代码之前的波形,仔细看的话就会发现,高低电平的时长不一样。
在这里插入图片描述
下面这个是调整代码以后的波形了,不过发送的数据实际上是不一样的,所以波形差别很大。
在这里插入图片描述
  完成到这里,TTL2CAN已经可以正确的接收到模拟器发的报文了,最后再继续调试CAN模拟器,看车机是否有反应。
开始的时候用了网上搜的几个ID测试,没有反应,后来用穷举法进行测试,终于发现车机的蓝牙可以工作了,按键灯也有变化。随后慢慢减小ID的范围,终于确定了引擎工作的ID和亮度控制的ID,然后在慢慢测试其后的参数值,确定了具体的值。(具体的值我就不公布了,毕竟淘宝上众多的卖家还指望这个赚钱呢~)
这是最终完成的实物图,PCB是用雕刻机制作的(请无视焊工,我懒,从不清洗线路板),78L05前加了个稳压管,降低78L05的功耗。
在这里插入图片描述
  到这里,从开始动手做CAN模拟器已经经过半个月了,当自制的CAN模拟器启动了车机的蓝牙和按键灯光后,心里很是激动。有志者事竟成,这不仅仅是一句口号,当我们碰到问题或者困难的时候,不妨再坚持一下,不要放弃,也许很快就会峰回路转、柳暗花明。
  这次制作的难度很大,首先要学习CAN总线,自制收发器和模拟器,并且还要用模拟器破解车机的协议,应该超过一个重点大学毕业设计的难度了。总之,过年有新音响可以听了~

  • 13
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值