首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 单片机栏
基于CAN总线通信协议的设计与实现
来源:本站整理  作者:佚名  2009-06-18 16:14:20




本文设计的信息优先级从高到低依次为:信息功能标识、任务功能标识和目标节点地址标识。信息功能标识设在ID的最高几位,通过3位的功能代码可以区分某些情况的8种基本功能:这些功能可以为节点状态控制、节点保护、紧急情况通报以及有时间标记的信息等;接收任务标识表明本帧数据的任务属性,容量为32;目标节点地址指示本次数据的目的地址,容量为8。
DATA0.0在本协议中作为标志位,用来区别单帧传输和多帧传输,解决了大于8字节的字符串的传输问题。当标志位为1时,表示传送的是多帧数据;为0时表明是单帧数据。这样克服了CAN 只能传输小于等于8字节数据的缺点,实现了大于8字节的数据的传输。
为了识别多帧传输中可能会出现的重帧和丢帧现象,本协议规定数据场第一字节作为多帧数据传输次序的索引。按照本协议制定的格式传输数据时,单帧最多传输7字节的实际数据:当数据流长度大于7字节时,就要分成多帧传送。
3 应用层协议设计
在CANV2.0规范标准中,只规定了ISO参考模型的物理层和数据链路层,没有规定媒体的连接单元以及驻留媒体,也没有规定应用层。物理层负责譬如物理信号传输、译码、位时序和位同步等功能,而数据链路层负责总线仲裁、信息分段以及数据安全、数据确认、错误检测、信号传输和错误控制的功能。实际上,即使在执行一些非常简单的基于CAN的分布式系统时。除了基本的两层服务之外,还要求或希望有更多功能,如发送长于8字节的字符串、响应或确定数据传送、标识符分配、网络启动或监控节点。
由于这些附加的功能直接支持应用过程,所以它可以被认作“应用层”。如果正确执行,则应用层以及相应的应用层接口(子协议)为通讯和应用过程提供了一个清晰定义的分界以便把它们区分开来。在一些利用简单的通信协议就可以满足要求的情况下,采用复杂的协议会造成资源的浪费,而且,使用起来也很不方便,反而限制了CAN的灵活性。所以在一些情况下制定适合要求的通信协议,对CAN的开发和使用至关重要。本文根据实际系统设计的需要,在2.0A技术规范的基础上制定了CAN应用层通信协议。
CAN应用层协议主要负责建立CPU与底层之间的桥梁,它主要由四部分组成:节点的开关机制、数据的收发机制、错误处理机制和中断管理机制五部分组成。四种机制互相联系、互相制约,共同维护系统的运转。限于篇幅本文主要介绍关键的数据收发机制。
3.1 数据发送机制
发送机制主要实现将CPU要发送的数据接过来,并整理为符合应用层协议规定的帧格式,将拆卸好的小包(数据帧)顺序放入循环队列中等待发送,并负责管理和维护发送循环队列的止常运转。在定时器定时中断中定期对循环队列进行扫描,如果发现队列中有数据等待发送,则调用发送函数将数据发送到CAN总线。
在底层开辟了一个临时缓冲区用于暂时存放等待发送的小包,临时缓冲区采用循环队列的存储结构,对数据实行先入先出的管理模式。循环队列是一个42*11的二维数组,用来暂时安置CPU即将发送的数据,数据被顺序安排在循环队列中等待发送。每增加一帧数据,循环队列的尾指针加1;每成功发送完一帧数据,循环队列的头指针减1。当循环队列中没有数据时,队列的状态为空,否则指示为不空;若循环队列的头指针和尾指针重合而队列又处于不空的状态,此时队列为满的状态。当队列处于满的状态时,禁止向队列再写入数据,否则容易导致数据的覆盖或丢失。队列中数据遵循先入先出的原则,CPU将数据从队列尾部装入,向CAN总线发送数据时则从队列头部将数据读走。发送循环队列的曾理单位为帧,每次操作都是11个字节为单位。在发送机制运转前,首先对发送循环队列初始化,将循环队列的头指针、尾指针赋值为零,将已占用的空间也赋值为零。
CAN发送机制主要由两大模块组成:打小包模块和帧发送模块。当CPU有数据需要发送时,调用打小包函数,要求给出待发送数据的存放地址。打小包函数将会按照本协议规定的格式将发送节点地址、接收节点地址、信息类型、任务标识、数据标识等参数整理为CAN数据链路层ID的格式,将数据组装成符合应用层协议所规定的数据帧(小包),实现对长度大于7字节的数据的打小包处理,按照所填加索引号的顺序放到发送循环队列中等待发送。打小包函数的流程图如图1所示:

上一页  [1] [2] [3] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:64,054.69000 毫秒