您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 4.4-4.5-定制一个CAN-bus应用层协议及其驱动
定制一个CAN应用层协议及其驱动目录CAN应用层协议驱动函数制定CAN应用层协议说明CAN应用层协议结构定义定制CAN应用层协议本节制定一个简单的CAN应用层协议并实现其驱动,协议中只使用了标准帧中的数据帧。协议定义如下:11位报文ID的分配ID.6~ID.3ID.10~ID.7ID.2~ID.0SrcAddr:发送CAN报文节点的地址DstAddr:接收CAN报文节点的地址FunCode:功能码,指明一帧数据的作用其他定义FunDataLen:功能参数长度变量,指示功能参数的字节个数FunData:功能参数数组,最多包含8个字节目录CAN应用层协议驱动函数制定CAN应用层协议说明CAN应用层协议结构定义CAN应用层协议结构体定义根据定制的CAN应用层协议,定义CanAppProtocolFrame_t联合数据类型,如下:typedefunion{CanFrame_tCanFrame;struct{unsignedlongSrcAddr:4;//源地址unsignedlongDstAddr:4;//目的地址unsignedlongFunCode:3;//功能码unsignedlongresev:5;//保留位unsignedlongresev1:8;//保留位unsignedlongresev2:8;//保留位unsignedcharFF;//是否为扩展帧unsignedcharRTR;//是否为远程帧unsignedcharFunCodeLen;//功能参数长度unsignedcharFunCode[8];//功能参数数组}ProtocolFrame;}CanAppProtocolFrame_t;typedefstruct{unsignedlongID;//帧IDunsignedcharFF;//是否为扩展帧unsignedcharRTR;//是否为远程帧unsignedcharDLC;//帧数据长度unsignedcharData[8];//帧数据}CanFrame_t;由于联合体成员是共享内存的,所以ProtocolFrame和CanFrame_t结构体实例的成员之间存在对应关系。CAN应用层协议结构体定义ProtocolFrame结构体实例以小端存储结构为例,ProtocolFrame结构体实例的成员与CanFrame-t结构体实例成员占用内存空间是一一对应的。CanFrame_t结构体实例内存地址低高resev1resev2FFRTRFunCodeLenFunCode[0]FunCode[8]DstAddrSrcAddrBit7Bit4Bit3Bit0FunCoderesev5Bit7Bit3Bit2Bit0……ID[23:16]ID[15:8]ID[7:0]FFRTRDLCData[0]Data[8]ID[31:24]……目录CAN应用层协议驱动函数制定CAN应用层协议说明CAN应用层协议结构定义CAN报文处理函数定义首先,CAN应用层协议驱动定义一个函数指针类型,在CAN帧处理函数中调用该类型的回调函数识别功能码和功能参数。typedefvoid(*CapHandle_PFUN)(unsignedcharFunCode,unsignedcharFunData)CAN报文处理函数intCAN_CapFrameHandle(charLocalAddr,CanFrame_t*pCanFrame,CapHandle_PFUNcallback)功能码功能参数函数功能:处理接收到的CAN帧本地地址指向接收到的CAN帧的指针具体处理CAN帧的回调函数指针返回值:1——报文处理成功;0——报文处理过程中出错。CAN报文处理函数CAN帧处理函数具体如下:IntCAN_CapFrameHandle(charLocalAddr,CanFrame_t*pCanFrame,CapHandle_PFUNcallback){CanAppProtocolFrame_t*pCp=NULL;if(pCanFrame==NULL)return0;//如果指针为空则返回失败pCp=(CanAppProtocolFrame_t*)pCanFrame;//转化成指针类型if(pCp-ProtocolFrame.FF!=0)return0;//不使用扩展帧if(pCp-ProtocolFrame.RTR!=0)return0;//不使用远程帧if(pCp-ProtocolFrame.DstAddr!=LocalAddr)return0;//保证接收帧的地址等于//本地地址if(callback!=NULL){//调用回调函数处理CAN帧callback(pCp-ProtocolFrame.FunCode,pCp-ProtocolFrame.FunData[0]);return1;//处理成功返回1}return0;}应用层CAN帧发送函数应用层CAN帧发送函数定义如下:intCAN_CapFrameSend(charSrcAddr,charDstAddr,charcmd,char*pData,charlen)函数功能:应用层发送CAN帧源地址:发送CAN帧的节点地址目的地址:接收CAN帧的节点地址功能码:表示CAN帧的具体作用功能参数功能参数的长度(以字节计数)返回值:1——报文发送成功;0——报文发送失败。应用层CAN帧发送函数应用层CAN帧发送函数具体如下:intCAN_CapFrameSend(charSrcAddr,charDstAddr,charcmd,char*pData,charlen){CanAppProtocolFrame_tCp;Cp.CanFrame.FF=0;//设定成标准帧Cp.CanFrame.RTR=0;//设定成数据帧Cp-ProtocolFrame.SrcAddr=SrcAddr;//设定CAN帧源地址Cp-ProtocolFrame.DstAddr=DstAddr;//设定CAN帧目的地址Cp-ProtocolFrame.FunCode=cmd;//设置功能码if(pData!=NULL){if(len8)return0;//数据长度大于8个字节发送失败memcpy(Cp.ProtocolFrame.FunData,pData,len);//复制数据到结构体缓冲区}Cp.ProtocolFrame.FunDataLen=len;//设定功能数据长度returnHal_CanMsgSend(&Cp.CanFrame);//发送CAN帧}虚拟驱动层CAN帧发送函数
本文标题:4.4-4.5-定制一个CAN-bus应用层协议及其驱动
链接地址:https://www.777doc.com/doc-6058030 .html