SJA1000调试
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
转自hua_cs
方案:
1、智能板卡上的通讯采用AT89S51+两块SJA1000的方式进行;
2、上位机通过PC104总线和一块CAN控制板卡连接,CAN控制板卡上同样采用AT89S51+两块
SJA1000的方案.AT89S51和上位机通过PC104总线共享内存(使用IDT的双口RAM);
3、采用西门子的组态软件进行WINCE下的板卡驱动开发;
由于以前没有做过CAN的东西,于是决定了先调试CAN通信,然后设计板卡的方案.
方案确定之后,首先是上上下载了全部的SJA1000和PCA82C250的资料.然后开
始设计电路板.采用了SJA1000应用指南中推荐的方案,采用SJA1000的时钟输出为AT89S51的时钟
,没有采用光电隔离芯片,把TX1接地,TX0和RX0分别连接到PCA82C250的TXD和RXD引脚上,RX1连
接到PCA82C250的VR上;加上了5欧姆的限流电阻和120欧姆的匹配电阻(用110欧姆替代),另外加上
了一个调试用的串口.没有注意而且要命的是把SJA1000的复位引脚和单片机的复位引脚连接到了
一起.
第一次的板子用的加急,用了三天,结果那次的板子做的极差——连铜皮都翻起来了;我马上
让那个电路板厂重新做了三块.在做板的过程中我发现了复位引脚的错误,SJA1000的文档上提供的
是一个复位电路,但是没有给出电路的详细组成,于是我就误以为和单片机的复位电路是一样的了
.在设计这块电路板的时候,最担心的事情就是SJA1000的输出时钟能不能够驱动AT89S51,如果不
能够驱动,那么一切就OVER了,可惜的是我的担心成为了现实,板子焊好之后系统不工作,在
SJA1000的时钟输入引脚上有信号输入,而且输出时钟也正常,但是单片机就是不工作.于是我先
把SJA1000的复位引脚连线割断,连接到了AT89S51的IO引脚上,再把S51的XTAL的两个引脚连接到
SJA晶体的上,可惜系统还是不工作,这次电路板设计失败了.
在总结了第一次失败的经验后,参看了21IC上的一个设计,决定把AT89S51和SJA的晶体分开.
并且用单片机的一个IO引脚来控制对SJA的复位.
第二次的电路板比较成功,焊接好了之后首先测试单片机的串口和LED指示灯,一切OK.然后
就开始测试SJA.ZLG提供了一个BASIC模式下的参考例程,我看了一下,然后又找了本《现场总线
CAN的原理和测试》把SJA的寄存器详细看了看(由于开始的时候比较忙,所以直到这个时候才算是
仔细看了看SJA的内部,至于CAN的基础协议我是根本没有看,这给我后面带来了极大的麻烦).然
后就参考ZLG的程序开始写SJA的测试程序,那个程序写的很大,也很全,因为我想快点把东西给做
出来,于是弄了一个1000多行的程序,以前我的调试程序一般都很小的.写好程序之后就开始测试
,首先测试的是测试寄存器,然后一步步测试下去,在BASIC模式下所有的寄存器都正常,但是在
发送的时候是总是不正常,启动发送之后就一直在发送,状态寄存器的标志位一直处在发送的状态
下,然后就是报总线错误,不知道是怎么会事情,很郁闷,上bbs看了一下.bullfrog告诉我单个
CAN节点发送是成功不了的,如果没有收到接受CAN节点的应答,发送节点就会一直发送,直到超出
错误计数器的允许值使得总线关闭.同时在精华区发现在peli模式下有ECC(错误寄存器),可以跟
踪错误,于是开始看peli模式操作过程.这个东西比较麻烦,zlg没有提供公开的c代码,我找了一
个汇编的作为参考.
我第一步的目标是自发送,在peli模式下有自发送这种模式,在有匹配电阻的情况下可以进行
单个节点的接收和发送.第一次调试的时候没有成功,给北京zlg打电话,北京分公司说让我给广
州打电话,给广州打电话,几个问题都得到了很好的解答(在此谢谢zlg的工程师了):
1、自发送的时候必须加上匹配电阻;
2、5欧的限流电阻可以不需要;
3、每次发送完成之后
4、建议使用中止发送来进行单步发送;
另外他告诉我可以在zlg的论坛上找到很多很有用的东西.
听了他的建议,我第一件事情就是检查我的电路板,检查的结果让我大吃一惊——我的ch和cl
竟然是短路的,万用表的狂叫不止.一步步检查,发现那个110欧的匹配电阻有问题,万用表碰上
去就叫,于是把那个电阻剪下来,量量还是短路.于是我怀疑把5欧的限流电阻当成了110欧的电阻
,于是把匹配电阻都去掉了.没有想到的是当我把新的110欧电阻拿来的时候,万用表还是叫,这
时候才发现这块万用表在300欧姆以下都要叫,可怜我又打理了n长时间的电路板......
再仔细阅读了一次peli模式下的操作指南,又仔细阅读了zlg提供的初始化规范,发现在子发
送的时候发送的命令应该是0x10或者是0x12(即CMR寄存器里面有一个专门的控制位是用来控制自发
送的,和普通的发送命令位是不同的).在发现了这个问题之后,自发送一切顺利的通过了.
接下来就是两个节点的互调了,我首先用自发送程序把两个节点都调试了一下,保证单个节点
发送硬件没有任何问题.然后就用双绞线通过接线端子把两个系统连接到了一起.第一次调试采用
的是1M的波特率(由于ZLG只给出了16M晶体下的BTR0和BTR1的初始值,我在ZLG的论坛上找到了一个
网友自己计算的数值,后来证明这个东西有些问题),没有成功.发送节点通过串口利用串口调试助
手来控制发送,接收节点通过仿真器观察数据.虽然没有发送成功,但是通过串口的反馈数据和仿
真器的观察窗,可以看到ECC寄存器都发生了变化,证明数据线上有数据过去(由于我没有示波器,
只有采用这种办法).于是我改变了两次波特率,最低到了5k,都没有成功,最后我从21IC上的一
篇应用文章上找到了两个参数,这次就成功了,通讯速率20k.现在一切稳定,在写这篇文章的时
候哪几个LED正欢快的闪烁着.
最后,总结几个经验:
1、一定要详细的阅读sja的手册和CAN的相关知识;
2、SJA的复位是低电平,而且不是用一个非们把单片机的RST反相就可以的,有两种解决方式
:第一种是使用单片机的IO引脚来控制SJA的复位引脚,好处是单片机完全控制SJA的复位过程;第
二种是采用适当的复位芯片,ZLG给我推荐的是CAT1161,我没有用过,其好处是同步复位.
3、在自发送的模式下,需要匹配电阻,而且自发送的启动命令和普通发送的启动命令不相同
;
4、BRT0和BRT1的选择,和串口通信中只要两个的误差一样就可以了不同,一定要精心选择,
建议SJA的外部晶体选择16M的,这样有利于参考ZLG的标准数值
5、SJA和其他外部器件连接的时候,数据线在373前后都可以;
6、最好有一个示波器;
7、不要太大意的相信万用表的蜂鸣器;
8、这是从ZLG网站上转载过来的peli模式下的初始化流程
a)检测硬件连接是否正确
b)进入复位状态