stm32解析OBD信号-ISO 15765-4

在汽车故障诊断领域,针对诊断设备和汽车ECU之间的数据交换,各大汽车公司几乎都制订了相关的标准和协议。其中,欧洲汽车领域广泛使用的一种车载诊断协议标准是KWP2000 (Keyword Pro-tocol 2000),该协议实现了一套完整的车载诊断服务,并且满足E-OBD(European On Board Diagnose)标准。KWP2000最初是基于K线的诊断协议。由于K线物理层和数据链路层在网络管理和通讯速率上的局限性,使得K线无法满足日趋复杂的车载诊断网络的需求。而CAN (Controller Area Network)网络由于其非破坏性的网络仲裁机制、较高的通讯速率(可达1 M bps )和灵活可靠的通讯方式,在车载网络领域广受青睐,因此,近年来欧洲汽车领域广泛采用了基于CAN总线的KWP2000,即ISO 15765协议,而基于K线的KWP2000物理层和数据链路层协议将逐步被淘汰。

ISO 15765协议是一种CAN总线上的诊断协议。其中ISO 15765-1包括物理层和数据链路层,ISO 15765-2对网络层进行说明,则是规定到应用层的具体服务。下面重点看下网络层,根据ISO 15765-2中的定义,网络层的功能是接收到应用层发送过来的消息流后,根据定义中的分包、位填充和时间控制等步骤,对消息流进行控制传输。流控制输有单帧传输、多帧传输两种类型,根据传输数据的长度进行帧传输方式的选择。相反当接收到来自诊断仪的数据时,网络层完成的是一个组包的过程,这时需要一个可以存放接收的缓冲区。单帧的组包相对简单,而接收到多帧数据则根据接收到的首帧和连续帧的数据域提取,后按照排列顺序重新组合交给上层的应用层。

    ISO 15765网络层的功能主要有:

    (1)为上层的应用层提供接口服务

    (2)进行内部操作。为上层服务提供接口从而实现数据流;主要有为对等实体间的通信提供分段、重组和流控制这几种方法

    (3)网络层中的时间控制。

     网络层原语服务分析:

N_PCI 则包含了原语帧的具体信息如:此消息帧属于何种帧类型(单帧、首帧、连续帧)、帧长度等。N_Data为该原语所包含的具体的数据。网络层内部传输服务,CAN总线上的数据帧没帧只能传输8个字节,ISO 为了适应CAN总线上的数据传输,根据诊断报文数据长度的不同规定了单帧传输和多帧传输两种方式。

程序非常简单

typedef struct {
  u16 cob_id;	/**< message's ID */
  u8 rtr;		/**< remote transmission request. (0 if not rtr message, 1 if rtr message) */
  u8 len;		/**< message's length (0 to 8) */
  u8 data[8]; /**< message's datas */
} Message;
can_message_t  msg;
int main(void)
{
	u8 i=0;
	u16 j,k,l;
	
    
	LED_GPIO_Config();	
	CAN_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_9tq,4, CAN_Mode_Normal);
	msg.cob_id = 0x07DF;
	msg.len = 8;
	msg.rtr = 0;
	msg.data[0] = 0x02;
	msg.data[1] = 0x01;
	msg.data[2] = 0x01;
	msg.data[3] = 0x00;
	msg.data[4] = 0x00;
	msg.data[5] = 0x00;
	msg.data[6] = 0x00;
	msg.data[7] = 0x00;

	while(1)
	{
		Can_Standard_Send_Msg(&msg);
		for(j=0; j<1000; j++){for(k=0; k<5000; k++);}
		GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_RESET);
		for(j=0; j<1000; j++){for(k=0; k<5000; k++);}
		GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_SET);
	}
}

ISO15765-4协议

猜你喜欢

转载自blog.csdn.net/gd1984812/article/details/106100932