CAN总线及应用实例
(1)CAN特点
●CAN为多主方式工作,网络上任意智能节点均可在任意时刻主动向网络上其他节点发送信息,而不分主从,且无需站地址等节点信息,通信方式灵活。利用这特点可方便地构成多机备份系统。
●CAN网络上的节点信息分成不同的优先级(报文有2032种优先权),可满足不同的实时要求,高优先级的数据最多可在134,us内得到传输。
●CAN采用非破坏性总线仲裁技术,当多个节点同时向总线发送信息时,优先级较低的节点会主动地退出发送,大大节省了总线冲突仲裁时间。
●CAN只需通过报文滤波即可实现点对点、一点对多点及全局广播等几种方式收发数据,无需专门“调度”。
●CAN的直接通信距离最远可达l 0km(速率5kbp以下):通信速率最高可达Mbps(此时通信距离最长为40m) 。
●CAN上的节点数主要取决于总线驱动电路,目前可达110个;报文标识符可达2032种(CAN2.0A),而扩展(CAN2.0B)的报文标识符几乎不受限制。
(2)CAN总线协议
CAN协议以国际标准化组织的开放性互连模型为参照,规定了物理层、传输层和对象层,实际上相当于ISO网络层次模型中的物理层和数据链路层。图3.9 为CAN总线网络层次结构,发送过程中,数据、数据标识符及数据长度,加上必要的总线控制信号形成串行的数据流,发送到串行总线上,接收方再对数据流进行分析,从中提取有效的数据。CAN协议的一个最大特点是废除了传统的站地址编码,而代之以对通信数据块进行编码,数据在网络上通过广播方式发送。其优点是可使网络内的节点个数在理论上不受限制(实际中受网络硬件的电气特性限制),还可使同一个通信数据块同时被不同的节点接收,这在分布式控制系统中非常有用。CAN 2.0A版本规定标准CAN的标识符长度为11位,同时在2.0 B版本中又补充规定了标识符长度为29位的扩展格式,因此理论上可以定义2的11次方或2的19次方种不同的数据块。遵循CAN 2.0 B协议的CAN控制器可以发送和接收标准格式报文(11位标识符)或扩展格式报文(29位标识符),如果禁止CAN 2.0B则CAN控制器只能发送和接收标准格式报文而忽略扩展格式的报文,但不会出现错误。每个报文数据段长度为0-8个字节,可满足通常工业领域中控制命令、工作状态及检测数据传送的一般要求。同时,8个字节占用总线时间不长,从而保证了通信的实时性。CAN协议采用CRC检验并提供相应的错误处理功能,保证了数据通信的可靠性。
(3)报文传送和帧结构
CAN总线以报文为单位进行信息传送。报文中包含标识符,它标志了报文的优先权。CAN总线上各个节点都可主动发送。如同时有两个或更多节点开始发送报文,采用标识符ID来进行仲裁,具有最高优先权报文节点赢得总线使用权,而其他节点自动停止发送。在总线再次空闲后,这些节点将自动重发原报文。CAN系统中,一个CAN节点不使用有关系统结构的任何信息。报文中的标识符并不指出报文的目的地址,而是描述数据的含义。网络
中的所有节点都可有标识符来自动决定是否接收该报文。每个节点都有标识符寄存器和屏蔽寄存器,接收到的报文只有与该屏蔽的功能相同时,该节点才开始正式接收报文,否则它将不理睬标识符后面的报文。
CAN支持4种不同类型报文帧:数据帧、远程帧、出错帧、超载帧、帧间空间
1)数据帧用于在各个节点之间传送数据或命令,它有7个不同的位场组成:帧起始、仲裁场、控制场、数据场、CRC场、应答场和帧结束,如图3.10-13所示。
帧起始ACK场
图3.10 数据帧
●帧起始标志数据帧的开始。它由一个主控位构成。
●仲裁场由11位标识符(M)和远程发送请求位(RTR)组成,其中最高7位。
不能全是隐性位。M决定了报文的优先权。如主控位为0,隐性位为1,则M的数值越小,优先权越高。对数据帧,RTR为主控电平。
●控制场r1和r0为保留位,应发送主控电平。DLC为数据长度码n,它为0-80
●数据场允许的数据字节长度为0-8,由n决定。
●应答场包括应答位和应答分隔符。发送站发出的这两位均为隐性电平。而正确地接收到有效报文的接收站,在应答位期间应传送主控电平给发送站。应答分隔符为隐性电平。
●帧结束由7位隐性电平组成。
图3.11 仲裁场
扩展格式
图3.12仲裁场扩展格式
图3.13 控制场
以上为标准格式的数据帧,除此之外,在CAN规范2.0 B中,还定义了扩展格式的数据帧,它的标识符扩展为29位。它的前11位标识符后的两位为SRR和ME,它们均为隐性电平,后面为新增的18位标识符,其余与标准格式相同。
2)远程帧
帧起始ACK场
图3.14 远程帧
3)出错帧
图3.15 出错帧
1)超载帧
图3.16 超载帧
(4)CAN 通信接口
图3.17是CAN 通信部分电路,SJA1000是一种独立用于移动目标和一般工业环境中的区域网络控制。它是Philips 半导体公司
PCA82C200CAN 控制器(BasicCAN)的替代品,而且它增加了一种新的操作模式-PeliCAN ,这种模式支持具有很多新特性的CAN2.0B 的协议, 独立的CAN 控制器有 2 个不同的操作模式:BasicCAN 模式和PeliCAN 模式其中BasicCAN 模式可和PCA82c250相兼容BasicCAN 模式是上电后默认的操作模式,因此用PCA82C250(是协议控制器和物理传输线路之间收发器)开发的已有硬件和软件可以直接在SJA1000 上使用而不用作任何修改;PeliCAN 模式是新的操作模式它能够处理所有CAN2.0B 规范的帧类型而且它还提供一些增强功能和SJA1000 能应用于更宽的领域。
图3.17 CAN 通信部分电路
1)SJA1000 的特征能分成3组:
①已建立的PCA82C200 功能这组的功能已经在PCA82C200 里实现。
② 改良的PCA82C200 功能这组功能的部份已经在PCA82C200 里实现但是在SJA1000里这些功能在速度大小和性能方面得到了改良。
③PeliCAN 模式的增强功能在PeliCAN 模式里SJA1000 支持一些错误分析功能支持系统
诊断系统维护系统优化而且这个模式里也加入了对一般CPU 的支持和系统自身测试的功能。
SJA1000管脚:
AD0----AD7:地址/数据复用信号
ALE/AS:ALE输入信号(Intel模式),AS输入信号(Motorola模式)
/CS:片选信号,低电平有效
/RD:微控制器的/RD信号(Intel模式),或E使能信号(Motorola模式)
/WR:微控制器的/WR信号(Intel模式),或R/W使能信号(Motorola模式)
CLKOUT:提供给微控制器的时钟输出信号,通过可编程分频器由内部晶振产生;时钟分频寄存器的时钟关闭位可禁止该引脚。
V SS1:接地端,V SS2:输入比较器接地端,V SS3:输出驱动器接地端。
V DD1:逻辑电路的5V电源,V DD2输入比较器5V电源,V DD3输出驱动器5V电源。
XTAL1,2:分别位振荡器放大电路输入输出。
MODE:模式选择输入,1= Intel模式,0= Motorola模式。
TX0,TX1: 由输出驱动器0、1到物理线路的输出端。
/INT:中断输出,开漏输出。
/RST:复位输入。
RX0,RX1:由物理总线到SJA1000输入比较器的输入端,显性电平将会唤醒SJA1000的睡眠模式;如果RX1>RX0的电平高,读出为显性电平,反之读出的隐性电平;如果时钟分频寄存器的CBP位被置位,就忽略CAN输入比较器以减少内延时(此时连有外部收发电路);这种情况下只有RX0是激活的;隐性电平被认为是高,而显性电平被认为是低。
PCA82C250/251收发器是协议控制器和物理传输线路之间的接口,对总线提供差动发送能力,对CAN控制器提供差动接收能力,可连接110个节点。
PCA82C250/251管脚:
TXD:发送数据输入
GND:地
Vcc:电源4.5——5.5 V
RXD:接收数据输出
Vref:参考电压输出
CANH:低电平CAN电压输入/输出
CANH:高电平CAN电压输入/输出
Rs:斜率电阻输入,接地选择高速工作模式
2)SJA1000 的基本功能和寄存器:
①BasicCAN 功能说明
表3.3 为SJA1000寄存器说明。
表3.3 SJA1000寄存器说明
[1] 控制寄存器(CR):如
[2] 命令寄存器(CMR):如表3.5所示。
[3] 状态寄存器(SR):如表3.6所示。
表3.6 状态寄存器
[4]中断寄存器(IR):如
[5]验收代码寄存器(ACR):如
复位请求位被置高(当前)时,该寄存器可以访问。如果一条报文通过了接收滤波器的测试而且接收缓冲器有空间,描述符和数据将被分别顺次写入RXFIFO,当报文被正确的接收完毕,则有:接收状态位置高(满);接收中断使能位置高(使能),接收中断置高(产生中断)。
验收代码(AC.7~AC.0)和报文标识符的高8位(ID.10~ID.3)必须相等,或验收屏蔽位(AM.7~AM.0)的所有位为1。即如果满足以下方程的描述,则予以接收。
[(ID.10~ID.3)≡(AC.7~AC.0)] ∨(AM.7~AM.0)≡11111111
[6]验收屏蔽寄存器(AMR):如表3.9所示。
验收屏蔽寄存器
复位请求位被置高(当前)时,该寄存器可以访问。验收屏蔽寄存器定义验收代码寄存器的哪些位对接收过滤器是“相关的”或“无关的”(即可为任意值)
当AM.i=0时,是“相关的”
当AM.i=1时,是“无关的”(i=0~7)
[7]发送缓冲区:如表3.10所示。
标识符(ID):11位,就像报文的名字,值越低,优先级越高。
远程发送请求(RTR):当RTR=1,总线以远程帧发送数据。如果RTR没有被置位,数据将以数据长度码规定的长度来传送数据帧。
数据长度码(DLC):数据字节数=8×DLC.3+4×DLC.2+2×DLC.1+DLC.0 报文数据区的字节数根据数据长度码编制。在远程帧传送中,因为RTR被置位,数据长度码是不被考虑的。这就迫使发送/接收数据字节数为0。然而,数据
长度码必须正确设置,以避免两个CAN控制器用同样的识别机制启动
远程帧传送而发生总线错误。数据字节数是0-8。
数据区:传送的数据字节数由数据长度码决定。发送的第一位是地址12单元的数据字节1的最高位。
③BasicCAN 和PeliCAN公用寄存器
[1]总线时序寄存器0(BTR0):如表3.11所示。
表3.11 总线时序寄存器0
位域BRP 使得CAN 系统的时钟的周期时t SCL 是可编程的:
)10.1.22.43.84.165.32(2++?+?+?+?+??=BRP BRP BRP BRP BRP BRP t t CLK SCL XTAL CLK f XTAL t /1==
同步跳转宽度位域
为了补偿在不同总线控制器的时钟振荡器之间的相位漂移,任何总线控制器必须在当前传送的任一相关信号边沿重新同步。同步跳转宽度SJW t 定义了一个位周期可以被一次重新同步缩短或延长的时钟周期的最大数目。 )10.1.2(++??=SJW SJW t t SCL SJW
[2]总线时序寄存器1(BTR1):如表3.12、13所示。
总线时序寄存器1定义了一个位周期的长度、采样点的位置和在每个采样点的采样数目。在复位模式中,这个寄存器可以被读/写访问。在PeliCAN 模式的操作模式中,该寄存器是只读的,在BasicCAN 模式的操作模式中总是“FFH ”
时间段SCL SYNCSEG t t ?=1
)10.11.122.143.18(1++?+?+??=TSEG TSEG TSEG TSEG t t SCL TSEG )10.21.222.24(2++?+??=TSEG TSEG TSEG t t SCL TSEG
[3]输出控制寄存器(OCR ):如表3.14-16所示。
允许软件控制建立不同输出驱动的配置。在复位模式中,这个寄存器可以被读/写访问。在PeliCAN 模式的操作模式中,该寄存器是只读的,在BasicCAN 模式的操作模式中总是“FFH ”。
表3.14 输出控制寄存器
在SJA1000在睡眠模式中,TX0、TX1根据输出控制寄存器的内容输出隐性的电平。在复位 状态(复位请求=1)或外部复位引脚/RST 被拉低时,TX0、TX1悬空。
[4]时钟分频寄存器:如表3.17-18所示。
表3.17 时钟分频寄存器
3)BASICCAN程序设计:CAN应用节点的程序主要包括初始化、发送、接收子程序。
①CAN初始化子程序
NODE EQU 30H;节点号缓冲区
NBTR0 EQU 31H;总线定时寄存器0缓冲区
NBTR1 EQU 32H;总线定时寄存器1缓冲区
TXBF EQU 40H;RAM内发送缓冲区
RXBF EQU 50H;RAM内接收缓冲区
CR EQU 0BF00H;控制寄存器
CMR EQU 0BF01H;命令寄存器
SR EQU 0BF02H;状态寄存器
IR EQU 0BF03H;中断寄存器
ACR EQU 0BF04H;接收码寄存器
AMR EQU 0BF05H;接收码屏蔽寄存器
BTR0 EQU 0BF06H;总线定时寄存器0
BTR1 EQU 0BF07H;总线定时寄存器1
OCR EQU 0BF08H;输出控制寄存器
CDR EQU 0BF1FH;时钟分频寄存器
RXB EQU 0BF14H;接收缓冲器
TXB EQU 0BF0AH;发送缓冲器
入口:节点号在NODE,波特率在NBTR0、NBTR1
出口:无
CANINI:MOV DPTR,#CR;写控制寄存器
MOV A,#01H;置复位请求为高
MOVX @DPTR,A
CANI1:MOVX A,@DPTR;判断复位请求有效
JNB ACC.0,CANI1
MOV DPTR,#ACR;写验收码寄存器
MOV A,NODE;设置节点号
MOVX @DPTR,A
MOV DPTR,#AMR;写接收码屏蔽寄存器
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#BTR0;写总线定时寄存器0
MOV A,NBTR0;设置波特率
MOVX @DPTR,A
MOV DPTR,#BTR1;写总线定时寄存器1
MOV A,NBTR1
MOVX @DPTR,A
MOV DPTR,#OCR;写输出控制寄存器
MOV A,#0FAH
MOVX @DPTR,A
MOV DPTR,#CDR;写时钟分频寄存器
MOV A,#00H;将CAN工作模式设为BASICCAN模式时钟2分频MOVX @DPTR,A
MOV DPTR,#CR;写控制寄存器
MOV A,#0EH;开放中断源
RET
②CAN接收子程序:入口:无出口:接收的描述符、数据长度及数据放在RXBF开始的缓冲区中。
RXSB:MOV DPTR,#SR;读状态寄存器判接收缓冲区满
MOVX A,@DPTR
JNB ACC.0,RXSB
RXSB1:MOV DPTR,#RXB:将接收的数据放在cpu的RAM区
MOV R0,#RXBF
MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
MOVX A,@DPTR
MOV @R0,A
MOV B,A
RXSB2:INC DPTR
INC R0
MOVX A,@DPTR
MOV @R0,A
DJNZ B,RXSB2
MOV DPTR,#CMR;接收完毕释放接收缓冲区
MOV A,#04H
MOVX @DPTR,A
MOV DPTR,#SR;读此状态寄存器
MOVX A,@DPTR
JB ACC.1,DA TAOVER;判断数据溢出
JB ACC.7,BUSWRONG;判断总线状态
JB ACC.6,CNTWRONG;判断错误计数器状态
SJMP RECEEND
DA TAOVER:做相应的数据溢出错误处理
SJMP RECEEND
BUSWRONG: 做总线错误处理
SJMP RECEEND
CNTWRONG:做计数错误处理
RECEEND:RET
③CAN发送子程序:
入口:将要发送的描述符放在TXBF, 将要发送的数据长度放在TXBF+1, 将要发送的数据放在TXBF+2开始的单元。
出口:无
TXSB:MOV DPTR,#SR;读状态寄存器
MOVX A,@DPTR;判发送缓冲区状态
JNB ACC.2,TXSB
MOV R1,#TXBF
TX1:MOV A,@R1;向发送缓冲区10填入标识符MOVX @DPTR,A
INC R1
INC DPTR
MOV A,@R1;向发送缓冲区11填入标识符
MOVX @DPTR, A
MOV B,A
TX2:INC DPTR
INC R1
MOV A, @R1;向发送缓冲区12-19送数据
MOVX @DPTR ,A
DJNZ B,TX2
MOV DPTR,#CMR;置CMR.0为1请求发送
MOV A,#01H
MOVX @DPTR,A
RET