全部博文(396)
分类: 嵌入式
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”。位 0 到位 6( bits0~6)表示节点状态,可为下表中的数值。
注意:带*号的状态只有支持扩展 boot-up 的节点才提供。注意状态 0 从不在节点保护应答中出现,因为一个节点在这个状态时并不应答节点保护报文。
或者,一个节点可被配置为产生周期性的被称作心跳报文( 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中的各种示例程序适用于多种平台(Unix、Win32等),多种场合。本次测试用的程序是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文件。但由于没有设置CAN口ID等参数,此时无法执行,可按系统提示进行设置,如图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节的介绍可知,ID为00000001时发送的报文是NMT报文。data[0]=01时,表示的意义是启动一个节点,data[1]=01表示的是节点ID,这个ID与图5-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,这个ID与图5-2中设置的从节点ID保持一致。发送图5-6中所示的数据时,节点状态由“Node-Operational”转换为“Node-stopped”状态,正确响应命令请求。如图5-7所示。
图5-6 CANTest中设置发送数据截图
图5-7 从节点状态变化截图