1、基于 CANoe 的 CAN 总线设计基础与简例CANoe 概述CANoe 是德国 Vecto:公司开发的一套通用的 CAN 总线系统的开发、测试和分析工具。CANoe 的主要组成部分和各自功能为: CANdb+编辑器:用 CANdb+编辑器可以创建或编辑数据库文件(*.dbc)。数据库文件中包括了 CANoe 所用到的信号的信息,这当中包括了报文和信号的网络节点和符号名称,以及环境变量等信息。 CAPL 浏览器:利用 CAPL 浏览器可以创建用于测量和模拟面板的CAPL 程序。因为数据库的应用,在编程时可以使用直观的报文和信号的名称,而不必使用二进制代码的报文头和数据。 CANoe 主程序:
2、用于测量和模拟 CAN 系统。通过 File/Database 菜单,可以在主程序中关联一个或多个数据库。 面板编辑器:通过面板编辑器可以创建面板。面板的作用是作为用户和在 CANoe 里的模拟面板里被模拟的网络节点的 I/O 接口。除了标准按钮和开关,在面板编辑器中也可使用位图作为显示和控制器件。可以使用任意的位图编辑软件创建合适的位图,然后用十面板编辑器。任何显示和控制兀件都要和数据库中的环境变量关联好,这样 CAPL 程序可以在 CANoe 主程序中读写显示和控制兀件。使用 CANoe 进行开发的三个阶段使用 CANoe 的开发过程可以分为 3 个阶段:第一个阶段是利用数字仿真进行网络需
3、求分析和设计阶段。该阶段首先要定义网络里的通讯需求,包括:需要几个节点;在网络中要发送多少个报文;数据从哪个节点传输到哪个节点;每个报文的具体组成;有哪些外部的输入输出。然后,利用网络数据库工具CANdb+建立起 CAN 通讯数据库。接下来,建立网络拓扑结构,选择总线的波特率,定义节点的网络行为,使用 CANoe 建立各个网络节点的模型,并通过仿真来预估在设定波特率情况下的总线负载和延迟。通过第一个阶段的仿真可以检验各个节点功能的完善性和网络的合理性,也可以监控网络负载和延迟。第一阶段如图 3-3 所示。图 3-3 完全数字仿真第二个阶段是节点实现和半物理仿真阶段。第一个阶段结束后,我们能够得
4、到一个完整的系统功能模型。接下来,可以开发真实的控制器节点,并利用总线接口与 CANoe 上剩余的虚拟节点相连接,来测试真实节点的功能,如通信、纠错。对于并行开发的节点,就可以不受其它节点开发步骤的影响。第二阶段如图 3-4 所示。图 3-4 半物理仿真第三个阶段是全系统集成阶段。开发的最终阶段将逐步把所有的虚拟节点用真实的节点来替代,此时,CANoe 只是观察分析的工具了。在这个过程中,整个系统包括各个功能节点都能详细的检查到。由于利用功能模块取代真实的网络节点能减少错误的发生,因此通过这两种状态的切换能检查其功能的完善性。第三阶段如图 3-5 所示。图 3-5 完全物理网络3.3 面板的设
5、计面板编辑器用于创建图形面板。在图形面板中可以在模拟测量的过程中方便地改变离散或是连续的环境变量的值。面板编辑器既可以单独启动也可以从 CANoe 主程序中启动,从 CANoe 主程序中启动时,和主程序中关联的数据库会自动关联到面板编辑器中。表 3-1为所有控制面板的元件一览。所有放在面板上的元件称为“控件” 。 “控件”可分为控制元件和显示元件,控制元件(如开关,按钮等)用于改变环境变量的值,显示元件用于显示环境变量的值(如报警灯等) 。对于不同类型的环境变量有特定的元件可用,如对于离散的变量可用开关和显示灯等,对于连续的变量可用滑块,对于字符串型的环境变量可用文字输入框。除此之外,还可以放
6、入静态的和环境变量无关的元件,如作为背景的位图,用于说明的文字等。所有的“控件” (显示和控制元件)必须和数据库中的一个环境变量或信号相关联。3.4 CAPL 编程3.4.1 CAPL 简介CANoe 的通用性、易用性很大程度上是因为用户可以对 CANoe 进行编程。CAPL 是 CAN Access Programming Language 的缩写。CAPL 是一种类 C 语言的程序语言。利用 CAPL 可以在单个的应用中对 CANoe 进行编程。在网络节点的开发过程中,往往会出现其他网络节点还不可用的问题,为了模拟系统环境,这些网络节点的数据流要通过 CAPL 的编程来模拟, CAPL 节
7、点作为功能块插入到数据流图中。CAPL 的输入是事件发生器,CAPL 可以对报文,定时器以及键盘输入做出反应,所以 CANoe 可以用来监控和检测特殊的问题,如CANoe 可以对发布到总线的特定报文做出反应,然后可以调用户自定义的分析和测试函数。CAPL 同样也可为控制器的开发模拟总线环境,通过 CAPL,对怎样的事件做出怎样的反应可以完全由用户来定义决定。因为 CANoe 有两个硬件接口,通过 CAPL 的编程也可以实现网关的功能。必须要注意的是,在测试设置面板中插入的 CAPL 块能产生报文,但是不能发布到真实总线中去,如果要向总线发布报文,必须把 CAPL 块插入到模拟设置面板中。在 C
8、APL 编程中应尽量引用数据库中的报文,这样做对于提高开发效率非常有用,例如,如果要改变某条报文的优先级,只需改变数据库中这条报文的识别码,然后重新编译 CAPL 程序即可实现,否则要在 CAPL 中去改变每个用到这条报文的地方,非常繁琐而且容易出错。3.4.2 CAPL 数据类型一、CAPL 数据类型如下表所示二、数据定义变量定义int i;message 0x123 HiRain;message MotorData Vector;三、关键字 thisthis代表触发事件的对象on message 100 byte byte_0;byte_0 = this.byte(0);/将ID为100的
9、报文的信号byte的值送变量byte_0,this 指ID为100的报文.on envVar Switch int val;val = getvalue(this);得到环境变量Switch的值送val,this指Switch.3.4.3 CAPL Broswer3.4.3 CAPL 事件1、消息事件on message123 /对消息123(dec) 反应on message 0x123 /对消息123(hex)反应on message MotorData /对消息MotorData(符号名字)反应on message CAN1.123 /对CAN 通道1收到消息123反应on messag
10、e* /对所有消息反应on message 100-200 /对 100-200 间消息反应2、键盘事件 on key 0x20 /按空格键反应on key F1 /按F1 键反应on key Ctrl-F12 /按Ctrl + F12键反应on key PageUP /按PageUp 键反应on key Home /按Home 键反应on key * /按所有键反应on key a/对按键 a 反应on key /对空格反应3、时间事件定时器声明msTimer myTimer; / 将myTimer 申明ms为单位的变量timer myTimer; /将myTimer 申明s为单位的变量定时
11、器函数setTimer(myTimer,20); /将定时值设定为20ms,并启动cancelTimer(myTimer); /停止定时器myTimer定时器事件on timer myTimer /对 myTimer 设定的时间到反应4、环境变量事件环境变量函数getValue() /获取环境变量的值putValue() /设置环境变量的值环境变量事件on envVar XXX5、输出文本WriteWindowwrite函数int h=100;char ch=a;char s1008=“hundred”;write(“Hundred as a number:%d,%x”,h,h);write(
12、“Hundred as a string:%s”,s100);write(“The square root of two is %6.4g”,sqrt(2.0);3.4.4 CAPL 响应1、对的报文响应on message 0x64if(this.byte(2)=0xFF)write(“Third byte of the message is invalid”);on message MotorDataif(this.temperature.phys=150)write(“Warning: critical temperature”);2、对键盘响应on key a message Moto
13、rData mMoDa;mMoDa.temperature.phys=60;mMoDa.speed.phys=4300;output(mMoDa);on key b message 100 m100= dlc=1;m100.byte(0)=0x0B;output(m100);3、定时器处理Variablesmessage 0x555 msg1 = dlc=1;msTimer timer1;on startsetTimer(timer1,100);on timer timer1setTimer(timer1,100);msg1.byte(0)=msg1.byte(0)+1;output(msg1
14、);4、环境变量的处理on envVar evSwitchmessage MotorData msg;msg.bsSwitch = getValue(this);output(msg);3.5 CANoe 数据库在一个联网的总线系统上的所有数据和它们之间的相互关系,通常都存储在一个集中数据库中,CANoe 提供一个数据库编辑器,在这里可以随意的创建和更改数据库中的信息。由数据库编辑器创建的数据库可以被各个程序和工具调用,如图 3-6 所示。数据库中的两个对象之间可以通过关联建立联系。例如,将一个信号和一个报文关联,就可以决定在哪条报文中发送这条信号,可能的关联关系见表 3-2。表 3-2 数据
15、库中可关联的对象图 3-6 数据库和其他应用下面对 CANoe 中的数据库中的各种对象做一下简要说明:整车即整车上的网络系统,可能包括一个以上的总线网络,相互之间由网关进行连接。网络:通常包括多个控制单元,控制单元被连接到同一个总线上,通过总线交换信息。控制单元:控制单元是在网络中分布的执行单元。控制单元通过属于它的网络节点和网络交换信息。一个控制单元可以包括多个网络节点。环境变量也被指派到不同的控制单元。因为控制单元在网络中不是独立的,在 CANoe 测试运行的时候不能改变控制单元的名称和描述。环境变量:CANoe 提供环境变量来模拟网络节点针对功能总线做出的反应。环境变量由系统环境中的事件
16、和状态来描述,如外界压力,温度,开工位置等。通过用户定义的控制面板可以随意地更改环境变量,也即改变系统环境中的状态。在 CAPL 中对于环境变量变化做出反应的事件可用“on envVar”语句来描述。GetValue()语句和 putValue()语句用来读和写环境变量。环境变量由以下系统参数来定义, 符号化的名称 数据类型,包括整型,字符串,浮点型,数据型等 修改权,包括无限制,只读(传感器型) ,可写(执行元件型) ,特定控制器可读写等 单位,机环境变量的物理单位 最大最小值 长度 注释网络节点:网络节点是控制单元和网络交换数据的接口,控制单元通过网络节点从网络收发信息。网络节点由以下系统
17、参数来定义 符号化的网络节点名称 地址节点组:多个网络节点可以组成节点组,例如,网络上所有同一家制造商提供的节点可以组成一个节点组。节点组也可用来构建网络的变种,所有车型变种都会用到的节点可以组成一个节点组,这个节点组和网络的所有变种相关联,选装的网络节点再单独和网络关联。报文:即在总线上传递的报文信息,由以下系统参数定义, 符号化的报文名称 识别位(CAN ID) ,在一个网络中必须统一分配,不能重复使用 字节数 传递类型 循环时间(如果报文被周期性的发送) 网络节点,即发送这条报文的网络节点 报文信号 注释信号: 信号是信息的最小单元,由以下系统参数定义 符号化信号名称 信号长度 格式 数
18、据类型 系数,基准和物理单位。 “原始值”是网络上传递的实际数据, “物理值”是真实反应的物理量大小(如速度,转速,温度等) 。信号转换公式用于把原始值转换成物理值:物理值(原始值系数)基准。 初始值。用物理值来定义。 最大和最小值。用物理值来定义。 单位。物理量的单位。 注释3.6 CANoe 主窗口设计CANoe 主程序中包括以下窗口:a.模拟设置窗口模拟设置窗口中图形化显示被模拟的总线和网络节点。在模拟设置窗口中,模拟总线用红线来表示,真实总线用黑线来表示。它们之间通过 PC 卡连接在一起。如图 3-7 所示。图 3-7 仿真设置窗口b.测量设置窗口测量设置窗口中显示数据流的示意图,包括
19、数据源,基本功能块,热点,数据接受器等。在在线模式下 CAN 卡作为数据源,记录总线上的报文并把它们发到 CANoe。测量窗口下的数据流是有方向的,总是从左边的连接符号(连到模拟设置窗口)流向右边的评价窗口。测量设置窗口例子如图 2-6 所示。图 3-8 测量配置窗口c.跟踪窗口所有到达跟踪块的输入的数据都以文本形式在跟踪窗口中显示。图 3-9 显示了跟踪窗口的一个例子。图 3-9 跟踪窗口D.图形窗口图形窗口用来显示信号随时间的变化。如果使用了数据库,信号的值可以直接作为物理变量显示在图形窗口上,如发动机转速可以直接以“转/分”的单位显示。e.写窗口写窗口在 CANoe 中有两个作用:第一,
20、测量过程中的重要系统信息在这显示,如:测量开始和结束的时间,预设的波特率,记录功能的触发,测量结束后的统计报告等。第二,在 CAPL 编程中用了“write()”语句输出的信息都在这显示。f.数据窗口数据窗口中显示信号的值,信号即 CAN 报文中的一个数据段,如发动机控制器发出的 CAN 报文中的某一段表示发动机转速。如果用了数据库功能,那么在数据窗口中的数据可以以物理变量的形式显示,如发动机转速可以以“转/分”的单位显示。在数据窗口中被显示的信号要预先定义好。g.统计窗口统计窗口总可以显示总线上报文之间的平均间隔时间,也可显示每秒总线上的报文数量。同时还可以后台统计所有活动的总线,其结果可以
21、显示在写窗口中,也可以储存下来。f.总线统计窗口显示如总线负载率,峰值负载,错误帧等统计信息,如图 3-10 所示图 3-10 总线统计窗口第四章灯光控制系统仿真4.1 通信数据库的建立4.1.1 概述进行CAN 网络系统的开发,开发人员首先需求做的是系统功能的定义,即定义该网络系统通信对象,根据通信特点选择所需要的网络类型,以及选择网络的属性(例如波特率);同时需要考虑网络里的通信需求:即所需要的节点数目,所需要发送报文(Message )的数量及ID 等;定义报文的收发节点,即每个报文是从哪个节点(源节点)传送至哪个节点(目标节点);每个报文所包含的具体信号(Signal);定义每个信号的
22、数据类型和对应真实物理值之间的转换方式,以及信号在报文的数据场中的地址分配等等。在上述定义过程中,可使用Vector 公司的网络数据库工具CANdb+,创建和管理前述分布式网络定义和通信数据,能检查出概念定义的一些错误并及时改正,同时可以帮助工程设计人员对网络进行优化。另外,在CANdb+中,还可以加上环境变量来描述外部的输入输出。本文只进行灯光控制系统的仿真设计,不考虑其它因素,因此通信数据库比较简单。在CANoe中工具选择CANdb+数据库编辑器,新建一个数据库,命名为Vehicle_light。4.1.2 报文的建立报文即网络节点发送的一帧数据信息,在 CANoe 中主要定义标识符和数据
23、位,其他部分由 CANoe 根据 CAN 协议来完成。对报文进行命名时要注意统一规范并且要便于理解,如全部以“m”开头,代表这是 “Message”,灯光控制器发送的第一条报文为“mLight_1” ,第二条为“mLight_2” ,仪表控制器发送的第一条为“mMeter_1” 等,有的控制器在目前虽然只发一条报文,但是为了以后扩展方便,应同样加上编号。接下来在同一网络中对信息进行标识符分配,因为在 CAN 通讯中标识符直接决定了报文的优先级,所以对于标识符的分配非常重要,对于比较紧急的情况报文应具有较高的优先级。中因本文只需要定义一条报文,所以标识就没有什么意义了,定义报文 ID 为 0x0
24、1。在数据库左侧树目录中选择 message 项,右击选择 new弹出报文定义对话框,在对话框中可以定义报文的名称、ID、帧类型等。如图 4-1 所示图 4-1 创建报文4.1.3 信号的建立信号即报文中的某一段,代表某一个物理量或信号,是 CAN 中信息传递的最小单位。同样对于信号的命名要注意同样规范和便于理解,例如以“jinguang”代近光灯信号,以“Bwudeng”代表后节点雾灯信号。对于数值量来说,所表示数值的范围和需要的精度决定了系数和基准,如转速信号,如果要精确到 0.125 转/分,就以 0.125 为系数,精度越高,表示同样范围的数据就需要占用更多的数据位。如发动机转速,以
25、0.125 为系数,占用 16 位(2 个字节) ,可以表达最大为 8191.875 转/分的转速,如果要表示负的量,如冷却液温度等,就把需要表达的最低值定为基准,如-40,CANdb+Editor 中可以自动根据基准值和参数以及信号所占的位数来计算信号的最大值和最小值。对于开关量,只占用一位,在值定义里说明含义,如“0”代表关, “1”代表开。在数据库左侧树目录中选择 Singel 项,右击选择 new弹出信号定义对话框,在对话框中可以定义信号的名称、位索引类型、值类型、物理单位,系数、偏移量等。如图 4-2 所示图 4-2 创建信号本文定义的和灯光通讯相关的信号如表 4-1 所示。表 4-
26、1 定义的信号定义好报文和信号后还要将报文和信号进行关联,报文与信号关联有多种方式,可以在定义报文时直接加入关联的信号,或在定义信号时加入关联的报文,还可以在数据库左侧树目录中直接选择一个信号按住左键拖到要关联的报文下,报文和信号进行关联时,需要确定信号在报文中的起始位置,可能值为063。在 CANoe 中将信号和报文关联完毕后,在报文属性的 Layout 窗口中可以非常直观地看到信号在报文中的分布情况,如图 4-3 所示,一帧报文的 8 个字节 64 位以表格的形式被直观地表达出来,在这个表格中,可以看到 64 位的每一位各被什么信号占用,每个信号占用的位的长度和起始终止位置。4.1.4 环
27、境变量的建立环境变量的命名也需要注意规范和便于理解,如以“SW1”代表开关 1 的控制型环境变量, “Ljinguang”代表近光灯显示型环境变量。这样的统一命名对于后期的使用非常有利。在数据库左侧树目录中选择 Environment 项,右击选择 new弹出环境变量定义对话框,在对话框中可以环境变量的名称、值类型、最大值,最小值等。如图 4-3 所示图 4-3 环境变量的定义本项目中建立的环境变量清单如表 4-2 所示:表 4-2 定义的环境变量4.2 建立虚拟节点对于一个和 CANoe 相连的真实网络来说,所有 CANoe 发出的报文信号都是从 CANoe 的 CAN(CANcaseXL)
28、卡发出的,但是在 CANoe 软件内部,不同的报文信号是由不同的虚拟节点发出来的,为了仿真灯光控制系统,需要在CANoe 软件里创建各个节点。接下来就要在 CANoe 的 Simulation Setup 窗口中构建虚拟网络,包括各个被模拟的节点。完成纯数字仿真Simulation Setup 窗口初始界面如图 4-4 所示图 4-4Simulation Setup 初始界面图中的方框代表一个总线系统,红线代表虚拟的总线,黑线代表实际的总线,CANoe 提供的 CAN 卡(CANcaseXL)是虚拟总线和实际总线之间的接口。右键点击这两条线,出现如图 4-5 所示界面:图 4-5 加入网络节点
29、Insert network node 可以在总线上加入一个网络节点;Insert test module 可以在总线上加入一个测试模块;Insert generator block 可以在总线上加入一个发生器(可以不用 capl 语言就可以在总线上发出想传送的信息) ;Insert interactive generator block 可以在总线上加入一个内部发生器(可以在用 measurement 监测的时候就能对设定的动作进行操作,发出信息) ;Insert replay block CAN 可以在总线上加入一个重放模块,只需在其中设置measurement 中的 log 保存下来的*
30、.asc 文件进行播放,就可以立即模拟出刚才总线上报文发送的情况;Switch all blocks to simulation 即把所有总线上的模块立即与总线相连;Switch all blocks to real-time mode 即把所有总线上的模块立即与总线断开。在 Simulation Setup 中加入以下的虚拟网络节点:Main 主控制器Front 前车灯控制器Back 后车灯控制器虚拟节点建立设置完毕后,还要将上一章中建立的数据库和此 Simulation Setup 总线关联,在右侧树状图右键点击 Databases,出现如图 4-6 所示界面:图 4-6 加入数据库点击
31、ADD 可加入数据库,如 Vehicle_Light.dbc。完成后的 Simulation Setup 如图 4-7 所示。图 4-7 完成的模拟设置窗口4.3 创建面板面板编辑器中创建的面板是人机交互的界面,通过面板可以以直观的方式让 CANoe 按操作者的意图发送出相应的 CAN 报文4.3.1 建立控制面板在 CANoe 工具中选择 Panel editor,然后在面板上添加开关和灯,设计控制面板如图 4-8 所示:图 4-8 控制面板开关用于输入控制值,灯根据开关状态亮灭。面板上的控件都要和相应的环境变量相关联, 选择一控件右击配置,打开环境变量配置对话框如图 4-9 所示。设置关联
32、的环境变量。对于显示灯除了和相关的显示环境变量关联外,还需要指定对应的位图,位图上有开关的不同状态的显示,设置和位图如图 4-10 所示。图 4-9 开关型环境变量的配置图 4-10 显示灯设置完成面板设计后需要将设计的面板加到 CANoe 中,在 CANoe 中选择PanelConfigure panels,打开添加对话框,如图 4-11 所示。单击 add 可以添加面板,display 显示选择的面板,display all 显示所有面板。图 4-11 添加面板4.4 CAPL 编程界面完成后,CANoe 还不能根据对界面操作发出 CAN 报文或根据 CAN 报文在模拟面板作出相应反应,为
33、了达到这一目的,还必须进行 CAPL 编程的工作,主控节点程序框图如图 4-11 所示:否初始化(on Start)设置循环发送间隔时间(timer)开关状态是否改变?根据开关状态给相应信号赋值发送报文是否是时间到?图 4-12 主控节点程序流程框图前后车灯节点程序流程图是否接收到报文?初始化,设置定时器间隔时间根据接收的报文,为显示灯赋值是否图 4-13 前后节点程序流程框图接下来以主控节点和前车灯节点为例,说明 CAPL 编程过程。CAPL 是类 C 的编程语言,在编程界面的左侧树状图中分别有变量声明,系统,CAN 控制器,报文,定时器,键盘,错误帧,环境变量,函数等项,如图 4-12 所
34、示,只需在分别在相关栏目中写入程序即可。变量声明程序如下:variablesmessage Light Msg1;mstimer timer1;以上程序中,将 msg1 设置为信息变量,并且和 Vehicle_Light 数据库里的信息相关联,将 timer1 设置为以 ms 为单位的时间变量。图 4-14CAPL 编程System 的启动部分主要进行一些初始化的工作,程序如下:on startsettimer(timer1,200);以上程序首先将相关的报文信号初始化置零,然后发出首条初始报文,根据设定的发送时间间隔设置时间变量值,最后在 write 窗口给出提示信息。Timer 部分是定时
35、器相关的设置,程序如下:on timer timer1settimer(timer1,200);output(Msg1);以上程序段在 time1r 定时器到时 msg1 报文,并且重新设时器 100ms。Environment 部分对环境变量的改变做出反应,程序如下:on envVar Szhidongif(getvalue(this)=1)Msg1.zhidong=3;elseMsg1.zhidong=0;output(Msg1);以上程序段在开关状态发生改变时(通过对控制面板的操作实现) ,将根据开光状态对相应的报文里的相关信号赋值,环境变量的值是通过 getvalue 函数得到的。复制
36、后 CANoe 下次发出此条报文时,里面的信号的值都已根据控制面板的变化发生了相应变化。4.5 仿真结果分析按以上步骤建好节点功能模型和面板后,即可进行系统的软件仿真。首先设置软件为仿真模式,在工具栏上选择开始按钮即开始仿真。报文发送情况如图 4-16 所示:图 4-16 数据跟踪窗口仿真过程中总线的负载和各种统计数据如图 4-17 所示图 4-17 总线统计窗口从仿真结果可以看出报文发送情况良好,总线负载为 0.42%,峰值负载为0.58%第五章 软件设计由于时间关系,本文不进行灯光系统的硬件电路设计,采用周立功单片机实验箱模拟真实节点的ECU,采用SJA1000CAN 控制器,进行系统的软
37、件设计,5.1 SJA1000初始化CAN 控制器在上电或硬件复位后必须进行初始化操,然后才能进行发送和接收数据。SJA1000 CAN 控制器的初始化主要设置以下几项内容:通信方式、滤波方式、验收滤波器设置、总线定时等。SJA1000 初始化流程图如下:开始初始化工作方式设为复位模式设通信方式为 PeliCAN设验收代码和验收屏蔽寄存器设通信波特率输出控制字清除错误代码寄存器初始化结束设滤波工作方式SjA1000 初始化程序如下:void SJA1000_Config_Self(void)SJAEntryResetMode(); /进入复位模式WriteSJAReg(REG_CAN_CDR,
38、0xc8); /选择 PeliCAN 模式SetBitMask(REG_CAN_MOD,AFM_BIT); /选择单滤波模式WriteSJARegBlock(16, /设置验收代/码/屏蔽寄存器WriteSJAReg(REG_CAN_OCR,0x1a); /设置输出管脚SJASetBaudrateStandard(CAN_Baudrate_Filter_Buffer0); /设置总线定时/器,确定波特率SJAQuitResetMode(); /退出复位模式5.2 节点的发送程序发送节点报文发送采用周期查询方式,只要总线空闲就可向总线上发送报文,发送节点程序流程图如下: 开始读状态寄存器发送缓冲
39、区空闲?写发送标识符写发送数据置发送请求位结束YN节点发送程序如下:Send_Message()while(1)if(ReadSJAReg(REG_CAN_SR)/写帧信息和标识符WriteSJAReg(21,data1);WriteSJAReg(22,data2);WriteSJAReg(23,0) ; /写发送数据SetBitMask(REG_CAN_CMR,TR_BIT); /置发送请求位Delay_ms(5); Delay(100)5.2 节点的接收程序报文接收采用中断方式,当 SJA1000 接收到一条完整的报文后,就会产生接收中断,将中断引脚电平置低,单片机外中断引脚接 SJA10
40、00 中断引脚,SJA1000 接收到报文后,单片机进入中断,从 SJA1000 接收缓冲区中读出接收数据。中断接收程序流程图如下:中断开始读状态寄存器:总线关闭,错误状态,数据溢出,有无数据?数据溢出?YNYN总线关闭?接收缓冲区有数据?计算报文长度报文存入就收缓冲区释放接收缓冲区结束清中断寄存器,复位请求位清零清除溢出中断,释放接收缓冲区NYNY中断服务程序如下:void RX_Service(void) interrupt 0 /中断服务程序uchar value,i,j;if(ReadSJAReg1(REG_CAN_SR) /读中断寄存器,清除中断位WriteSJAReg1(REG_C
41、AN_MOD,0x08);/将方式寄存器复位请求位清零else /总线正常value=ReadSJAReg1(REG_CAN_IR); /清除中断位if(value /清除数据溢出和释放接收缓冲区elseif(value /取数据字节长度for(j=0;i0;i-,j+) /读取数据Bufferj=ReadSJAReg1(21+j);WriteSJAReg1(REG_CAN_CMR,0X04);/释放接收缓冲区 5.4 程序调试节点程序编译无误只能说明此程序无语法错误,能不能实现要求的功能,还要进行程序的调试,检验结果是否正确。下面以主控节点为例,利用 CANoe的半物理仿真功能进行程序的调试,验证程序是否正确。用 CAN 总线电缆连接 CANcaseXL 的通道 1 和 SJA1000 CAN 控制器,打开在上一章建立的纯软件仿真系统。选择主控节点,右击选择设置,在Simulation 中选 off(表示此节点被真实节点代替)如下图示: