我想问一下:
假如按照J1939协议,有一个发动机到ABS的报文如下:
传输方式:固定周期;
更新率: 100ms;
源地址: 0x00(发动机);
接收地址:0x0B(ABS)
ID: 0x18FEF100;
填充格式: Intel。
优先级: 6
如果用mc9s12c32模拟发动机或者ABS,那么发送时或者接收后can模块中的CANID0 - CANID4 的值是多少啊?是不是就是0x18FEF100?不是的话应该怎么计算呢?
谢谢!!
[此贴子已经被作者于2008-11-6 15:10:45编辑过]
楼主一看就是搞商用车的,呵呵!
给你两个函数,时将SAE ID与CAN2.0B ID转换的:
//-------------protocol transfer between MCU(freescale 68hc08GZ series) and SAE-----------
void ID_MCUtoSAE(unsigned char ID_MCU[4],unsigned char ID_SAE[4])
{
ID_SAE[0]=(ID_MCU[0]&0xf8)>>3; //priority
ID_SAE[1]=((ID_MCU[0]&0x07)<<5)+((ID_MCU[1]&0xe0)>>3)+((ID_MCU[1]&0x06)>>1); //PDU format
ID_SAE[2]=((ID_MCU[1]&0x01)<<7)+((ID_MCU[2]&0xfe)>>1); //PDU specific
ID_SAE[3]=((ID_MCU[2]&0x01)<<7)+((ID_MCU[3]&0xfe)>>1); //SA
}
void ID_SAEtoMCU(unsigned char ID_SAE[4],unsigned char ID_MCU[4])
{
ID_MCU[0]=(ID_SAE[0]<<3)+ ((ID_SAE[1]&0xe0)>>5); //IDR0
ID_MCU[1]=((ID_SAE[1]&0x1c)<<3)+0x18+ ((ID_SAE[1]&0x03)<<1)+ ((ID_SAE[2]&0x80)>>7);//IDR1
ID_MCU[2]=(ID_SAE[2]<<1)+ (ID_SAE[3]>>7); //IDR2
ID_MCU[3]=(ID_SAE[3]<<1)&0xfe; //IDR3
}
关注中!
[此贴子已经被作者于2008-11-16 21:15:15编辑过]
我还想问下J1939协议中数据长度从9 字节到1785字节的数据传送问题,协议中是这样写的:
如果一个给定的参数组数据长度为9 至1785 字节时,数据通信是通过多个CAN 数据帧实现的。因此,用“多包“来描述这种类型的参数组编号。如果参数组的定义为多包,在少数特定场合只传输少于9 字节的数据时,参数组以单帧CAN 数据帧发送,其中DLC 置8。如果某特定参数组传输9字节或者更多字节,将使用“传输协议功能”。通过传输协议功能的连接管理能力来建立和关闭多包参数组的通信。传输协议功能的数据传输能力,通过传送一系列包含分包数据的CAN 数据帧(包),能独自实现数据通信。另外,传输协议功能还提供了对于目标地址特定的传输的流控制和握手功能。所有与特定多包应答相关的CAN 数据帧必须置DLC 为8。所有没用的字节应置为“不可用”。每组中的字节数目是固定的,但是,本标准中定义的多包消息其包数是可变的或固定的。活动的诊断码的参数组编号即是多组消息中包数可变的一个例子。只有当发送的字节数超过8时,定义为多包的参数组才使用传输协议进行传输。
我想问下,用软件怎么实现呢? 谢谢!
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |