CAN总线数据通信系统的设计.docx
- 文档编号:11423013
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:19
- 大小:24.76KB
CAN总线数据通信系统的设计.docx
《CAN总线数据通信系统的设计.docx》由会员分享,可在线阅读,更多相关《CAN总线数据通信系统的设计.docx(19页珍藏版)》请在冰豆网上搜索。
CAN总线数据通信系统的设计
封面
作者:
PanHongliang
仅供个人学习
CAN总线数据通信系统的设计
摘要
现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。
它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。
CAN(ControllerAreaNetwork)属于现场总线的范畴,是一种多主方式的串行通讯总线,数据通信实时性强。
与其它现场总线比较而言,CAN总线具有通信速率高、容易实现、可靠性高、性价比高等诸多特点。
本系统要在单片机中实现CAN总线的接口,通过CAN总线,实现两个模块之间的数据通讯。
系统主要由四部分所构成:
PC机、微控制器80C51、独立CAN通信控制器SJA1000和CAN总线收发器PCA82C250。
微处理器80C51负责SJA1000的初始化,通过控制SJA1000实现数据的发送和接收等通信任务。
CAN总线节点的软件设计主要包括三大部分:
CAN节点初始化、报文发送和报文接收。
本系统通过扩展CAN总线控制器SJA1000,在单片机系统中实现了CAN总线的接口,并且编写了SJA1000的驱动程序,通过读写其的内部寄存器,完成工作方式的设置、接收滤波方式的设置、接收屏蔽寄存器(AMR)和接收代码寄存器(ACR)的设置、波特率参数设置和中断允许寄存器(IER)的设置等基本操作;利用各基本操作,完成了对SJA1000的初始化,并且实现了数据发送和接收。
目录
第1章原理与方案1
1.1设计目的与要求1
1.2CAN总线介绍1
1.3设计方案2
1.3.1硬件设计方案2
1.3.2软件设计方案4
第2章硬件连接与说明5
2.1硬件连接5
2.1.1模块使用说明6
2.1.2实验箱连线6
2.2CAN总线控制器SJA10006
2.3CAN控制器接口PCA82C2507
第3章软件流程图及说明8
3.1软件流程图8
3.1.1主程序流程图8
3.1.2初始化子程序流程图8
3.1.3发送数据子程序流程图10
3.1.4接收数据子程序流程图10
3.2软件实现过程10
第4章结果分析及心得体会12
4.1结果分析12
4.2心得体会13
4.2.1CAN应用中的问题14
4.2.2CAN总线的其他应用14
附录程序清单15
参考文献23
第1章原理与方案
1.1设计目的与要求
扩展CAN总线控制器,在单片机系统中实现CAN总线的接口,并编写接口芯片的驱动程序。
通过CAN总线,实现两个模块之间的数据通讯,CPU控制第一个模块发送1帧数据,第二个模块收到这帧数据并送至另一个CPU的内部存储器。
1.2CAN总线介绍
CAN全称为“ControllerAreaNetwork”,即控制器局域网,是国际上应用最广泛的现场总线之一。
最初CAN被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。
比如发动机管理、系统变速箱控制器、仪表装备中,均嵌入CAN控制装置。
一个由CAN总线构成的单一网络中,理论上可以挂接无数个节点。
实际应用中,节点数目受网络硬件的电气特性所限制。
例如当使用PhilipsPCA82C250作为CAN收发器时,同一网络中允许挂接110个节点。
CAN可提供高达1Mbit/s的数据传输速率,这使实时控制变得非常容易,另外硬件的错误检定特性也增强了CAN的抗电磁干扰能力。
CAN是一种多主方式的串行通讯总线。
基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误。
当信号传输距离达到10Km时,CAN仍可提供高达50Kbit/s的数据传输速率。
由于CAN总线具有很高的实时性能,因此CAN已经在汽车工业、航空工业、工业控制、安全防护等领域中得到了广泛应用。
1.3设计方案
在本系统中,采用80C51单片机,80C51与PC机串行通信,设置SJA1000工作于Intel模式,由PC机发送的数据写入SJA1000并通过CAN收发器发送。
接收数据是通过中断进行的,CAN总线传输过来的数据经CAN接口芯片PCA82C250接收并写入SJA1000的RXFIFO,然后通过中断提请CPU读取,读取的数据上传送给PC机。
总体设计框图如图1-2所示。
图1-2总体设计框图
1.3.1硬件设计方案
1.芯片介绍
SJA1000:
独立式CAN控制器,具有64字节的FIFO作为接收缓存。
6N137:
高速光隔,最高速度10Mb/s,用于保护CAN控制器。
PCA82C250:
CAN总线收发器,是CAN控制器与CAN总线的接口器件,对CAN总线差分式发送。
2.CAN控制器与CPU接口设计
对于CPU来说,CAN控制器是确保双方独立工作的存贮器映象外围设
备。
CAN控制器与外部CPU的接口是通过控制器接口逻辑(CIL)实现的,80C51的CPU通过将地址总线(AB)和数据总线(DB)连接到CIL上来完成与CAN控制器之间的信息交换,不需要专门的控制总线(CB),CPU与PCA82C250之间的状态、控制和命令信号的交换在CAN控制器中完成。
SJA1000与单片机的接口电路如图1-3所示。
图1-3SJA1000与单片机的接口电路
3.CAN控制器工作电路的连接
为了增强CAN总线节点的抗干扰能力,SJA1000的TX0和RX0并不是直接与PCA82C250的TXD和RXD相连,而是通过高速光隔6N137后与PCA82C250相连,这样就很好的实现了总线上各CAN节点间的电气隔离。
若PCA82C250处于CAN总线的网络终端,总线接口部分需加一个120欧姆的匹配电阻。
CAN控制器工作电路如下图所示:
图1-4CAN控制器工作电路
1.3.2软件设计方案
CAN总线节点的软件设计主要包括三大部分:
CAN节点初始化、报文发送和报文接收。
熟悉这三部分程序的设计就能编写出利用CAN总线进行通信的一般应用程序。
当然要将CAN总线应用于通信任务比较复杂的系统中,还需详细了解有关CAN总线错误处理、总线脱离处理、接收滤波处理、波特率参数设置和自动检测以及CAN总线通信距离和节点数的计算等方面的内容。
SJA1000的初始化只有在复位模式下才可以进行,初始化主要包括工作方式的设置、接收滤波方式的设置、接收屏蔽寄存器(AMR)和接收代码寄存器(ACR)的设置、波特率参数设置和中断允许寄存器(IER)的设置等。
在完成SJA1000的初始化设置以后,SJA1000就可以回到工作状态,进行正常的通信任务。
发送子程序负责节点报文的发送。
发送时用户只需将待发送的数据按特定格式组合成一帧报文,送入SJA1000发送缓存区中,然后启动SJA1000发送即可。
接收子程序负责节点报文的接收以及其它情况处理。
接收子程序比发送子程序要复杂一些,因为在处理接收报文的过程中,同时要对诸如总线脱离、错误报警、接收溢出等情况进行处理。
SJA1000报文的接收主要有两种方式:
中断接收方式和查询接收方式,两种接收方式编程的思路基本相同,如果对通信的实时性要求不是很强,一般采用查询接收方式。
第2章硬件连接与说明
2.1硬件连接
单片机与CAN模块等外围器件的连接如图2-1所示。
图2-1系统原理图
2.1.1模块使用说明
CAN总线模块由一个CAN总线控制器SJA1000和一个CAN收发器PCA82C250组成,它们共同构成一个CAN节点。
模块的电源由接口挂箱上的接口插座提供。
模块上的RESET、INT、TX0、RX0插孔分别对应于SJA1000芯片上的相应引脚。
模块上带有上电复位电路,也可通过RESET插孔进行手动复位,只需在RESET上加上负脉冲。
模块上提供两个RJ45接口和一组“CANH、CANL”插孔接口,这三组接口是完全一致的。
对于近距离CAN模块之间的通讯,可将各模块的“CANH、CANL”插孔用导线连接;对于远距离CAN模块之间的通讯,则可用双绞线连接各RJ45接口。
每个CAN模块上都有一组终端电阻接口,即“A、B”插孔。
当总线上只有两个CAN节点时,终端电阻可不接。
如总线上的CAN节点数为3个或3个以上时,必须有一个而且只能有一个CAN模块接上终端电阻。
具体接法为:
将A插孔和CANL插孔、B插孔和CANH插孔分别用导线连接。
2.1.2实验箱连线
两个CAN模块分别接在两个实验台上,第一个模块(发送)跳线接LCS2,第二个模块(接收)跳线接LCS3,用双绞线连接两个模块的RJ45接口,将第一个CAN模块接上终端电阻。
2.2CAN总线控制器SJA1000
SJA1000是一种独立的CAN控制器,主要用于移动目标和一般工业环境中的区域网络控制。
它是Philips半导体公司PCA82C200CAN控制器(BasicCAN)的替代产品,增加了一种新的操作模式——PeliCAN,这种模式支持具有很多新特性的CAN2.0B协议。
2.3CAN控制器接口PCA82C250
PCA82C250是CAN协议控制器和物理总线间的接口,它主要是为汽车中高速通讯(高达1Mbps)应用而设计。
此器件对总线提供差动发送能力,对CAN控制器提供差动接收能力,与ISO11898标准完全兼容。
PCA82C250芯片由接收器、驱动器、基准电压产生电路、工作模式选择电路及保护电路等组成。
PCA82C250内部的限流电路可以防止发送输出级对电池电压的正端和负端短路。
虽然在这种故障条件出现时,功耗将增加,但这种特性可以阻止发送器输出级的破坏。
在节点温度大约超过160℃时,两个发送器输出端的极限电流将减少。
由于发送器是功耗的主要部分,因此芯片温度会迅速降低。
PCA82C50芯片的其他部分将继续工作。
当总线短路时,热保护十分重要。
CANH和CANL两条线也可以防止在汽车环境下可能发生的电气瞬变现象。
第3章软件流程图及说明
3.1软件流程图
3.1.1主程序流程图
程序开始运行后,先调用初始化子程序,分别对两个CAN模块中的SJA1000进行初始化,然后把要发送的数据写入CPU的存储器中,然后循环调用发送数据子程序和接收数据子程序。
具体流程如图3-1所示。
图3-1主程序流程图
3.1.2初始化子程序流程图
初始化子程序先设置MOD选择复位模式,然后分别设置CDR选择工作模式;设置IER选择中断类型;设置BTR0、BTR1设定传输速率;设置OCR选择输出模式;设置ACR、AMR设定接收数据类型;RBSA、TXERR、ECC均清零,最后设置MOD进入工作模式。
具体流程如图3-2所示。
图3-2初始化子程序流程图
3.1.3发送数据子程序流程图
发送数据子程序先把三个控制字节写入发送缓冲区,然后把等待发送的数据也写入发送缓冲区,最后设置CMR,发出发送请求、启动SJA1000发送数据。
具体流程如图3-3所示。
图3-3发送数据子程序流程图
3.1.4接收数据子程序流程图
接收数据子程序首先要读SR和IR,判断工作状态及中断类型并做相应处理,若RXFIFO有数据,应判断帧类型并做相应处理,若数据正确则送至CPU的内部存储器。
具体流程如图3-4所示。
3.2软件实现过程
两个实验台运行程序CAN.ASM(程序见附录),发送实验台全速运行程序,接收实验台要在主程序中调用接收数据子程序后设置断点,等待接收到数据后送至CPU的存储器,然后查看CPU的内部存储器30H~37H中的数据与程序中发送的数据是否一致。
图3-4接收数据子程序流程图
第4章结果分析及心得体会
4.1结果分析
本实验通过扩展CAN总线控制器,在单片机系统中实现了CAN总线的接口,通过CAN总线,实现了两个模块之间的数据通讯,在第一个模块中发送1帧数据,在第二个模块中收到这帧数据并送至了CPU的内部存储器30H~37H。
如果要修改发送数据,只需修改程序中“TXDATA”后8个字节的数据即可。
发送实验台内部存储器如图4-1所示。
图4-1发送实验台
接收实验台内部存储器如图4-2所示。
图4-2接收实验台
4.2心得体会
通过本次设计对CAN总线的工作原理及其与CPU的接口方式有了一定程度的理解。
基于CAN总线可实现多种数据的传输,例如:
可将文字、图像等进行编码后传输,并在接收端进行解码后恢复,由于时间有限未做深入研究。
开发CAN总线控制节点时,还可以使用集成了CAN控制器的CPU80C592,但支持80C592的开发工具少,给开发工作带来一定的难度。
所以一般使用独立的CAN控制器SJA1000配合单片机进行开发。
4.2.1CAN应用中的问题
SJA1000有BasicCAN和PeliCAN两种工作模式,SJAl000上电复位后自动进入BasicCAN,因此选用PeliCAN模式必须在程序中设置时钟分频寄存器(CDR)选择工作模式。
总线定时寄存器的设置极大影响了CAN性能的发挥。
一般来说,若硬件连接无误,通信失败的主要原因在于总线定时寄存器设置不当。
在实验中,曾出现过因SJA1000的时钟电路中晶振严重漂移导致通信失败的情况。
ACR和AMR两个寄存器构成硬件过滤,CAN节点通过它来决定是否接收总线上的数据,是否置CAN的接收中断,这极大地提高了系统的灵活性。
可以通过中断寄存器(IR)、状态寄存器(SR)查询CAN总线的工作状态,了解数据传输状况。
为了保证数据的正常收发,需要对状态寄存器和中断寄存器各状态位的变化做出相应处理。
4.2.2CAN总线的其他应用
CAN(ControllerAreaNetwork)总线最早由德国BOSCH公司提出,主要用于汽车内部测量与控制中心之间的数据通信。
由于其良好的性能,在世界范围内广泛应用于其他领域当中,如工业自动化、汽车电子、楼宇建筑、电梯网络、电力通讯和安防消防等诸多领域,并逐渐成为这些行业的主要通讯手段。
一个由CAN总线构成的单一网络中,可以挂接多个节点,实际应用中只需要设置几个节点为上位节点与PC机进行通信,其他节点则可以做其他用途。
如用于数据的采集,则与A/D转换芯片相接即可;如与控制相关,则与控制口相接即可,这样一来可以灵活地构成各种系统。
CAN总线具有多方面的优势,可以组建一个具有高可靠性、远距离、多节点、多主方式的设备通讯网络,例如:
我国许多煤矿中都采用基于CAN-BUS网络的煤矿通讯网络。
附录程序清单
CAN.ASM
MODEQU00H。
模式寄存器
CMREQU01H。
命令寄存器
SREQU02H。
状态寄存器
IREQU03H。
中断寄存器
IEREQU04H。
中断使能寄存器
BTR0EQU06H。
总线定时寄存器0
BTR1EQU07H。
总线定时寄存器1
OCREQU08H。
输出控制寄存器
ALCEQU0BH。
仲裁丢失捕捉寄存器
ECCEQU0CH。
错误代码捕捉寄存器
TXERREQU0FH。
发送错误计数器
ACR0EQU10H。
验收代码寄存器0
ACR1EQU11H。
验收代码寄存器1
ACR2EQU12H。
验收代码寄存器2
ACR3EQU13H。
验收代码寄存器3
AMR0EQU14H。
验收屏蔽寄存器0
AMR1EQU15H。
验收屏蔽寄存器1
AMR2EQU16H。
验收屏蔽寄存器2
AMR3EQU17H。
验收屏蔽寄存器3
FINEQU10H。
发送/接收帧信息
ID1EQU11H。
发送/接收缓冲区之标示符一
ID2EQU12H。
发送/接收缓冲区之标示符二
DATA1EQU13H。
发送/接收数据首址
RBSAEQU1EH。
接收缓冲器起始地址
CDREQU1FH。
时钟分频寄存器
。
---------------READERCOS1.0--------------------------
ORG4000H
JMPSTART
ORG4080H
。
--------------------------------主程序-----------------------------------
START:
MOVDPH,#0D3H。
CAN1初始化(CAN1片选为
。
LCS2:
0D300H)
MOVR0,#0AAH。
验收代码为AAH
LCALLINITCAN
MOVDPH,#0D4H。
CAN2初始化(CAN2片选为
。
LCS3:
0D400H)
MOVR0,#0BBH。
验收代码为BBH
LCALLINITCAN
。
-----------------------------------------------------------------
MOVR0,#20H。
20H-27H赋初值
MOVR1,#00H
MOVDPTR,#TXDATA
SS1:
MOVA,R1
MOVCA,@A+DPTR
MOV@R0,A
INCR0
INCR1
CJNER1,#08,SS1
。
-------------------------CAN1发送1帧数据------------------
LOOP:
MOVDPH,#0D3H
MOVR0,#20H
LCALLSEND。
发送20H为首址的1帧数据(前三
。
控制字节为:
08H、BBH、FFH,由程序给出)
LCALLDELAY。
调用延时子程序
。
-------------------------CAN2接收1帧数据------------------------
MOVDPH,#0D4H
MOVR0,#30H
LCALLRECV。
调用接收数据子程序
NOP。
设断点处
HALT:
JMPLOOP
TXDATA:
DB0AAH,0BBH,0CCH,0D4H。
要发送的一帧数据,用户可改写
DB0E5H,0F6H,97H,18H
。
----------------------------初始化子程序-------------------------------
INITCAN:
。
DPH、R0为入口参数
MOVDPL,#MOD。
模式寄存器,选择单验收滤波器模
。
式,进入复位模式
MOVA,#09H
MOVX@DPTR,A
MOVDPL,#CDR。
时钟分频器,选择PeliCAN模式,
MOVA,#88H。
关闭CLKOUT输出
MOVX@DPTR,A
MOVDPL,#IER。
中断使能寄存器,开溢出、错误、
MOVA,#0DH。
接收中断
MOVX@DPTR,A
MOVDPL,#BTR0。
总线定时寄存器0
MOVA,#03H
MOVX@DPTR,A
MOVDPL,#BTR1。
总线定时寄存器1,6MHz晶振,
MOVA,#0FFH。
波特率30Kbps
MOVX@DPTR,A
MOVXA,@DPTR
MOVDPL,#OCR。
输出控制寄存器,
。
选择正常输出模式
MOVA,#0AAH
MOVX@DPTR,A
MOVDPL,#ACR0。
验收代码寄存器ACR0
MOVA,R0
MOVX@DPTR,A
INCDPTR。
验收代码寄存器ACR1
MOVA,#0FFH
MOVX@DPTR,A
INCDPTR。
验收代码寄存器ACR2
MOVX@DPTR,A
INCDPTR。
验收代码寄存器ACR3
MOVX@DPTR,A
MOVDPL,#AMR0。
验收屏蔽寄存器AMR0
MOVA,#00H
MOVX@DPTR,A
INCDPTR。
验收屏蔽寄存器AMR1
MOVA,#0FFH
MOVX@DPTR,A
INCDPTR。
验收屏蔽寄存器AMR2
MOVX@DPTR,A
INCDPTR。
验收屏蔽寄存器AMR3
MOVX@DPTR,A
MOVDPL,#RBSA。
接收缓冲器起始地址为0
MOVA,#00H
MOVX@DPTR,A
MOVDPL,#TXERR。
清除发送错误计数器
MOVX@DPTR,A
MOVDPL,#ECC。
清除错误代码捕捉寄存器
MOVX@DPTR,A
MOVDPL,#MOD。
单验收滤波器模式,返回工作模式
MOVA,#08H
MOVX@DPTR,A
RET
。
--------------------------发送数据子程序------------------------
SEND:
。
DPH、R0为入口参数
MOVDPL,#FIN。
SJA1000发送缓存区首址
MOVA,#08H
MOVX@DPTR,A
INCDPL
MOVA,#0BBH
MOVX@DPTR,A
INCDPL
MOVA,#0FFH
MOVX@DPTR,A
INCDPL
MOVR2,#08H
SEND1:
MOVA,@R0。
R0为发送数据首址
MOVX@DPTR,A
INCR0
INCDPL
DJNZR2,SEND1
MOVDPL,#CMR。
命令寄存器发出发送请求,
MOVA,#01H。
启动SJA1000发送
MOVX@DPTR,A
RET
。
-----------------------接收数据子程序--------------------
RECV:
。
DPH、R0为入口参数
MOVDPL,#SR。
状态寄存器地址
MOVXA,@DPTR
ANLA,#0C3H。
读取总线关闭、出错、接收溢出、
。
有数据等位
JNZPROC
RET。
无上述状态,结束
PROC:
JNBACC.7,PROC1
BUSERR:
MOVDPL,#IR。
IR中断寄存器,出现总线关闭
MOVXA,@DPTR。
读中断寄存器,清除中断位
MOVDPL,#MOD
MOVA,#08H
MOVX@DPTR,A。
将方式寄存器复位请求位清0
RET
NOP
PROC1:
MOVDPL,#IR。
总线正常
MOVXA,@DPTR。
读取中断位
JNBACC.3,OTHER
OVER:
MOVDPL,#CMR。
数据溢出处理
MOVA,#0CH
MOVX@DPTR,A。
清除数据溢出位,释放接收缓冲区
RET
NOP
OTHER:
JBACC.0,RECE
LJMPRECOUT。
接收缓冲区无数据
NOP
RECE:
MOVDPL,#FIN。
接收缓冲区有数据
MOVXA,@DPTR
JNBACC.6,RDATA
MOVDPL,#CMR。
远程帧处理
MOVA,#04H
MOVX@DPTR,A
LJMPRECOUT
NOP
RDATA:
MOVDPL,#FIN。
发送/接收数据首址
MOVXA,@DPTR
INCDPL
MOV
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CAN 总线 数据通信 系统 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)