去年年底的时候,一个公司给我打电话,问我最近有没有空,说要请我帮忙做一个基于CAN总
线通讯的东西,我去看了看,是一个数据采集系统,下面是一系列数据采集的智能板卡,上位机是
基于WINBOND的一块486的工业嵌入式控制板,操作系统使用的是WINCE.智能板卡通过工业底板和数据线两种方式和上位机通讯,通信协议选择的是CAN,其中底板上的通信选用高速波特率(1Mbps),数据线选用低速(100kbps).
去公司的时候,公司给了我一个参考的东西,采用SST单片机+SJA1000的方案构成的智能板卡
,同时告诉我可以自己设计方案.考虑到SST的东西没有用过,P8X591是PLCC封装的,烧写起来不
方便,于是我设计了如下的方案:
1、智能板卡上的通讯采用AT89S51+两块SJA1000的方式进行;
2、上位机通过PC104总线和一块CAN控制板卡连接,CAN控制板卡上同样采用AT89S51+两块
SJA1000的方案.AT89S51和上位机通过PC104总线共享内存(使用IDT的双口RAM);
3、采用西门子的组态软件进行WINCE下的板卡驱动开发;
由于以前没有做过CAN的东西,于是决定了先调试CAN通信,然后设计板卡的方案.
方案确定之后,首先是上www.zlgmcu.com上下载了全部的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告诉我单个