现场总线技术报告
现场总线技术报告 CAN总线智能节点
概述: 近年来工业测控系统从传统的集中测量控制系统转向网络化的集散控制系统。随着现场总线技术高速发展和标准化程度的不断提高,以现场总线技术为基础的开放型集散测控系统得到广泛应用。总线式控制器局域网(controller area network,CAN)属于现场总线范畴,是一种能有效支持分布式控制的串行通信网络,可将挂接在现场总线上作为网络节点的智能设备连接成网络系统,并进一步构成集散测控系统。CAN智能节点位于传感器和执行机构所在的现场,在集散控制系统中起着承上启下的作用。一方面,它必须和上位机进行通信,以完成数据交换;另一方面,它根据系统的需要以完成测量与控制的功能。因此,CAN智能节点的设计在工业集散测控系统中有着十分重要的作用。本技术报告将介绍一种基于ARM处理器STM32F107和CAN收发器CTM8251构建的CAN智能节点的设计方案。 一、CAN 智能节点硬件设计
图1:CAN 总线智能节点硬件电路原理图 图2:CTM8251与CAN控制器间的电路连接 图3:CTM8251网络拓扑结构图
CAN收发器CTM8251芯片采用全灌封工艺,内部集成CAN-bus 所必须的收发电路,完全电气隔离电路,隔离电压(DC2500V)。CTM8251是用于 CAN控制器与CAN总线之间的接口芯片。支持标准波特率:5kbps—1Mbps 。该芯片是用于 CAN控制器与CAN总线之间的接口芯片,具有将CAN控制器逻辑电平转换为CAN总线的差动电平的功能,另外CTM8251还具有对 CAN控制器与CAN总线之间的隔离作用。在同一个CAN- bus 网络中,最多可连接110 个CTM8251。 ARM处理器STM32F107是意法半导体推出全新STM32互连型(Connectivity)系列微控制器中的一款性能较强产品,此芯片集成了各种高性能工业标准接口,其中就带有两路CAN2.0B接口,故可用作于CAN控制器,用于CAN节点的数据的接受和发送。 由图1可知,电路主要由ARM 微控制器STM32F107 , CAN 收发器CTM8251T以及外部件晶振、电源等三部分构成。 二、CAN 智能节点的软件设计 1、CAN 智能节点初始化 CAN控制器配置主要有工作方式设定,波特率设定以及错误检测设定三项。 1工作方式设定 控制器有6种操作模式:配置模式,关闭模式,正常工作模式,监听模式,自检模式和错误识别模式。 eq \o\ac(○,1)1.配置模式 在使用CAN模块之前必须将其初始化,这个过程只能在配置模式下完成。在正常工作模式下,所有控制着配置模式的寄存器都不能够再线改写。即在正常收发数据的时候,CAN模块将禁止进入配置模式,保护配置寄存器,总线定时寄存器,标志符接收寄存器和标志符屏蔽寄存器等不被改写。同样,在配置模式下,模块也不会进行发送和接收。 eq \o\ac(○,2)2.关闭模式 在关闭模式下,模块不会收发数据,CAN模块可以通过配置WAKIF位用于总线激活,同时任何悬挂的中断将保留,错误计数器的值也将保留。这种模式类似与其他外围模块的低功耗睡眠模式,它将关闭模块的内部时钟,以减小模块的功耗,等待唤醒中断WAKIF激活以进入正常工作模式。 eq \o\ac(○,3)3.正常工作模式 正常工作模式是控制器的标准工作模式。在该模式下,模块主动监听所有总线信息和产生应答位,错误帧等,这也是CAN控制器在总线上发送数据的唯一方式。 eq \o\ac(○,4)4.监听模式 监听模式为CAN模块提供了所有接收信息,包括错误信息的方法。监听模式是一种无记载模式,即在这种模式下没有信息被发送,包括错误标志或是应答信号。该模式下过滤器和屏蔽器可以只允许特殊信息装入接收寄存器,或者通过将过滤器和屏蔽器清0来接收任何信息,而错误寄存器复位但不工作。模块通过配置CANCON进入监听模式。 eq \o\ac(○,5)5.自检模式 自检模式允许信息不发送到CAN总线,而在发送缓冲器和接收缓冲器之间进行内部信息收发。该模式可用于系统的开发测试过程。自检模式也是一种无记载模式,即在这种模式下没有信息被发送,包括错误标志或是应答信号 。该模式下过滤器和屏蔽器可以只允许特殊信息装入接收寄存器,或者通过将过滤器和屏蔽器清0来接收任何信息,而错误寄存器复位但不工作。模块通过配置CANCON进入自检模式。 eq \o\ac(○,6)6.错误识别模式 错误识别模式下模块能够被配置为忽略所有错误,接收任何信息的方式。该模式下的所有信息,包括有效信息和无效信息都被接收并复制到接收缓冲器中。 2波特率设定 在CAN总线上的所有节点都必须有相同的波特率。CAN协议使用反向不归零(NRZ)编码,这个编码不能对数据串的时钟进行编码,所以,接收节点的时钟必须同步于发送节点的时钟。由于振荡器或发送时钟可能随节点的不同而改变,所以接收器必须要有与发送时钟边沿同步的锁相回路(PLL),使接收器始终同步。由于数据是NRZ编码,有必要加一个填充位以确保至少没6个时钟周期后产生一个脉冲边沿,使数字锁相回路(DPLL)同步。 CAN控制器位定时通过锁相环DPLL得到,DPLL配置成与数据同步并为传输数据提供定时时间。DPLL将一位时间分成许多称为时间当量的 (TQ)的最小时间周期所组成的时间段。总线的定时功能是在位时间帧中执行的,例如与自身振荡器同步,网络传输延时补偿和采样节点,都是通过DPLL的可编程位定时逻辑来配置。CAN总线上的所有器件都必须使用相同的位率。 3错误检测设定 CAN协议具有精密的检测装置,以下错误可以被检测到: eq \o\ac(○,1)1、CRC错误 使用循环冗余检测(CRC)发送器可以从数据帧头位到数据帧尾位计算出位序列的特殊检测位,这个CRG序列以CRC域传输,接收节点也使用同样的计算式计算CRC序列并且与接收序列比较。如果被检测出不匹配,则说明发生了一个CRC错误或一个错误帧,信息被重发。 eq \o\ac(○,2)2、应答错误 在信息的应答域内,发送器会检测应答位(已作为隐性位发送)是否有显性位。如果没有几,其他节点是不会正确接收到帧的,一个应答错误产生时,会产生第四章系统的软件设计与实现一个帧错误并将重发这个信息。 eq \o\ac(○,3)3、格式错误 如果在一个节点在4个部分(包括帧尾,帧中间,应答界定符和CRC界定符)其中的一个检测到显性位,会产生一个格式错误和一个错误帧,并且将信息重发。 eq \o\ac(○,4)4、位错误 当发送器在监测当前的总线电平并与刚发送位的电平进行比较时,如果发送器发送一个显性位而检测到一个隐性位,或相反时,就会产生一个位错误。不过在仲裁和应答期间p如果出现上述情况则不产生位错位,这是因为仲裁正在进行。 eq \o\ac(○,5)5、错误状态,方式及错误计数器 检测到的错误将公布到错误帧经过的其他节点。发送失败的错误信息会尽可能快的地重复发送帧,而且根据内部错误计数器,每个CAN节点都可有3个错误状态(主动错误,被动错误和总线断开)之一,主动错误状态是一种通常状态,能够不受任何限制的发送信息和主动错误帧(由显性位组成),在被动错误状态,可以发送信息和被动错误帧(由隐性位组成)。总线断开会使这个节点暂时不能参与总线通信,当处于断开状态时,既不能接收信息也不能发送信息。 初始化程序通过将控制字写入控制器的寄存器里来对CAN节点进行初始化。CAN节点初始化程序流程:设置CPU进入复位模式,之后对模式寄存器、时钟分频寄存器、中断寄存器、接收屏蔽寄存器、接收代码寄存器、总线定时寄存器、输出控制寄存器、接收缓冲起始地址寄存器、发送错误计数寄存器和错误代码捕捉寄存器进行初始化。 ARM处理器STM32F107的CAN初始化主要包括工作方式的设置、接收滤波方式的设置、接收屏蔽寄存器和接收代码寄存器的设置、波特率参数设置和中断允许寄存器的设置等。在完成STM32F107的初始化设置后,STM32F107就可以回到工作状态进行正常的通讯任务。下面简要的给出了STM32F107的CAN节点初始化汇编伪代码程序。程序中寄存器符合表示的是 STM32F107相应寄存器占用的片外存储器地址,这些符号可在程序的头部用伪指令EQU进行定义。
图4:CAN智能节点初始化子程序流程图 CANINI: MOV DPTR #MOD ;方式寄存器 MOV A #09H ;进入复位模式 对 STM32F107进行初始化. MOVX @DPTR A MOV DPTR #CDR ;时钟分频寄存器 MOV A #88H ;选择PeliCAN 模式 关闭时钟输出 CLKOUT MOVX @DPTR A MOV DPTR #IER ;中断允许寄存器 MOV A #0DH ;开放发送中断 超载中断和错误警告中断 MOVX @DPTR A MOV DPTR #AMR ;接收屏蔽寄存器 MOV R6 #4 MOV R0 #DAMR ;接收屏蔽寄存器内容在片内RAM 中的首址 AMR: MOV A @R0 MOVX @DPTR A ;接收屏蔽寄存器赋初值 INC DPTR DJNZ R6 AMR MOV DPTR #ACR ;接收代码寄存器 MOV R6 #4 MOV R0 #DACR ;接收代码寄存器内容在片内RAM 中的首址 ACR: MOV A @R0 MOVX @DPTR A ;接收代码寄存器赋初值 INC DPTR DJNZ R6 ACR MOV DPTR #BTR0 ;总线定时寄存器0 MOV A #03H MOVX @DPTR A MOV DPTR #BTR1 ;总线定时寄存器 1 MOV A #0FFH ;25MHz 晶振情况下 设置波特率为200kbps. MOVX @DPTR A MOV DPTR #OCR ;输出控制寄存器 MOV A #0AAH MOVX @DPTR A MOV DPTR #RBSA ;接收缓存器起始地址寄存器 MOV A #0 ;设置接收缓存器FIFO 起始地址为0 MOVX @DPTR A MOV DPTR #TXERR ;发送错误计数寄存器. MOV A #0 ;清除发送错误计数寄存器 MOVX @DPTR A MOV DPTR #ECC ;错误代码捕捉寄存器 MOVX A @DPTR ;清除错误代码捕捉寄存器 MOV DPTR #MODE ;方式寄存器 MOV A #08H ;设置单滤波接收方式 并返回工作状态 MOVX @DPTR A RET 2、CAN智能节点的报文发送过程 ARM处理器STM32F107可使用多个发送缓冲器发送报文数据。在发送数据前,首先通过发送缓冲器N(N=O,1,2)控制寄存器TXBNCTRL终止报文发送,并设定发送缓冲器N报文发送的优先级;接着通过发送缓冲器N标准标识符高低位寄存器TXBNSIDH,TXBNSIDL设定标准标识符,如果报文采用扩展标识符,还需通过发送缓冲器N扩展标识符高低位寄存器TXBNEID8,TXBNEID0设定扩展标识符。当发送缓冲器N相关寄存器初始化后,发送任务处于休眠等待状态。一旦有数据需要发送,即可将需要发送的数据(每次最多8 B)存放在发送缓冲器N的数据寄存器TXBND7~TXlBND0,并且通过送缓冲器N的数据长度寄存器TXBNDLC设定每次发送的字节数,最后通过发送缓冲器N控制寄存器TXB-NCTRL启动数据发送。当数据发送完毕,发送任务又处于休眠等待状态。信息的发送过程均是由CAN控制器自动完成。 发送子程序负责节点报文的发送。发送时用户只需将把数据存储区中待发送的数据取出,组成信息帧,并将主机的ID地址填入帧头,然后将信息帧发送到 STM32F107的CAN控制器的发送缓冲区,在接收发送要求后,发送程序启动发送命令。当然在往STM32F107发送缓存区送报文之前,必须先作一些判断如下文程序所示发送程序分发送远程帧和数据帧两种。远程帧无数据场。下面以发送数据帧为例对发送子程序作一个简要说明。
图5:CAN智能节点发送数据子程序流程图 TDATA: MOV DPTR #SR ;状态寄存器 MOVX A @DPTR ;从STM32F107读入状态寄存器值 JB ACC.4 TDATA ;判断是否正在接收 正在接收则等待 TS0: MOVX A @DPTR JNB: ACC.3 TS0 ;判断上次发送是否完成 未完成则等待发送完成 TS1: MOVX A @DPTR JNB ACC.2 TS1 ;判断发送缓冲区是否锁定 锁定则等待 TS2: MOV DPTR #CANTXB ; STM32F107发送缓存区首址 MOV A #88H ;发送数据长度为8 个字节的扩展帧格式报文 MOVX @DPTR A INC DPTR MOV A #ID0 ;4个字节的标识符 ID0-ID3依据实际情况赋值 MOVX @DPTR A INC DPTR MOV A #ID1 MOVX @DPTR A INC DPTR MOV A #ID2 MOVX @DPTR A INC DPTR MOV A,#ID3 MOVX @DPTR A MOV R0 #TRDATA ;CPU 发送数据区首址 数据内容由用户定义 MTBF: MOV A @R0 INC DPTR MOVX @DPTR A INC R0 CJNE R0 #TRDATA+8 MTBF ;向发送缓冲区写8 个字节 MOV DPTR #CMR ;命令寄存器地址 MOV A #01H MOVX @DPTR A ;启动STM32F107发送 RET 3、CAN智能节点的报文接收过程 ARM处理器STM32F107可使用多个接收缓冲器接收报文数据。在接收数据前,首先通过接收缓冲器N(N=0,1)控制寄存器RXBNCTRL,设定接收缓冲器的工作模式为接收符合滤波条件的所有带扩展标识符或标准标识符的有效报文;如果允许STM32F107接收中断,还需通过中断使能寄存器CANINTE允许接收缓冲器N装入报文时产生中断。 当接收缓冲器N相关寄存器初始化后,接收任务处于休眠等待状态。当接收任务通过轮询或中断方法发现需要接收数据时,它通过接收缓冲器N标准标识符高低位寄存器RXBNSIDH,RXBNSIDL获取标准标识符;如果收到的报文是扩展帧,可通过RXBNSIDL及接收缓冲器N扩展标识符中间、低位寄存器RXBNEID8,RXBNEIDO获取扩展标识符;通过接收缓冲器N数据长度码寄存器RXBNDLC获取接收到的数据字节个数,进而通过接收缓冲器N数据寄存器RBNDm7~RBNDm0获取接收报文中的数据信息。当数据接收完毕,接收任务又处于休眠等待状态。 接收子程序从接收缓冲区读取信息,并将其存储在数据存储区,主要负责节点报文的接收以及其它情况处理。接收子程序比发送子程序要复杂一些,因为在处理接收报文的过程中,同时要对诸如总线脱离、错误报警、接收溢出等情况进行处理 。STM32F107报文的接收主要有两种方式:中断接收方式和查询接收方式。如果对通信的实时性要求不是很强,建议采用查询接收方式。两种接收方式编程的思路基本相同 ,下面仅以查询方式接收报文为例对接收子程序作简要说明。
图6:CAN智能节点接收数据子程序流程图 SEARCH: MOV DPTR #SR ;状态寄存器地址 MOVX A @DPTR ANL A #0C3H ;读取总线脱离 错误状态 接收溢出 有数据等位 JNZ PROC RET ;无上述状态 结束 PROC: JNB ACC.7 PROCI BUSERR: MOV DPTR #IR ;IR 中断寄存器 出现总线脱离 MOVX A @DPTR ;读中断寄存器 清除中断位. MOV DPTR #MODE ;方式寄存器地址 MOV A #08H MOVX @DPTR A ;将方式寄存器复位请求位清0 LCALL ALARM. ;调用报警子程序 RET NOP PROCI: MOV DPTR #IR ;总线正常 MOVX A @DPTR ;读取中断位 JNB ACC.3 OTHER OVER: MOV DPTR #CMR ;数据溢出中断置位. MOV A #0CH MOVX @DPTR A ;在命令寄存器中清除数据溢出和释放接收缓冲区 RET NOP OTHER: JB ACC.0 RECE ;IR.0=1 接收FIFO 未满或接收中断使能 LJMP RECOUT ;IR.0=0 接收缓冲区无数据 退出接收 NOP RECE: MOV DPTR #CANRXB ;接收缓冲区首地址 16 准备读取数据 MOVX A @DPTR ;首字节是接收帧格式字 JNB ACC.6 RDATA ;RTR=1 是远程请求帧 无数据 MOV DPTR #CMR MOV A #04H ;CMR.2=1 释放接收缓冲区 MOVX @DPTR A ;只有接收了数据才能释放接收缓冲区 LCALL TDATA ;发送对方请求的数据 LJMP RECOUT ;退出接收 NOP RDATA MOV DPTR #CANRXB ;读取并保存接收缓冲区的数据 MOV R1 #CPURBF ;CPU 片内接收缓冲区首址 MOVX A @DPTR ;读取读取CAN 缓冲区的2 号字节 MOV @R1 A ;保存 ANL A #0FH ;截取低4 位是数据长度 0~8 ADD A #4 ;加4 个字节的标识符 ID MOV R6 A RDATA INC DPTR INC R1 MOVX A @DPTR MOV @R1 A DJNZ R6 RDATA0 ;循环读取与保存 MOV DPTR #CMR MOV A #04H ;释放CAN 接收缓冲区 MOVX @DPTR A RECOUT: MOV DPTR #ALC ;释放仲裁丢失捕捉寄存器和错误捕捉寄存器 MOVX A @DPTR MOV DPTR #ECC MOVX A @DPTR NOP RET
|
|