基于CAN总线数据采集系统的设计与实现精品文档格式.docx
《基于CAN总线数据采集系统的设计与实现精品文档格式.docx》由会员分享,可在线阅读,更多相关《基于CAN总线数据采集系统的设计与实现精品文档格式.docx(35页珍藏版)》请在冰豆网上搜索。
●远程数据请求;
●配置灵活;
●全系统的数据相容性;
●错误检测和出错信令;
●发送期间若丢失仲裁或由于出错而遭破坏的帧可自动重发送;
●暂时错误和永久性故障节点的判别以及故障节点的自动脱离CAN总线。
(二)CAN协议
数据传输的通信协议是指对数据传输的约定,包括定时、控制、格式化和数据表示方法等等。
1.CAN分层结构的协议
CAN是一串行通讯协议CAN总线规范规定了任意两个节点之间的兼容性,包括电气特性及数据解释协议,为保证设计使用的透明性及使用的灵活性,CAN协议分为如下几层:
目标层、传送层、物理层。
目标层的功能范围包括:
信息识别、信息状态及处理。
传送层的功能范围包括:
帧组织、总线仲裁、检错、错误报告、错误处理。
物理层的功能范围包括:
实际位传送过程上的电气特性。
2.CAN网络通讯协议
总线控制器支持4种不同结构的CAN协议帧类型:
数据帧用于节点之间的数据传输
远程帧:
用于请求发送具有相同标识符的数据帧
出错帧:
用于指示检测到的错误状态
过载帧:
用于提供先前和后续数据帧或远程帧之间的附加延时
数据帧、远程帧、出错帧、过载帧都按一定的格式进行编码
数据帧:
由7个不同的位场构成,如图1所示。
它们是:
帧起始、仲裁场、控制场、CRC场、ACK场和帧结束;
由6个不同的位场构成:
帧起始、仲裁场、控制场、CRC场、ACK场、
帧结束
由两个不同的场构成。
第一个场由来自不同节点的错误标志叠加给出,后随的第二个场为错误定界符
超载帧:
包括两个位场、超载标志和超载界定符。
数据帧和远程帧以帧间空间同先前帧隔开,帧编码和发送/接收。
图1数据帧的构成
帧起始、仲裁场、控制场、数据场、序列帧段均以位填充方法进行编码,即在以送位流中检测到5个数值相同的时候,自动插人一个补码位。
数据帧或远程帧的其余位场、错误帧、超载帧为固定格式,不使用位填充方法编码,帧中的位流按照非归零方法编码。
发送时从其SOF场开始逐个位场发送。
对于发送器和接收器,一帧的有效点是不同的。
对于发送器,若在帧结束完成前不存在错误,则该帧有效。
对于接收器,若在帧结束最后一位前不存在错误,则该帧有效。
总线访问和仲裁:
当检测到间歇场未被“显性”位中断后,认为总线被所有节点释放。
总线被释放后,“错误一激活”节点可以访问总线。
当许多节点一起开始发送时,只有发送具有最高优先权的帧节点变为总线主机,享有对总线的控制权。
这种解决总线访问冲突的机理是基于竞争的促裁,依据标识符和紧随其后的RTR位来完成。
错误检测:
在CAN中存在5类不同的错误位错误、填充错误、CRC错误、形式错误、应答错误、
在网络中的任何一个节点,根据其错误计数器的数值,可能处于下列3种状态之一:
“错误一激活”节点:
一个“错误一激活”节点可以正常参与总线通信,并在检测到错误时,发出一个激活错误标志。
“错误一认可”节点:
一个“错误一认可”节点不应发送激活错误标志,它参与总线通信,但在检测到错误时,发出一个认可错误标志。
“总线脱离”节点:
当一个节点由于请求故障界定实体而对总线处于关闭状态时,其处于“总线脱离”状态,在“总线脱离”状态。
为了进行错误界定,在总线上的每一个单元中都设有两种计数器:
发送出错计数器和接收出错计数器,错误计数器的值按照一定的规则进行修正。
当节点的发送计数器或接收计数器的值超过127时,则监控器要求置相应节点为“错误一认可”状态,送出一个激活标志。
当发送计数器或接收计数器的值均小于或等于127时,“错误一认可”节点再次变为“错误一激活”。
当节点的发送计数器的值超过255时,则监控器要求置相应节点为“脱离总线”状态。
处于“脱离总线”状态的节点,在监测到总线上出现128次11个连续的“隐性”位,
变为两个错误计数器均为0的“错误一激活”节点。
三、结构设计
数据采集系统由数据采集模块和数据传输模块组成,其中数据传输通过CAN(ControllerAreaNetwork)总线来实现。
控制器局域网CAN属于现场总线范畴,它是一种有效支持分布式控制或实时控制的串行通信网络。
系统采用总线式网络拓扑结构,其系统总体结构如图2所示。
图2系统总体结构
选用CAN总线连接各节点,形成多主控制器的局域网。
CAN总线符合ISO11898标准,最多可挂接110个节点,采用CAN总线特有的多主传送方式,各采集控制器根据现场需要,当有数据时可自主发送,无需主机不停地轮巡,节省了网络上的数据流量,提高了传输效率。
CAN总线传输介质为双绞线或同轴电缆,走线少、系统易扩展、改型灵活,正是由于这些其他通信方式无法比拟的优点,才使之成为系统分布比较分散的数据采集系统的理想总线。
数据采集系统将由现场传感器送来的数据发送到空闲的CAN总线上,而总线上各节点通过预先设置好的验收码和验收屏蔽码,来决定是否使用这个消息。
如果采集的数据需要进一步进行处理,则上位机可从总线上接收数据并对其处理。
处理后的数据再送回CAN总线,经数模转换模块或其他节点进行控制操作。
当上位机需对某个节点施以控制时,可采用点对点的方式与该节点进行通讯;
而当它需要对所有节点加以控制时,则采用广播方式将命令发送到总线。
这样大大减少了数据的传输量,从而提
高了系统的传输速率,同时又保证了系统的实时性和可靠性。
下面以数据采集系统中的数据采集节点为例来说明单个节点的设计思想。
四、硬件设计
数据采集系统单个节点硬件框图如图3所示,由传感器检测的信息经多路开关送到可编程放大器PGA204,根据信号大小调节放大倍数(1,10,100,1000倍),放大后,经AD574转换为数字信号,送入微处理器中存储,然后根据现场情况的需要,将信号发送到CAN总线上,被其他节点或上位机接收。
图3节点硬件框图
由于以AD574为A/D转换器的数据采集卡比较普及,故下面重点阐述数据传输部分,即CAN总线智能节点的设计与实现。
CAN总线上的节点是网络上的信息接收和发送站,由于节点主要由单片机和可编程的CAN通信控制器组成,能通过编程设置工作方式、ID地址、波特率等参数,故称其为智能节点。
CAN节点原理图如图4所示。
89C51是节点的微处理器,作为一个存储器I/O映象设备,负责对控制器SJA1000初始化,并控制其实现数据的收发等通信任务。
在CAN总线通信接口中,使用PHILIPS公司的SJA1000和TJA1040芯片。
SJA1000是独立的CAN通信控制器,用于完成CAN总线通信协议的物理层和数据链路层的功能。
TJA1040为高性能、高速CAN收发器,使用它可增大通信距离,提高系统瞬间抗干扰能力,改良系统的抗电磁干扰及电磁辐射性能,保护总线,降低射频干扰,实现热防护等。
图4CAN节点原理图
为进一步提高抗干扰能力,在CAN控制器SJA1000和驱动器TJA1040之间使用了高速光耦器件6N137构成隔离电路,传输介质采用双绞线(或同轴电缆)分别接至CAN收发器TJA1040的CANH和CANL引脚。
同时在总线两端CANH和CANL之间加上分离中断的1208终端电阻,对总线阻抗匹配起着相当重要的作用[4]。
此外,为使CAN控制器和微处理器能同时可靠复位,外加了手动复位电路。
SJA1000的中断输出信号(/NT)接至单片机的中断引脚INT0,通过中断方式实现单片机与CAN控制器的通信。
在电路实际调试过程中须注意以下几点。
1.总线的两个1208终端电阻不可忽略。
否则会使数据通信的抗干扰性和可靠性降低,严重时可导致无法通信。
2.TJA1040(与PCA82C250兼容)的“SPLIT”引脚(代替82C250“Vref”引脚),对总线DC稳压很有效[4]。
如果“SPLIT”用于共模电压的DC稳压,这个“SPLIT”引脚要连接到分离中断的中间分接头。
若“SPLIT”不使用,只需保持开路即可。
3.TJA1040引脚“STB”一般被直接连接到微处理器输出口,以便于控制收发器的工作模式。
五、软件设计
CAN总线节点的软件设计主要包括三大部分:
CAN节点初始化、报文发送和报文接收。
熟悉这三部分程序的设计,就能编写出利用CAN总线进行通信的一般应用程序。
当然要将CAN总线应用于通信任务比较复杂的系统中还需详细了解有关CAN总线错误处理、总线脱离处理、接收滤波处理、波特率参数设置和自动检测以及CAN总线通信距离和节点数的计算等方面的内容。
下面仅就前面提到的三部分程序的设计作一个描述,以供大家在实际应用中参考。
(一)初始化子程序
SJA1000的初始化只有在复位模式下才可以进行。
初始化主要包括工作方式的设置接收滤波方式的设置,接收屏蔽寄存器AMR和接收代码寄存器ACR的设置,波特率参数设置和中断允许寄存器IER的设置等。
在完成SJA1000的初始化设置以后SJA1000就可以回到工作状态进行正常的通信任务。
下面提供了SJA1000初始化的51汇编源程序。
程序中寄存器符号表示的是SJA1000相应寄存器占用的片外存贮器地址这些符号可在程序的头部用伪指令EQU进行定义。
后文对这一点不再作特别说明。
CANINI:
MOVDPTR,#MOD;
方式寄存器
MOVA,#09H;
进入复位模式对SJA1000进行初始化.
MOVX@DPTR,A
MOVDPTR,#CDR;
时钟分频寄存器
MOVA,#88H;
选择PeliCAN模式关闭时钟输出CLKOUT
MOVDPTR,#IER;
中断允许寄存器
MOVA,#0DH;
开放发送中断超载中断和错误警告中断
MOVDPTR,#AMR;
接收屏蔽寄存器
MOVR6,#4
MOVR0,#DAMR;
接收屏蔽寄存器内容在片内RAM中的首址
AMR:
MOVA@R0
MOVX@DPTR,A;
接收屏蔽寄存器赋初值
INCDPTR
DJNZR6,AMR
MOVDPTR,#ACR;
接收代码寄存器
MOVR6,#4
MOVR0,#DACR;
接收代码寄存器内容在片内RAM中的首址
ACR:
MOVA,@R0
MOVX@DPTR,A;
接收代码寄存器赋初值
INCDPTR
DJNZR6,ACR
MOVDPTR,#BTR0;
总线定时寄存器0
MOVA,#03H
MOVDPTR,#BTR1;
总线定时寄存器1
MOVA,#0FFH;
16MHz晶振情况下设置波特率为80kbps.
MOVDPTR,#OCR;
输出控制寄存器
MOVA,#0AAH
MOVX@DPTR,A
MOVDPTR,#RBSA;
接收缓存器起始地址寄存器
MOVA,#0;
设置接收缓存器FIFO起始地址为0
MOVDPTR,#TXERR;
发送错误计数寄存器.
MOVA,#0;
清除发送错误计数寄存器
MOVDPTR,#ECC;
错误代码捕捉寄存器
MOVXA,@DPTR;
清除错误代码捕捉寄存器
MOVDPTR,#MODE;
MOVA,#08H;
设置单滤波接收方式并返回工作状态
RET
(二)发送子程序
发送子程序负责节点报文的发送,发送时用户只需将待发送的数据按特定格式组合成一帧报文送入SJA1000发送缓存区中,然后启动SJA1000发送即可。
当然在往SJA1000发送缓存区送报文之前必须先作一些判断。
如下文程序所示,发送程序分发送远程帧和数据帧两种:
远程帧无数据场。
下面以发送数据帧为例对发送子程序作一个说明。
TDATA:
MOVDPTR,#SR;
状态寄存器
MOVXA,@DPTR;
从SJA1000读入状态寄存器值
JBACC.4,TDATA;
判断是否正在接收正在接收则等待
TS0:
MOVXA,@DPTR
JNBACC.3,TS0;
判断上次发送是否完成未完成则等待发送完成
TS1:
JNBACC.2,TS1;
判断发送缓冲区是否锁定锁定则等待
TS2:
MOVDPTR,#CANTXB;
SJA1000发送缓存区首址
MOVA,#88H;
发送数据长度为8个字节的扩展帧格式报文
MOVX@DPTR,A
MOVA,#ID0;
4个字节的标识符ID0-ID3
MOVA,#ID1
MOVA,#ID2
MOVA,#ID3
MOVX@DPTR,A
MOVR0,#TRDATA;
CPU发送数据区首址
MTBF:
MOVA,@R0
INCR0
CJNER0,#TRDATA+8MTBF;
向发送缓冲区写8个字节
MOVDPTR,#CMR;
命令寄存器地址
MOVA,#01H
MOVX@DPTR,A;
启动SJA1000发送
RET
(三)查询方式接收子程序
接收子程序负责节点报文的接收以及其它情况处理,接收子程序比发送子程序要复杂一些。
因为在处理接收报文的过程中,同时要对诸如总线脱离、错误报警、接收溢出等情况进行处理SJA1000报文的接收主要有两种方式:
中断接收方式和查询接收方式。
如果对通信的实时性要求不是很强,建议采用查询接收方式。
两种接收方式编程的思路基本相同,下面仅以查询方式接收报文为例对接收子程序作一个说明。
SEARCH:
MOVDPTR,#SR;
状态寄存器地址
MOVXA,@DPTR
ANLA,#0C3H;
读取总线脱离错误状态接收溢出JNZPROC
RET;
无上述状态结束
PROC:
JNBACC.7,PROCI
BUSERR:
MOVDPTR,#IR;
IR中断寄存器出现总线脱离
MOVXA,@DPTR;
读中断寄存器清除中断位.
MOVDPTR,#MODE;
方式寄存器地址
MOVA,#08H
MOVX@DPTR,A;
将方式寄存器复位请求位清0
LCALLALARM.;
调用报警子程序
RET
NOP
PROCI:
MOVDPTR,#IR;
总线正常
MOVXA,@DPTR;
读取中断位
NBACC.3,OTHER
OVER:
MOVDPTR,#CMR;
数据溢出中断置位.
MOVA,#0CH
MOVX@DPTR,A;
在命令寄存器中清除数据溢出RET
OTHER:
JBACC.0,RECE;
IR.0=1接收FIFO未满或接收
LJMPRECOUT;
IR.0=0接收缓冲区无数据退出接收
RECE:
MOVDPTR,#CANRXB;
接收缓冲区首地址16准备读取数
MOVXA,@DPTR;
首字节是接收帧格式字
JNBACC.6,RDATA;
RTR=1是远程请求帧无数据
MOVDPTR,#CMR
MOVA,#04H;
CMR.2=1释放接收缓冲区
MOVX@DPTR,A;
只有接收了数据才能释放接收缓冲区
LCALLTDATA;
发送对方请求的数据
LJMPRECOUT;
退出接收
RDATA:
MOVDPTR,#CANRXB;
读取并保存接收缓冲区的数据
MOVR1,#CPURBF;
CPU片内接收缓冲区首址
MOVXA,@DPTR;
读取读取CAN缓冲区的2号字节
MOV@R1,A;
保存
ANLA,#0FH;
截取低4位是数据长度0~8
ADDA,#4;
加4个字节的标识符ID
MOVR6,A
INCDPTR
INCR1
MOVXA,@DPTR
MOV@R1,A
DJNZR6,RDATA0;
循环读取与保存
MOVDPTR,#CMR
MOVA,#04H;
释放CAN接收缓冲区
MOVX@DPTR,A
RECOUT:
MOVDPTR,#ALC
MOVXA,@DPTR
MOVDPTR,#ECC
RET
需要注意的是:
SJA1000的初始化只有在复位模式下才可以进行。
在对SJA1000寄存器设定前,主控制器通过读复位模式ö
请求标志来检查SJA1000是否已达到复位模式