1、CAN 总线资料汇总工业设备通信通常涉及到很多硬件和软件产品以及用于连通标准计算机平台(个人计算机或工作站)和工业自动化应用设备的协议,而且所使用设备和协议的种类繁多。因此,大部分自动化应用设备都希望执行简单的串行命令,并希望这些命令同个人计算机或者附加的串行端口板上的标准串行端口兼容。RS-232 是目前 PC 机与通信工业中应用最广泛的一种串行接口。RS-232 被定义为一种在低速率串行通讯中增加通讯距离的单端标准。由于 RS-232 的发送端与接收端之间有公共信号地,所以它不能使用双端信号,否则,共模噪声会耦合到信号系统中。RS-232 标准规定,其最大距离仅为 15m,信号传输速率最高
2、为20kbit/s。CAN,全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一,一个由 CAN 总线构成的单一网络受到网络硬件电气特性的限制。 CAN 作为一种多主方式的串行通讯总线,其基本设计规范要求高位速率和较高的抗电磁干扰性能,而且要能够检测出通讯总线上产生的任何错误。当信号传输距离达 10km 时,CAN 仍可提供高达 50kbit/s 的数据传输速率。表 1 为 CAN 总线上任意两个节点之间最大传输距离与其位速率之间的对应关系。表 1 CAN 总线系统任意两节鼎足之势之间的最大距离 位速率/kbps 1000 500 250
3、125 100最大距离/m 40 130 270 530 620位速率/kbps 50 20 10 5 最大距离/m 1300 3300 6700 10000 由此可见,无论从实时性、适应性、灵活性,还是可靠性上来看,CAN 总线都是一种比 RS-232 更为优秀的串行总线。当两台串口设备的相距较远,不能直接用 RS-232 把它们连接起来时,就可以把 RS-232 转换为 CAN,通过 CAN 总线来实现串口设备的网络互连。但是,RS-232 和 CAN 在电平和帧格式上都是很大的不同。具体表现如下:RS-232 标准电平采用负逻辑,规定 +3V+15V 之间的任意电平为逻辑“0”电平,-3
4、V-15V 之间的任意电平为逻辑“1”电平。而 CAN 信号则使用差分电压传送,两条信号线称为“CAN_H” 和“CAM_L”,静态时均为 2.5V 左右,此时的状态表示为逻辑“1”,也可以叫做“隐性”;用 CAN_H 比 CAN_L 高表示逻辑“0”,称为“ 显性 ”。显性时,通常电压值为:CAN_H=3.5V,CAN_L=1.5V ;RS-232 串口的帧格式为:一位起始位,八位数据位,一位可编程的第九位(此位为发送和接收的地址/数据位),一位停止位。而 CAN 的数据帧格式为:帧信息+ID+ 数据(可分为标准帧和扩展帧两种格式)。因此,设计时就需要有一个微控制器来实现电平和帧格式等的转换
5、。其转换方式如图 1 所示。2 RS-232 到 CAN 转换的硬件设计在设计 RS-232 到 CAN 的转换装置时,用单片机 AT89C52 作为微处理器;用 SJA1000 作为 CAN微控制器,SJA1000 中集成了 CAN 协议的物理层和数据链路层功能,可被动局面对通信数据的帧处理;AT82C250 作为 CAN 控制器和物理总线之间的接口,用于提供总线的差动发送能力和 CAN 控制器的差动接收能力,通过 AT82C250 的引脚 3 可选择三种不同的工作方式(高速、斜率控制和待机)。其中引脚 3 接地时为高速方式;高速光隔用 6N137 实现,其作用是防止串入信号干扰;MAX23
6、2 用来完成 232电平到微控制器接口芯片 TTL 电平的转换。具体的硬件接口电路参见 SJA1000 的有关资源,这里不再多做说明。但有以下几点需要注意。(1) CAN 总线两端接有一个 120 的电阻,其作用是匹配总线阻抗,提高数据通信的抗干扰性及可靠行。但实际上只需保证 CAN 网络中“CAN_H” 和“CAN_L” 之间的跨接电阻为 60 即可。(2) SJA1000 的 20 引脚 RX1 在不使用时可接地(具体原因见软件设计),配合 CDR.6 的置位可使总线长度大大增加。(3)引脚 TX0、TX1 的接法决定了串行输出的电平。具体关系可参考输出控制寄存器 OCR 的设置。(4)
7、AT82C250 的 RS 引脚与地间接有一个斜率电阻。电阻大小可根据总线通信速度作适当调整,一般在 16k140k 之间。(5) MAX232 外围需要四个电解电容 C1、C2 、C3、C4,这些电容也是内部电源转换所需电容,其取值均为 1F/25V,宜选用钽电容并且位置应用量靠近芯片,电源 VCC 和地之间要接一个 0.1F 的去耦电容。3 RS-232 到 CAN 转换的软件设计在微处理控制下,RS-232 和 CAN 进行数据交换时,采用串口接收和 CAN 中断方式可提高工作效率。其主程序流程图如图 2 所示。 SJA1000 的初始化在复位模式下才可以进行,主要包括工作方式的设置、时
8、钟分频和验收滤波寄存器的设置、波特率参数的设置以及中断允许寄存器的设置等。数据能否准确传递还取决于波特率和流量控制,这也是软件设计时不可忽略的地方。因此接下来主要介绍 CAN 波特率的设置、串口波特率的自动检测、串口数据流量控制。31 CAN 滤波率的设置CAN 协议中的要素之一是波特率。用户可以设置位周期中的位采样点位置和采样次数,以使用户可以自由地优化应用网络性能,但在优化过程中,要注意位定时参数基准参考振荡器的容差和系统中不同信号传播延迟之间的关系。系统的位速率 fBil 表示每单位时间传输数据位的量,即波特率 fBit=1/tBit。额定的位定时由 3 个互不重叠的段 SYNC_SEG
9、、TSEG1 和 TSEG2 组成,这 3 个时间段分别是 TSYNC_SEG、TSEG1 和TSEG2 组成,这 3 个时间段分别是 tSYNC_SEG、tTSEG1 和 tTSEG2。所以,额定位周期 tBit 是 3 个时间段的和。tBit=tSYNC_SEG+tTSEG1+tTSEG2位周期中这些段都用整数个基本时间单位来表示。该时间单位叫时间份额 TQ,时间份额的持续时间是 CAN 系统时钟的一个周期 tSCL,可从振荡器时钟周期 tCLK 取得。通过编程预分频因数(波特率预设值 BRP)可以调整 CAN 系统时钟。具体如下:tSCL=BRP2tCLK=2BPR/fCLK对 CAN
10、位定时计算的另一个很重要的时间段是同步跳转宽度(SJW),持续时间是 tSJW。SJW段并不是位周期的一段,只是定义了在重同步事件中被增长或缩短的位周期的最大 TQ 数量。此外,CAN协议还允许用户指定位采样模式(SAM),分别是单次采样和三次采样模式(在 3 个采样结果中选出 1个)。在单次采样模式中,采样点在 TESG1 段的末端。而三次采样模式比单次采样多取两个采样点,它们在 TSEG1 段末端的前面,之间相差一个 TQ。上面所提到的 BPR、SJW、SAM、TESG1、TESG2 都可由用户通过 CAN 控制器的内装中寄存器BTR0 和 BTR1 来定义。具体如图 3 所示。设置好 B
11、TR0 和 BTR1 后,实际传输的波特率范围为:最大=1/ (tBit-tSJW),最小=1/( tBit+tSJW)3.2 串口波特率检测当串口设备是主机时,如需检测此时转换装置的串口波特率,首先可对主机的接收波特率(以 9600波特为例)进行设定,并在终端发送一个特定的字符(以回车符为例),这样,主机根据接收到的字符信息就可以确定转换装置的通信波特率。回车符的 ASCII 值是 0DH,在不同波特率下接收到的值如表 2 所列。表 2 不同波特率下接收的字节 波特率(bit/s ) 接收字节(十六进制) 波特率(bit/s ) 接收字节(十六进制)1200 80 4800 E61800 F
12、0 9600 0D2400 78 19200 F*33 串口流控制此处讲到的“流“ 指的是数据流。数据在两个串口之间的传输时,常常会出现丢失数据的现象。由于单片机缓冲区有限,如接收数据时缓冲区已满,那么此时继续发送来的数据就会丢失。而流控制能有效地解决该问题,当接收端数据处理不过来时,流控制系统就会发出“不再接收” 的信号,而使发送端停止发送,直到收到“ 可以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据丢失。常用的两种流控制是硬件流控制(包括 RTS/CTS、DTR/CTS 等)和软件流控制 XON/XOFF(继续/停止),下面仅就硬件流控制 RTS/CTS 加以说明
13、。采用硬件进行流控制时,串口终端 RTS、CTS 接到单片机的 I/O 口,通过置 I/O 口为 1 或 0 来接收和发出起停信号。数据终端设备(如计算机)使用 RTS 来起始单片机发出的数据流,而单片机则用 CTS来起动和暂停来自计算机的数据流。实现这种硬件握手方式时,在编程时根据接收端缓冲区的大小设置一个高位标志和一个低位标志,当缓冲区内数据量达到高位时,就在接收端将 CTS 线置低(送逻辑 0),而当发送端的程序检测到 CTS 为低后,就停止发送数据,直到接收端缓冲区的数据量低于低位而将 CTS置高为止。RTS 则用来标明接收设备有没有准确好接收数据。3 4 CAN 接收子程序PeliC
14、AN 格式既可以发送标准帧也可以送扩展帧,利用时钟分频寄存器中的 CDR.7 可以调协 CAN模式(0-BasicCAN,1-PeliCAN),接收 CAN 数据时,可根据帧信息中的 FF 位来判断是标准帧还是扩展帧,并且 RTR 位来判断是远程帧还是数据帧。以下是 CAN 接收子程序:;/;/CAN 数据接收/统一成 2 个字节 ID 的帧格式/;/RECAN:MOV R0,#C_RE ;单片机内缓冲区起始地址MOV DPTR,#RXBUF ;读取并保存接收缓冲区的内容MOVX A,DPTR ;读取 CAN 缓冲区的 2 号字节MOV R0,A ;保存JB ACC.7,EFF_RE ;FF
15、位,0-SFF,1-EFFMOV R2,#0SJMP SFF_RE ;ID 数目不同,截取“数据字节” 的位置不同EFF_RE:MOV R2,#2SFF_RE:MOV R2,#2SFF_RE:JB ACC.6,EXIT_RECAN ;RTR 位判断,1-远程帧,则跳出ANL A,#0FHMOV R3,A ;这时截取中间 4 位是数据长度MOV C_NUM,A ;R3,R5 中存放接收帧的长度RDATA0:INC DPTR ;2 个字节 IDINC R0MOVX A,DPTRMOV R0,AINC DPTRMOVX A,R0,AINC DPTRMOVX A,DPTRMOV R0,AMOV A,R2 ;如果是 EFF 则跳过两个字节 IDJZ DRATA1INC DPTRINC DPTRDATA1: ;数据字节INC DPTRINC R0MOVX A,DPTRMOV R0,ADJNZ R3,RDATA1EXIT_RECAN:RET4 结束语