摘要:介绍CAN总线控制器SJA1000;给出其在CAN总线系统节点中的应用方法、节点电路原理图及初始化程序;针对用户SJA1000容易出现的问题进行了解说。
关键词:CAN总线 SJA1000 节点 单片机
CAN总线是德国Bosch公司20世纪80年代初,为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发一种串行数据通信协议。1993年11月,ISO正式颁布了道路交通运载工具,进行数据信息交换用的高速通信控制局部网(CAN)的国际标准(ISO11898)。PHILIPS、Intel、MOTOROLA等公司出品了很多支持CAN协议的集成芯片,如82526、SJA1000、68HC05X4/X16/X32和具有片内CAN的电磁兼容微控制器P8XCE598、16位微控制器87C196CA/CB等。下面介绍PHILIPS半导体公司推出的CAN总线控制器SJA1000,并给出其应用实例。
1 CAN总线控制器SJA1000芯片介绍
SJA1000是一种独立的CAN总线控制器。PHILIPS半导体公司将它作为PCA82C200 CAN控制器(Basic CAN)的替代产品。SJA1000增加了一种新的工作模式(Peli CAN),这种模式支持具有很多新特性的CAN 2.0B协议。
1.1 SJA1000引脚介绍
图1是SJA1000引脚图。SJA1000具有28个引脚,下面对部分引脚进行介绍。
MODE:模式选择输入,1(高电平)=Intel模式;0(低电平)=Motorola模式。
TX0、TX1:从CAN输出驱动器0,1输出到物理总线上。
RX0、RX1:从物理CAN总线输入到SJA1000的输入比较器。
INT:中断输出,用于中断微控制器。INT在内部中断寄存器各位都置位时,低电平有效。INT是开漏输出。
CLKOUT:SJA1000产生的提供给微控制器的时钟输出信号,时钟信号来源于内部振荡器且通过编程驱动,时钟控制寄存器的时钟关闭位可禁止该引脚。
SJA1000的其他引脚分别为:AD0~AD7,数据/地址复用总线;ALE/AS,Intel模式/Motorola模式的地址锁存信号;(RD)/E、WR,读写控制信号;CS,片选信号输入,低电平有效;XTAL1,输入到振荡器放大电路,外部振荡信号由此输入;XTAL2,振荡器放大电路的输出,使用外部振荡信号时左开路输出;VDD1、VDD2、VDD3,5V电压端;VSS1、VSS2、VSS3,与上述电压端相对的接地端。SJA1000有两种封装形式,分别是塑质双列直插封装和塑质小型线外封装。
1.2 SJA1000芯片功能介绍
SJA1000与它的前一款-PCA82C200独立控制器是兼容的。SJA1000具有很多新的功能,修改了两种模式:Basic CAN模式、PCA82C200兼容模式;增加了Peli CAN模式,此模式支持CAN 2.0B协议规定的所有功能(29字节的识别码)。
SJA1000的主要新功能:
*标准结构和扩展结构信息的接收和发送;
*具有64字节长度的接收队列;
*在标准和扩展格式中,都有单/双接收过滤器(含屏蔽和代码寄存器);
*读/写访问的错误计数器,可编程的错误限制报警,最近一次的误码寄存器;
*每一个CAN总线错误的错误中断;
*由功能位定义的仲裁丢失中断;
*一次性发送(当错误或仲裁丢失时不重发);
*只听模式(CAN总线监听,无应答,无错误标志);
*支持热插拔(无干扰软件驱动位速检测);
*硬件禁止CLKOUT输出。
下面只介绍Basic CAN模式,对于Peli CAN模式请查看参考文献[1]。
SJA1000复位,默认为Basic CAN械,或者通过时钟分频寄存器的CAN模式位来选择模式。此位清零时,为Basic CAN模式;置位时,为Peli CAN模式。在Basic CAN模式下,对SJA1000进行控制以及收发数据,都是通过对SJA1000内部寄存器的读/写访问来实现的。对于单片机而言,操作SJA1000就像访问外部RAM一样简单。有两种模式可以对SJA1000的内部寄存器访问,而在这两种模式下对其寄存器的访问是有区别的。这两种模式分别是复位模式和工作模式。当硬件复位,或控制器掉线,或置位复位请求位时,SJA1000进入复位模式;而当清除复位请求位时,SJA1000进入工作模式。SJA1000的寄存器分布于0~31连续的地址空间中。这32个字节可分为控制段(10字节)、发送缓冲器段(10字节)、接收缓冲器段(10字节)、时钟分频器和1个无效字节。在复位模式下可写的寄存器为控制段的控制寄存器、命令寄存器、接收代码寄存器、屏蔽寄存器、总线时序0、总线时序1、输出控制寄存器,还包括接收缓冲器和时钟分频器;而在工作模式下可写的寄存器为控制寄存器、命令寄存器、发送缓冲器段、接收缓冲器段和时钟分频器。
下面根据应用需要具体介绍SJA1000的控制寄存器、命令寄存器、状态寄存器、中断寄存器。
(1)控制寄存器(CR)
控制寄存器位于SJA1000寄存器区的0地址,用来设置CAN总线的模式和各种中断。其各位的意义如表1所列。
表1 控制寄存器各位说明(CR):CAN地址0
| 位 | 符号 | 名称 | 值 | 功 能 |
| CR7 | - | - | - | 保留 |
| CR6 | - | - | - | 保留 |
| CR5 | - | - | - | 保留 |
| CR4 | OIE | 溢出中断使能 | 1 | 使能。如果置位数据溢出位,微控制器接收溢出中断信号 |
| 0 | 禁止。微控制器不从SJA1000接收溢出中断信号 | |||
| CR3 | EIE | 错误中断使能 | 1 | 使能。若出错或总线状态改变,此中断信号有效 |
| 0 | 禁止。微控制器不从SJA1000接收错误中断信号 | |||
| CR2 | TIE | 发送中断使能 | 1 | 使能。当信息被成功发送或发送缓冲器又被访问时,产生中断信号 |
| 0 | 禁止。微控制器不从SJA1000接收发送中断信号 | |||
| CR1 | RIE | 接收中断使能 | 1 | 使能。信息被无错误接收时,产生此中断信号 |
| 0 | 禁止。此中断信号被禁止 | |||
| CR0 | RR | 复位请求 | 1 | 当前。SJA1000检测到复位请求后,忽略当前发送/接收信息,进入复位模式 |
| 0 | 空缺。复位请求位接收到一个下降沿后,SJA1000回到工作模式 |
在硬启动或总线状态位设置为1(总线关闭)时,复位请求位被置为1.在外部复位期间,微控制器不能把复位请求位置为0。如果要把复位请求位置为0,微控制器必须先检查这一位,以确定外部复位引脚不为低电平。复位请求位被设为0后,SJA1000将会等待:
1.1个总线空闲信号(11个弱势位),如果前一次复位请求是硬件复位或CPU初始复位;2.等待128个总线空闲,如果前一次复位请求是CAN控制器在重新进入总线开启模式前初始化总线造成的。
(2)命令寄存器(CMR)
命令寄存器对微控制来说是只写存储器。在复位模式和工作模式下都可对此寄存器进行访问,但是读这个地址返回值是“11111111”。表2是命令寄存器各位的说明。将睡眠模式位置为1,SJA1000进入睡眠模式,此时没有总线活动,没有中断等待。CMR.3位是用来清除由数据溢出状态位指出的数据溢出。如果数据溢出位被置位,就不会产生数据溢出中断了。在释放接收缓冲器命令的同时,可以发出清除数据溢出命令。读接收缓冲器之后,微控制器可以通过设置释放接收缓冲器为1,来释放接收队列当前信息的内存空间。
(3)状态寄存器(SR)
状态寄存器对微控制器来说是只读存储器,表3是状态寄存器各位的功能说明。当传输错误计数器超过限制(255)(总线状态位置1,即总线关闭),CAN控制器就会将复位请求位置1,在错误中断允许的情况下,会产生一个错误中断。这种状态会持续到CPU清除复位请求位。对于错误状态位,当至少有一个错误计数器满或超出CPU警告限制(96)时,错误状态位被置位。在中断使能的情况下,会产生错误中断。
表2 命令寄存器各位的功能说明(CMR):CAN地址1
| 位 | 符号 | 名称 | 值 | 功 能 |
| CMR.7 | - | - | - | 保留 |
| CMR.6 | - | - | - | 保留 |
| CMR.5 | - | - | - | 保留 |
| CMR.4 | GTS | 睡眠 | 1 | 睡眠。若没有CAN中断等待和总线活动,SJA1000进入睡眠模式 |
| 0 | 唤醒。清除数据溢出状态位 | |||
| CMR.3 | CDO | 清除数据溢出 | 1 | 清除。清除数据溢出状态位 |
| 0 | 无动作 | |||
| CMR.2 | RRB | 释放接收缓冲器 | 1 | 释放。接收缓冲器存放信息的内存空间将被释放 |
| 0 | 无动作 | |||
| CMR.1 | AT | 忽略发送 | 1 | 当前。若不是在处理过程中,等待处理的发送请求将取消 |
| 0 | 空缺。无动作 | |||
| CMR.0 | TR | 发送请求 | 1 | 当有。信息被发送 |
| 0 | 空缺。无动作 |
表3 状态寄存器各位的功能说明(SR):CAN地址2
| 位 | 符号 | 名称 | 值 | 功 能 |
| SR.7 | BS | 总线状态 | 1 | 总线关闭。SJA1000退出总线活动 |
| 0 | 总线开启。SJA1000加入总线活动 | |||
| SR.6 | ES | 出错状态 | 1 | 出错。至少出现一个错误计数器满或超过CPU报警限制 |
| 0 | 正常。两个错误计数器都在警限制以下 | |||
| SR.5 | TS | 发送状态 | 1 | 发送。SJA1000在传送信息 |
| 0 | 空闲。没有要发送的信息 | |||
| SR.4 | RS | 接收状态 | 1 | 接收。SJA1000正在接收信息 |
| 0 | 空闲。没有可接收的信息 | |||
| SR.3 | TCS | 发送完毕状态 | 1 | 完毕。最近一次发送请求被成功处理 |
| 0 | 未完毕。当前发送请求未处理完毕 | |||
| SR.2 | TBS | 发送缓冲器状态 | 1 | 释放。CPU可以向发送缓冲器写信息 |
| 0 | 锁定。CPU不能访问发送缓冲器,有信息正在等待发送或正在发送 | |||
| SR.1 | DOS | 数据溢出状态 | 1 | 溢出。信息丢失,因为RXFFIFO中没有足够的空间来存储 |
| 0 | 空缺。自从最后一次清除数据溢出命令执行,无数据溢出发生 | |||
| SR.0 | RBS | 接收缓冲器状态 | 1 | 满。RXFIFO中有可用信息 |
| 0 | 空。无可用信息 |
(4)中断寄存器(IR)
通过中断寄存器可识别中断源。当寄存器的1位或多位被置位时,INT(低电平有效)引脚被激活。寄存器被微控制器读过之后,所有会导致INT引脚上的电平变化的位被复位。中断寄存器对微控制而言是只读存储器。中断寄存器各位的功能说明如表4所列。
表4 中断寄存器各位的功能说明(IR):CAN地址3
| 位 | 符号 | 名称 | 值 | 功 能 |
| IR.7 | - | - | - | 保留 |
| IR.6 | - | - | - | 保留 |
| IR.5 | - | - | - | 保留 |
| IR.4 | WUI | 唤醒中断 | 1 | 置位。退出睡眠模式时此位被置位 |
| 0 | 复位。微控制器的任何读访问将清除此位 | |||
| IR.3 | DOI | 数据溢出中断 | 1 | 设置。当数据溢出中断使能位被置为1时,向数据溢出状态位传送“0-1”,此位被置位 |
| 0 | 复位。微控制器的任何读访问清除此位 | |||
| IR.2 | EI | 错误中断 | 1 | 置位。错误中断使能时,错误状态位或总线状态位的变化会置位此位 |
| 0 | 复位。微控制器的任何读访问清除此位 | |||
| IR.1 | TI | 发送中断 | 1 | 置位。发送缓冲器状态从0变为1(释放)和发送中断使能时,置位此位 |
| 0 | 复位。微控制器的任何读访问清除此位 | |||
| IR.0 | RI | 接收中断 | 1 | 置位。当接收FIFO不空和接收中断使能时置位此位 |
| 0 | 复位。微控制器的任何读访问清除此位 |
2 SJA1000在节点中的应用实例
该节点的微控制器选用了8位单片机AT89C51,SJA1000作为CAN总线控制器,并且使用了CAN接口芯片82C250。此节点可直接运用到CAN总线网络系统中,或者对此节点电路稍加变动来满足设计的要求。下面从硬件电路和软件设计两部分来介绍。
2.1 节点硬件电路设计
图2是节点的电路原理图。注意SJA1000复位端的连接,AT89C51是高电平复位,而SJA1000是低电平复位,因此复位信号要通过一个反相器与SJA1000的复位端相连。另外SJA1000的11脚MODE接高电平,选择Intel二分频模式。SJA1000的16脚是中断信号输出端,在中断允许情况下,有中断发生时,16脚出现由高电平到低电平的跳变,因此16脚可以直接与AT89C51的外部中断输入脚相连接。该设计中之所以选择82C250芯片,是因为其具有高速性(最高可达1 Mbps),具有抗瞬间干扰保护总线的能力,具有降低射频干扰的斜率控制。此外,它可以与110个节点相连,防止电池与地之间发生短路,当某一个节点掉电时,不会影响总线。在设计节点电路时,还要注意下面几点:
1.SJA1000通过光耦与82C250的连接是电流隔离的接法,这样可以防止线路间的串扰。在总线两端要接2个120Ω的总线阻抗匹配电阻。忽略掉它们会降低总线的抗干扰能力,甚至导致无法通信。
2.通过在地和82C250的8脚(RS)之间接不同阻值的电阻,可选择三种不同的工作方式:高速、斜率控制和待机,如表5所列。
表5 RS选择的三种工作方式
| RB提供条件 | 方 式 | R8上的电压或电流 |
| VRS>0.75Vcc 10μA<-IRS<200μA VRS<0.3VCC | 待机方式 斜率方式 高速方式 | IRS< 10μA 0.4VCC<VRS<0.6VCC -IRS<500μA |
在高速工作方式下,发送器输出晶体管简单地以尽可能快的速度启闭。在这种方式下,不采取任何措施限制上升和下降斜率。建议使用屏蔽电缆以避免射频干扰问题。通过将引脚8接地,可选择高速方式。
对于较低速度或较短总线长度,可用非屏蔽双绞线或平行线作总线。为降低射频干扰,应限制上升和下降斜率。上升和下降斜率可通过由引脚8至地连接的电阻进行控制。斜率正比于引脚8上的电流输出。
若引脚8加有高电平,则电路进入低电流待机方式。在这种方式下,发送器被关掉,而接收器转至低电流。由于在待机方式下,接收器是慢速的,因此,第一个报文将被丢失。
3.SJA1000的TX1脚悬空,RX1引脚的电位必须维持在约0.5Vcc上,否则,将不能形式CAN协议所要求的电平逻辑。

2.2 节点软件设计
根据节点电路原理图,SJA1000的首地址为0000H。用MCS-51汇编语言编制的初始化程序如下:
CR EQU 0000H ;控制寄存器
CMR EQU 0001H ;命令寄存器
SR EQU 0001H ;命令寄存器
SR EQU 0002H ;状态寄存器
IR EQU 0003H ;中断寄存器
ACR EQU 0004H ;接收代码寄存器
AMR EQU 0005H ;接收屏蔽寄存器
BTR0 EQU 0006H ;总线时序寄存器0
BTR1 EQU 0007H ;总线时序寄存器1
OCR EQU 0008H ;输出控制寄存器
MOV DPTR,#CR
MOV A,#1BH ;开放接收、出错、溢出中断
MOVX @DPTR,A ;置位复位请求,开始初始化
MOV DPTR,#ACR
MOV A,#03H ;接收代码寄存器为03H
MOVX #DPTR,A
INC DPTR
MOV A,#0FCH ;接收屏蔽寄存器为0FCH
MOVX @DPTR,A
INC DPTR
MOV A,#00H
MOVX @DPTR,A
INC DPTR
MOV A,#1CH ;500Kbps
MOVX @DPTR,A
INC DPTR
MOV A,#0AAH ;正常输出模式
MOVX @DPTR,A
MOV DPTR,#CR
MOV A,#1AH ;初始化结束,SJA1000进入工作状态
MOVX @DPTR,A
RET
注意:SJA1000初始化程序中,只有当控制寄存器CR中的复位请求为1时(SJA1000工作在复位模式),允许访问上述寄存器,否则既写不进去,也读不出正确的内容。在接收寄存器(RXB)为空,满足不述条件时,报文可被正确地接收。
报文接收条件:接收代码位(AC.7~AC.0)和信息识别码的高8位(ID.10~ID.3)相等,且与接收屏蔽位(AM7~AM.0)的相应位相或为1,则报文被接收。例如:在初始化程序中,ACR=03H,AMR=0FCH,由此只有信息识别码的高8位为XXXXXX11的数据帧被接收。BTR0的值可决定波特率预分频器(BRP)和同步跳转宽度(SJW)的数值;BTR1可决定位周期的宽度,采样点的位置及在每个采样点进行采样的次数。程序中BTR0=00H,BTR1=1Ch,则波特率为500Kbps。有一点必须要注意,系统中所有节点的BTR0和BTR1的内容都应用相同,否则将无法进行通信。对CR的第二次写访问是清除复位请求位,使SJA1000返回工作模式。