首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]J1939与can

[求助]J1939与can

我想问一下:

假如按照J1939协议,有一个发动机到ABS的报文如下:

传输方式:固定周期;
更新率: 100ms

源地址: 0x00(发动机)

接收地址:0x0B(ABS)
I
D0x18FEF100
填充格式: 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编辑过]

飞思卡尔8/16/32位多功能开发板/下载器:
网站:http://www.lqist.cn,
淘宝店:http://shop36265907.taobao.com
呵呵 最近出差刚回来 非常感谢 strayroc!

我还想问下J1939协议中数据长度从9 字节到1785字节的数据传送问题,协议中是这样写的:
如果一个给定的参数组数据长度为9 至1785 字节时,数据通信是通过多个CAN 数据帧实现的。因此,用“多包“来描述这种类型的参数组编号。如果参数组的定义为多包,在少数特定场合只传输少于9 字节的数据时,参数组以单帧CAN 数据帧发送,其中DLC 置8。如果某特定参数组传输9字节或者更多字节,将使用“传输协议功能”。通过传输协议功能的连接管理能力来建立和关闭多包参数组的通信。传输协议功能的数据传输能力,通过传送一系列包含分包数据的CAN 数据帧(包),能独自实现数据通信。另外,传输协议功能还提供了对于目标地址特定的传输的流控制和握手功能。所有与特定多包应答相关的CAN 数据帧必须置DLC 为8。所有没用的字节应置为“不可用”。每组中的字节数目是固定的,但是,本标准中定义的多包消息其包数是可变的或固定的。活动的诊断码的参数组编号即是多组消息中包数可变的一个例子。只有当发送的字节数超过8时,定义为多包的参数组才使用传输协议进行传输。

我想问下,用软件怎么实现呢? 谢谢!

2# strayroc



很不错,顶
2# strayroc


基于J1939的通讯程序怎么写:
例如:A----发动机ECU、B-----ABS、C------变速器ECU
如果A有转速信号SPEED;而B、C需要的话,程序中应该如何??
返回列表