×
单片机 > 单片机程序设计 > 详情

AVR单片机的CAN总线分析仪设计

发布时间:2020-06-05 发布时间:
|

引言

  国内基于CAN总线的工程应用也越来越多,但是在CAN现场总线产品开发前期和后期测试中缺乏有效的现场监测和排错手段,从而延长了开发周期,增加了开发成本。同时,国内CAN总线教学实验也同样缺乏成本低,功能强,操作简单的CAN分析仪器。

  目前CAN总线的监测主要是通过CAN适配卡与计算机相连,利用计算机软件来分析总线状况。高端CAN适配卡价格高昂,而低端CAN适配卡如CAN转232卡,由于232总线传输速度有限,很难做到准确监测。另外,计算机也不便于在现场进行监测。本文设计了一种造价低廉、操作简单的便携CAN总线分析仪,能够适应各种总线传输速度。

1 CAN分析仪的组成和功能

  主要由4个部分组成:MCU、液晶显示接口、键盘输入接口和CAN接口。能够实现以下功能: 总线波特率自适应、正常接收CAN总线数据、总线报文数和总线错误数及错误类型记录、总线负载率检测、总线报文显示、CAN协议类型辨识。硬件整体框架如图1所示。

图1 系统硬件框图

2 CAN分析仪的硬件设计

2.1 MCU与CAN接口

  本系统中使用Atmel公司生产的AVR单片机ATmega64L作为微控制器。ATmega64L是高性能、低功耗的8位AVR单片机。它具有哈佛总线结构、精简指令集(RISC)结构和丰富的片内资源。ATmega64L具有64 KB Flash程序存储器、2 KB的E2PROM、4 KB的SRAM、4个带有比较模式的定时器/计数器以及可编程带内部振荡器的看门狗定时器等,支持汇编和C语言在线编程。利用其优良特性可以使设计大大简化。

  CAN接口硬件原理图如图2所示,包括MCU、总线控制器模块、总线驱动模块、光电隔离模块。  总线控制器模块采用Philips公司的CAN控制器SJA1000。它可工作于BasicCAN 模式或PeliCAN 模式,具有64 字节的接收缓冲器,支持11位和29位ID,可热插拔,支持CAN2.0B 协议,仅依靠控制器本身的硬件电路就能够实现通信帧的组织和发送功能。

  CAN总线驱动模块采用82C251。为了增强CAN总线节点的抗干扰能力,实现各CAN节点间的电气隔离,SJA1000的TX0和RX0通过高速光耦6N137分别与82C251T的TXD和RXD相连。值得注意的是,光耦所采用的两个电源VCC和VDD必须完全电气隔离。

2.2 液晶显示接口

  分析仪监测到的总线状态需要外部器件来显示以方便观察。传统的数码管指示灯无法满足大量总线状态实时显示的需求。为了便于操作者的使用,本系统选用深圳安得利光电科技有限公司生产的AM1286425F57,它是128×64的图形点阵液晶模块,内置控制器是三星公司的LCD驱动及控制芯片S6B1713。

图2 CAN接口硬件电路原理

  图3是AM1286425F57硬件原理图。MCU电源和背光输入电源都为3.3 V。8位数据总线接在单片机的D口上,将D口配置为输出。AM1286425F57的RS是指令与数据选择信号。当RS=0时,表示数据总线D0~D7上是液晶控制指令;当RS=1时,表示数据总线D0~D7上是写入液晶的数据。CS1和CS2都是控制器芯片S6B1713的片选信号,当CS1=0,CS2=1,即2个片选同时有效时才能选中液晶,向它写入数据或指令。[page]

图3 液晶显示接口

2.3 键盘输入接口

  图4所示为键盘输入接口的硬件原理图。键盘输入采用了广州周立功单片机发展有限公司的数码管显示驱动及键盘扫描管理芯片ZLG7289B,它可以扫描管理多达64只按键。ZLG7289B采用SPI 串行总线与微控制器接口,仅占用少数几根I/O接口线。为了使键盘扫描得以正常进行,下拉电阻R1~R8和位选电阻R9、R10 是必需的。下拉电阻取值范围是10~100 kΩ,位选电阻取值范围1~10 kΩ。如果需要增加或减少按键,建议按列增加或裁减键盘,即增加或省略相应列的电阻。应注意裁减键盘时下拉电阻一个都不能省去。

图4 键盘输入接口

3   CAN分析仪的软件设计

  本系统的软件设计通过AVR单片机的开发工具AVRICC用C语言编制,并依据各项功能进行了模块化设计,主要包括:自适应波特率模块、定时器模块、报文接收模块、状态显示模块、CAN中断处理模块、控制器初始化模块和总线状态计算模块等。其中自适应波特率、报文接收和总线状态计算是核心与关键。限于篇幅,仅介绍这几种功能模块。

3.1 软件的主程序框架

  分析仪的主要功能是监测现场状况。首先要使其接入总线,能够正常接收总线报文。因为总线上的波特率未知,需要对总线的波特率进行自识别,找到正确的波特率并初始化CAN控制器,进入CAN总线正常工作状态,接收总线上的各种报文。CAN总线不是按地址来进行报文传送的,可以设置分析仪接收总线上的一切报文,也可以通过键盘输入需要接收的报文。CAN总线上一旦出现错误,出现错误的节点就会向总线发送标示错误的错误帧。利用这个特性,接收错误帧,并将它显示出来用于分析总线的各种错误。与此同时,通过定时器来确定每单位时间的正确报文数和错误报文数,用于分析总线的状态是否正常、利用是否充分等。程序总体框架如图5所示。

 

图5 程序总体框图

3.2 自适应波特率

  自适应波特率是在未知总线波特率的情况下自动检测CAN总线波特率,并且不影响总线的正常运行。已往的自适应波特率检测主要是向总线发出报文,若接入节点(分析仪)假设的波特率与网络实际波特率相冲突,则该节点自身的CAN控制器将产生错误帧,这是对检测到的总线错误的正常反应。如果允许该错误帧发送到总线上,将导致网络上其他节点也收到该错误帧,从而产生网络堵塞。这种方法严重影响了总线的正常运行,轻则使总线在检测阶段不能正常工作,重则影响总线的整个调度算法,使总线发生紊乱甚至关闭。

  本系统所选用的CAN控制器SJA1000具有独特的只听模式。在该模式下,CAN控制器进入错误认可状态,即无论接收信息成功与否,都不能向总线发送任何信息,只能接收报文。这样就不影响总线的正常运行,其他功能都如同在正常操作模式下一样使用。

  自适应波特率需要在网络中至少有1个节点在发送报文,而且需要预先设定1张包含所有可能波特率的表格。在建表时考虑到表的长度越长,检测所需要的时间和报文数就越多,所以只取了CiA(CAN in Automation)协会推荐的几种标准通信波特率和工业现场常用的波特率。

  CAN控制器首先进入复位模式。接着设置初始波特率,波特率的初始值可以通过拨码开关设置从最高波特率开始,或从最低波特率开始,从而减少自适应时间。最后使能接收中断进入只听模式。当未接收到总线报文时,即没有产生接收中断,进入复位模式选择下一个波特率;当产生1个接收中断时,表示检测到正确的波特率,这时软件就可以切换到正常操作模式,CAN分析仪即可参与总线通信。图6为自适应波特率的流程。[page]

图6 自适应波特率流程

3.3 报文接收

  CAN报文的接收有2种方式,分别为查询的方式和中断的方式。

  查询的方式是MCU以一定周期读取CAN控制器的状态寄存器,检查接收缓冲区状态标志是否至少接收到1个报文。接收缓冲区状态指示为“空”,表示没有接收到报文,MCU继续当前的任务。当接收缓冲区状态标志指示为“满”,表示已接收至少1个报文,MCU从控制器取出报文,并写命令释放接收缓冲区标志。查询方式的不足是: 查询周期如果过短,就会使MCU大部分时间运行在报文的接收查询上,使其效率降低;若查询周期过长,由于接收缓冲区的长度有限会造成数据溢出,导致系统不能正常工作。

  中断的方式是主程序在中断控制的报文接收之前使能接收中断和MCU的全局中断。当控制器已接收1个报文,该报文通过验收滤波器并放入接收缓冲区,则产生接收中断。这样MCU能够立即响应,处理这个接收到的报文,然后释放接收缓冲区。整个接收的过程可在中断服务程序中完成,不需要与主程序发生交互作用。中断方式可以避免查询方式的不足,增强系统的可靠性。所以在设计报文接收时选择中断方式进行报文的接收。图7为报文接收流程。

图7 报文接收流程

3.4 总线状态计算

  CAN分析仪主要的功能就是分析CAN总线上的各种总线参数,从而给使用者提供一个透明的窗口来观测总线的运行状况。CAN 总线协议属于较为高级的现场总线协议, 工作过程较为复杂。从工程实用的角度看,以下性能参数具有较高的参考价值:

  ◆ 总线波特率,也叫做总线位速率,表示每秒钟传送信息位的数量,只有网络中各节点的波特率相一致时才能够进行正常的报文收发。

  ◆ 总线吞吐量,总线单位时间内传送的报文总数。

  ◆ 总线出错率,总线单位时间的错误报文数。

  ◆ 总线负载,每秒钟节点发送的位数与总线波特率之比。

除此之外,为了更方便地检查总线状态,又增添了显示功能,可以显示接收报文、状态寄存器、报文总数、报文计数器、错误代码等。总线分析软件程序中所采用的算法简述如下。

  (1) 总线吞吐量的测试

  首先设定计数器i=0,定时器时间t=0,测量值数组count[5]={0}。当接收到总线上的1个报文并释放接收缓冲区时启动定时器,设定定时时间t=5 s,等待定时中断发生。计数器放在接收中断函数中,当成功接收1帧报文时,i=i+1。定时器中断发生时,将计数器的值i存入count[5]数组中。之后启动下一次定时,当数组满时,结束测试,对count数组进行排序,并去除最大和最小值。总线吞吐量V为:

(2) 总线负载的测试

  通过之前的自适应波特率程序已经检测到总线上的波特率为bote,设定计数器j=1,定时器t=0,报文位数设为c1=0,报文位数数组bit_count[20]={0}。当接收到总线上的1个报文并释放接收缓冲区时启动定时器,设定定时时间t=1 s,等待定时中断发生。报文位数、报文位数数组和计数器放在接收中断函数中。当成功接收1帧数据时,j=j+1,通过读取接收帧信息SFF可以判定该帧数据有多少位,将位数写入c1,并存入bit_count[20]数组中。定时时间到时,拷贝计数器值,结束测试。总线负载U为:

3.5 实验结果

  为了便于测试分析仪的有效性和准确性,取单节点进行实验,即总线上只有1个节点在进行报文发送。分别取波特率5 kbps、10 kbps、50 kbps、100 kbps,发送报文时间间隔100 ms、150 ms、200 ms、250 ms、400 ms、450 ms、500 ms、800 ms,每帧报文有8字节数据域。实验得到的结果如表1所列。

表1 实验结果

从实验结果可以看出,当每100 ms发送1帧报文时,检测到的总线吞吐量为10帧/s,即总线每秒传送的报文总数为10帧,与实际相符。在不同的报文发送间隔和不同的总线波特率下,所测得的总线吞吐量和总线负载与实际相吻合。

4 结论

  本文设计的CAN总线分析仪在实验室和工业现场上进行了调试,主要调试的项目包括自适应波特率、液晶显示和CAN总线通信监测等。实践证明该设计实现了对CAN2.0B标准节点(并兼容CAN2.0A节点)监测分析的功能,指标达到预期的效果。为CAN总线的工程开发应用和教学提供了一种简洁、高效的调试和监测手段。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会