Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3121621
  • 博文数量: 396
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4209
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-04 13:04
文章分类

全部博文(396)

文章存档

2022年(1)

2021年(2)

2020年(8)

2019年(24)

2018年(135)

2017年(158)

2016年(68)

我的朋友

分类: 嵌入式

2017-04-05 13:24:28

在介绍NMT通信机制之前,先介绍一下NMT这个通信对象的定义。在以下部分中COB-ID使用的是 CANopen 预定义连接集中已定义的缺省标志符。

1) NMT 模块控制( NMT Module Control

       只有 NMT-Master 节点能够传送 NMT Module Control 报文。 所有从设备必须支持 NMT 模块控制服务。NMT Module Control 消息不需要应答。 NMT 消息格式如下:


    当 Node-ID=0,则所有的 NMT 从设备被寻址(广播)。 CS 是命令字,可以取如下值:


2) NMT 节点保护( NMT Node Guarding)

    通过节点保护服务, NMT 主节点可以检查每个节点的当前状态, 当这些节点没有数据传送时这种服务尤其有意义。

NMT-Master 节点发送远程帧(无数据)如下:


NMT-Slave 节点发送如下报文应答:


数据部分包括一个触发位( bit7),触发位必须在每次节点保护应答中交替置“ 0”或者“ 1 ”。触发位在第一次节点保护请求时置为“ 0”。位 到位 6( bits06)表示节点状态,可为下表中的数值。


注意:带*号的状态只有支持扩展 boot-up 的节点才提供。注意状态 从不在节点保护应答中出现,因为一个节点在这个状态时并不应答节点保护报文。

或者,一个节点可被配置为产生周期性的被称作心跳报文( Heartbeat)的报文。


状态可为下表种的数值:


当一个 Heartbeat 节点启动后它的 Boot-up 报文是其第一个 Heartbeat 报文。 Heartbeat 消费者通常是NMT-Master 节点,它为每个 Heartbeat 节点设定一个超时值,当超时发生时采取相应动作。

一个节点不能够同时支持 Node Guarding 和 Heartbeat 协议。

3) NMT Boot-up

NMT-slave 节点发布 Boot-up 报文通知 NMT-Maste节点它已经从 initialising 状态进入 pre-operational状态。



以上介绍NMT通信的基本原理和机制。下面介绍NMT通信具体的示例:

本示例中硬件采用的是周立功的USB-CAN模块和ARM A8的RSB-4210开发板,本次程序使用CanFestival中的示例程序修改而成。CanFestival中的各种示例程序适用于多种平台(UnixWin32等),多种场合。本次测试用的程序是examples文件夹中CANOpenShell例程。
具体开发过程如下:

可参考以下步骤修改并编译CANOpenShell应用程序

1. 打开终端”Terminal”

2. 输入命令”cd /CanFestival-3-7740ac6fdedc/examples/CANOpenShell”,切换到CANOpenShell文件夹下;

3. 输入命令”gedit CANOpenShell.c”,可以编辑修改” CANOpenShell.c”文件;

4. 根据第4章中设计的介绍,只需根据需求修改节点处于运行状态时的程序代码,即可实现所需功能。这里修改CANOpenShellOD_operational(CO_Data* d)函数中的内容如下:

void CANOpenShellOD_operational(CO_Data* d)

{

system("cd /tools");

system("echo 177 >/sys/class/gpio/export");

system("echo out >/sys/class/gpio/gpio177/direction");

system("echo 1 >/sys/class/gpio/gpio177/value");

system("sleep 1");

system("echo 0 >/sys/class/gpio/gpio177/value");

system("sleep 1");

system("echo 1 >/sys/class/gpio/gpio177/value");

system("sleep 1");

system("echo 0 >/sys/class/gpio/gpio177/value");

printf("Node_operational\n");

}

程序修改的功能是驱动RSB-4210上的蜂鸣器。蜂鸣器的驱动文件的路径为” /sys/class/gpio/”,可在该文件夹中配置相关文件值,来设定蜂鸣器输入输出的方向和值的大小。

1. 输入2”cd ..”命令,切换到/CanFestival-3-7740ac6fdedc目录;

2. 输入”make”命令编译修改过的文件;

3. 输入”make install”命令把编译好的文件放在install目录下;

4. 输入” CP CANOpenShell /media/rootfs/tools/myinstall/bin/”,把编译生成的CANOpenShell可执行文件拷贝到SD卡上;

5. 拔出SD卡插到RSB-4210开发板上(注意断电插拔SD卡);

6. 打开串口终端软件”AbsoluteTelnet”,按第3章中的相关步骤设置串口;

7. 输入”root”后按回车键;

8. 输入”./br500k.sh”,设置通信波特率为500K;

9. 输入” cd /tools/myinstall/bin/”命令,切换到CANOpenShell所在的目录下;

10. 输入” ./CANOpenShell”命令,执行CANOpenShell文件。但由于没有设置CANID等参数,此时无法执行,可按系统提示进行设置,如图5-1所示:


                                            图5-1 系统设置提示截图

15.按系统提示输入命令” ./CANOpenShell load#../lib/libcanfestival_c

an_socket.so,0,500K,1,0”,如图5-2所示,设置USBCAN-2E-U中的CAN0口通信,通信波特率为500K,把RSB-4210配置成从设备,从设备ID配置成01

执行上述命令后,从节点自动进入预运行状态,如图5-3所示


                                                 图5-2 编译命令截图


                                         图5-3 从节点状态变化截图

16.打开USBCAN-2E-U的测试软件CANTest,配置好波特率等参数后,即可配置帧ID和数据帧的值进行通信。

    在利用NMT通信方式数据帧进行通信时,数据帧的data[0]01时,切换节点状态到运行状态,发送状态和接收状态如图5-4和图5-5所示,同时驱动蜂鸣器发出2次声音;当数据帧的data[0]02时,切换节点状态到停止状态,发送状态和接收状态如图5-6和图5-7所示。

在图5-4中,设置帧ID为:00000001数据帧是8字节数据,从左至右分别为data[0]-data[7]。从1.2.5的介绍可知,ID00000001发送的报文是NMT报文data[0]=01时,表示的意义是启动一个节点,data[1]=01表示的是节点ID,这个ID5-2中设置的从节点ID保持一致。主节点发送后,从节点接收到的数据显示为NMT报文,节点状态由“Node-preOperational”转换为“Node-Operational”状态,正确响应命令请求。


                                     图5-4 CANTest中设置发送数据截图


                                 图5-5 从节点状态变化截图

在图5-6中,从1.2.5的介绍可知,设置帧ID为:00000001,表示发送的是NMT报文。数据帧中data[0]=02,表示的意义是终止一个节点。data[1]=01表示的是节点ID,这个ID5-2中设置的从节点ID保持一致。发送图5-6中所示的数据时,节点状态由“Node-Operational”转换为“Node-stopped”状态,正确响应命令请求。如图5-7所示。


                                    图5-6 CANTest中设置发送数据截图


                               图5-7 从节点状态变化截图

阅读(3911) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~