|  | @@ -1,449 +0,0 @@
 | 
	
		
			
				|  |  | -#include "CAN.h"
 | 
	
		
			
				|  |  | -#if CAN_EN
 | 
	
		
			
				|  |  | -/*=========================================================================
 | 
	
		
			
				|  |  | -函数名称: CAN_SetBps
 | 
	
		
			
				|  |  | -功能描述: 设置波特率
 | 
	
		
			
				|  |  | -输入参数: 波特率
 | 
	
		
			
				|  |  | -输出参数: 无
 | 
	
		
			
				|  |  | -作    者: 吴峰
 | 
	
		
			
				|  |  | -=========================================================================*/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -void CAN_SetBps(CAN_BPS_TYPE BPS)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    CAN_InitTypeDef CAN_InitStructure;
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    switch(BPS)
 | 
	
		
			
				|  |  | -	{        	
 | 
	
		
			
				|  |  | -		case BPS_500K:				
 | 
	
		
			
				|  |  | -			CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;			//1-4
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;			//1-16
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;			//1-8
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_Prescaler=6;				//波特率36/(6*(1+9+2)=500k
 | 
	
		
			
				|  |  | -			break;
 | 
	
		
			
				|  |  | -		case BPS_250K:
 | 
	
		
			
				|  |  | -			CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;			//1-4
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;			//1-16
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;			//1-8
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_Prescaler=12;				//波特率为36/(12*(1+9+2)=250k
 | 
	
		
			
				|  |  | -			break;
 | 
	
		
			
				|  |  | -		case BPS_125K:
 | 
	
		
			
				|  |  | -			CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;			//1-4
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;			//1-16
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;			//1-8
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_Prescaler=24;				//波特率为36/(24*(1+9+2)=125k
 | 
	
		
			
				|  |  | -			break;	
 | 
	
		
			
				|  |  | -		case BPS_100K:
 | 
	
		
			
				|  |  | -			CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;			//1-4
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_BS1=CAN_BS1_14tq;			//1-16
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;			//1-8
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_Prescaler=20;				//波特率为 36/(20*(1+14+3))=100k
 | 
	
		
			
				|  |  | -			break;
 | 
	
		
			
				|  |  | -		case BPS_33K:
 | 
	
		
			
				|  |  | -			CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;			//1-4
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_BS1=CAN_BS1_11tq;			//1-16
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;			//1-8
 | 
	
		
			
				|  |  | -        	CAN_InitStructure.CAN_Prescaler=72;				//波特率为 36/(72*(1+11+3))=33.3k
 | 
	
		
			
				|  |  | -			break;			
 | 
	
		
			
				|  |  | -		default:
 | 
	
		
			
				|  |  | -		    return;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	CAN_InitStructure.CAN_TTCM=DISABLE;		//时间触发(启用时间触发模式时会替换最后两个字节)
 | 
	
		
			
				|  |  | -	CAN_InitStructure.CAN_ABOM=ENABLE;		//自动离线管理
 | 
	
		
			
				|  |  | -	CAN_InitStructure.CAN_AWUM=ENABLE;		//自动唤醒
 | 
	
		
			
				|  |  | -	CAN_InitStructure.CAN_NART=ENABLE;		//ENABLE:错误不自动重传 DISABLE:重传
 | 
	
		
			
				|  |  | -	CAN_InitStructure.CAN_RFLM=DISABLE;
 | 
	
		
			
				|  |  | -	CAN_InitStructure.CAN_TXFP=DISABLE;
 | 
	
		
			
				|  |  | -	CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;		//正常传输模式	CAN_Mode_Silent_LoopBack;//CAN_Mode_LoopBack;//
 | 
	
		
			
				|  |  | -	CAN_Init(CAN1,&CAN_InitStructure);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -/*=========================================================================
 | 
	
		
			
				|  |  | -函数名称: CAN_SetFilterStd
 | 
	
		
			
				|  |  | -功能描述: 设置标准帧过滤器
 | 
	
		
			
				|  |  | -输入参数: 过滤器号码,过滤的ID和屏蔽器
 | 
	
		
			
				|  |  | -输出参数: 无
 | 
	
		
			
				|  |  | -作    者: 吴峰
 | 
	
		
			
				|  |  | -=========================================================================*/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -void CAN_SetFilterStd(u8 number,u16 ID,u16 Mask)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    CAN_FilterInitTypeDef  CAN_FilterInitStructure;
 | 
	
		
			
				|  |  | -    /* CAN 过滤器设置 */
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterNumber=number;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterIdLow=ID;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterMaskIdLow=Mask;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	CAN_FilterInit(&CAN_FilterInitStructure);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -/*=========================================================================
 | 
	
		
			
				|  |  | -函数名称: CAN_SetFilterExt
 | 
	
		
			
				|  |  | -功能描述: 设置扩展帧过滤器
 | 
	
		
			
				|  |  | -输入参数: 过滤器号码,过滤的ID和屏蔽器
 | 
	
		
			
				|  |  | -输出参数: 无
 | 
	
		
			
				|  |  | -作    者: 吴峰
 | 
	
		
			
				|  |  | -=========================================================================*/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -void CAN_SetFilterExt(u8 number,u16 ID,u16 Mask)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    CAN_FilterInitTypeDef  CAN_FilterInitStructure;
 | 
	
		
			
				|  |  | -    /* CAN 过滤器设置 */
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterNumber=number;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterIdHigh=ID;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=Mask;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	CAN_FilterInit(&CAN_FilterInitStructure);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -/*=========================================================================
 | 
	
		
			
				|  |  | -函数名称: CAN_SetFilterExt_Full(u8 number,u32 ID)
 | 
	
		
			
				|  |  | -功能描述: 设置扩展帧过滤器全滤波29位ID
 | 
	
		
			
				|  |  | -输入参数: 过滤器号码,过滤的
 | 
	
		
			
				|  |  | -输出参数: 无
 | 
	
		
			
				|  |  | -作    者: 吴峰
 | 
	
		
			
				|  |  | -=========================================================================*/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -void CAN_SetFilterExt_Full(u8 number,u32 ID)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    CAN_FilterInitTypeDef  CAN_FilterInitStructure;
 | 
	
		
			
				|  |  | -    /* CAN 过滤器设置 */
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterNumber=number;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterIdHigh=((ID<<3)&0xffff0000)>>16;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterIdLow=((ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0XFFFF;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x1fff;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xfff8;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
 | 
	
		
			
				|  |  | -	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	CAN_FilterInit(&CAN_FilterInitStructure);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/*=========================================================================
 | 
	
		
			
				|  |  | -函数名称: Cmd_Filter
 | 
	
		
			
				|  |  | -功能描述: 滤波器激活
 | 
	
		
			
				|  |  | -输入参数: 命令
 | 
	
		
			
				|  |  | -输出参数: 无
 | 
	
		
			
				|  |  | -作    者: 吴峰
 | 
	
		
			
				|  |  | -=========================================================================*/
 | 
	
		
			
				|  |  | -void Cmd_Filter(u8 Status_Filter0,u8 Status_Filter1)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -	if(Status_Filter0)
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -		CAN_SetFilterExt(0,ID_REQUEST,Mask_Ack_Request_Tbdt);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	else
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -		CAN_FilterInitTypeDef  CAN_FilterInitStructure;
 | 
	
		
			
				|  |  | -		CAN_FilterInitStructure.CAN_FilterNumber=0x00;
 | 
	
		
			
				|  |  | -		CAN_FilterInitStructure.CAN_FilterActivation=DISABLE;
 | 
	
		
			
				|  |  | -		CAN_FilterInit(&CAN_FilterInitStructure);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	if(Status_Filter1)
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -		CAN_FilterInitTypeDef  CAN_FilterInitStructure;
 | 
	
		
			
				|  |  | -		CAN_FilterInitStructure.CAN_FilterNumber=0x01;
 | 
	
		
			
				|  |  | -		CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
 | 
	
		
			
				|  |  | -		CAN_FilterInit(&CAN_FilterInitStructure);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	else
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -		CAN_FilterInitTypeDef  CAN_FilterInitStructure;
 | 
	
		
			
				|  |  | -		CAN_FilterInitStructure.CAN_FilterNumber=0x01;
 | 
	
		
			
				|  |  | -		CAN_FilterInitStructure.CAN_FilterActivation=DISABLE;
 | 
	
		
			
				|  |  | -		CAN_FilterInit(&CAN_FilterInitStructure);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/*=========================================================================
 | 
	
		
			
				|  |  | -函数名称: CAN_Configuration
 | 
	
		
			
				|  |  | -功能描述: 初始化CAN接口
 | 
	
		
			
				|  |  | -输入参数:
 | 
	
		
			
				|  |  | -输出参数: 无
 | 
	
		
			
				|  |  | -作    者: 吴峰
 | 
	
		
			
				|  |  | -=========================================================================*/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -void CAN_Configuration(void)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -	GPIO_InitTypeDef        GPIO_InitStructure;
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
 | 
	
		
			
				|  |  | -	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -//    CAN_DISABLE();	//在main函数开canbus
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	/* PD0-CAN RX */
 | 
	
		
			
				|  |  | -	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
 | 
	
		
			
				|  |  | -	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 | 
	
		
			
				|  |  | -	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 | 
	
		
			
				|  |  | -	GPIO_Init(GPIOA, &GPIO_InitStructure);
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	/*pd1-CAN TX */
 | 
	
		
			
				|  |  | -	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
 | 
	
		
			
				|  |  | -	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 | 
	
		
			
				|  |  | -	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 | 
	
		
			
				|  |  | -	GPIO_Init(GPIOA, &GPIO_InitStructure);
 | 
	
		
			
				|  |  | -	CAN_SetBps(BPS_250K);
 | 
	
		
			
				|  |  | -    CAN_SetFilterExt(0,ID_REQUEST,Mask_Ack_Request_Tbdt);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -/*=========================================================================
 | 
	
		
			
				|  |  | -函数名称: CAN_SendData
 | 
	
		
			
				|  |  | -功能描述: can发送
 | 
	
		
			
				|  |  | -输入参数: 发送消息,消息类型
 | 
	
		
			
				|  |  | -输出参数: 无
 | 
	
		
			
				|  |  | -作    者: 吴峰
 | 
	
		
			
				|  |  | -=========================================================================*/
 | 
	
		
			
				|  |  | -void CAN_SendData(CanTxMsg *pTxMessage,u8 OBDType)
 | 
	
		
			
				|  |  | -{    
 | 
	
		
			
				|  |  | -    if(OBDType == ID_OBD)
 | 
	
		
			
				|  |  | -	    pTxMessage->IDE=CAN_ID_STD;//标准帧
 | 
	
		
			
				|  |  | -	else
 | 
	
		
			
				|  |  | -	    pTxMessage->IDE=CAN_ID_EXT;//扩展帧
 | 
	
		
			
				|  |  | -	pTxMessage->RTR=CAN_RTR_DATA;
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	CAN_Transmit(CAN1,pTxMessage);
 | 
	
		
			
				|  |  | -	while(CAN_TransmitStatus(CAN1,CAN_FIFO0)<1);            //如果传送失败就在这里等,一直重传直到传送成功
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -/*=========================================================================
 | 
	
		
			
				|  |  | -函数名称: CAN_ReceData
 | 
	
		
			
				|  |  | -功能描述: can 接收
 | 
	
		
			
				|  |  | -输入参数: 消息存储结构,定时时间
 | 
	
		
			
				|  |  | -输出参数: 接收成功与否
 | 
	
		
			
				|  |  | -作    者: 吴峰
 | 
	
		
			
				|  |  | -=========================================================================*/
 | 
	
		
			
				|  |  | -u8  CAN_ReceData(CanRxMsg *pRxMessage,u16 TimeOut)
 | 
	
		
			
				|  |  | -{    
 | 
	
		
			
				|  |  | -	ReConfig_Tim2(TimeOut);                                       //初始化接收时间,就是指本次循环接收的时间,时间到没有接收退出    
 | 
	
		
			
				|  |  | -	while(1)
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -	    if(CAN_MessagePending(CAN1,CAN_FIFO0))		              //查询是否有挂号的消息接收进来
 | 
	
		
			
				|  |  | -	    {
 | 
	
		
			
				|  |  | -        	CAN_Receive(CAN1,CAN_FIFO0,pRxMessage);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        	return SUCCESS;
 | 
	
		
			
				|  |  | -	    }
 | 
	
		
			
				|  |  | -	    if(TIM_GetFlagStatus(TIM2, TIM_IT_Update) == SET)		  //定时时间到退出
 | 
	
		
			
				|  |  | -	    {
 | 
	
		
			
				|  |  | -	        TIM_ClearITPendingBit(TIM2,TIM_IT_Update); 
 | 
	
		
			
				|  |  | -            TIM_Cmd(TIM2, DISABLE);
 | 
	
		
			
				|  |  | -			return ERROR;
 | 
	
		
			
				|  |  | -		}	
 | 
	
		
			
				|  |  | -	}	
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#if 0
 | 
	
		
			
				|  |  | -//支持多帧发送,每帧固定8个字节
 | 
	
		
			
				|  |  | -//pSendBuf全为发送数据,数据第一字节为长度,长度大于7则发送多帧
 | 
	
		
			
				|  |  | -u8 CAN_SendRece_F(const u8 *pSendBuf,u8 OBDType)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -//    u8 *pTemp = CommunicateData;
 | 
	
		
			
				|  |  | -    u8 leng = 0;
 | 
	
		
			
				|  |  | -    u8 i;
 | 
	
		
			
				|  |  | -    u8 ReceNum  = 0;//ECU一次可以接收的帧数
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    CanTxMsg TxMessage;
 | 
	
		
			
				|  |  | -    CanRxMsg RxMessage;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    ClearBuf();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Send_Lable:     
 | 
	
		
			
				|  |  | -    leng  = pSendBuf[0]; 
 | 
	
		
			
				|  |  | -    memset(&TxMessage,0,sizeof(CanTxMsg));
 | 
	
		
			
				|  |  | -//    TxMessage.StdId = g_StdId;
 | 
	
		
			
				|  |  | -//    TxMessage.ExtId = g_ExtId;
 | 
	
		
			
				|  |  | -    TxMessage.DLC   = 8;//每帧固定8个字节
 | 
	
		
			
				|  |  | -    if(leng > 7)//多帧发送
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        for(i=0;i<leng/7;i++)
 | 
	
		
			
				|  |  | -        {                
 | 
	
		
			
				|  |  | -            if(i==0)TxMessage.Data[0] = 0x10;
 | 
	
		
			
				|  |  | -            else    TxMessage.Data[0] = 0x20 | i;
 | 
	
		
			
				|  |  | -        	memcpy(TxMessage.Data+1,pSendBuf,7);  
 | 
	
		
			
				|  |  | -        	pSendBuf += 7;    
 | 
	
		
			
				|  |  | -        	CAN_SendData(&TxMessage,OBDType);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if((ReceNum==0) || ((i+1)%ReceNum == 0))    
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -            	if(CAN_ReceData(&RxMessage,200))
 | 
	
		
			
				|  |  | -            	{
 | 
	
		
			
				|  |  | -            	    ReceNum = RxMessage.Data[1];            	    
 | 
	
		
			
				|  |  | -            	}    
 | 
	
		
			
				|  |  | -            	else 
 | 
	
		
			
				|  |  | -            	{
 | 
	
		
			
				|  |  | -            	    return ERROR;
 | 
	
		
			
				|  |  | -            	}    
 | 
	
		
			
				|  |  | -            }	         	
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        TxMessage.Data[0] = 0x20 | i;
 | 
	
		
			
				|  |  | -        memset(TxMessage.Data,0,sizeof(TxMessage.Data));
 | 
	
		
			
				|  |  | -    	memcpy(TxMessage.Data+1,pSendBuf,leng%7);  
 | 
	
		
			
				|  |  | -    	CAN_SendData(&TxMessage,OBDType);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    else//单帧发送
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        memcpy(TxMessage.Data,pSendBuf,leng+1); 
 | 
	
		
			
				|  |  | -        CAN_SendData(&TxMessage,OBDType);
 | 
	
		
			
				|  |  | -    }   
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -Rece_Lable:
 | 
	
		
			
				|  |  | -	if(ERROR == CAN_ReceData(&RxMessage,200)) 
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -		return ERROR;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	if(RxMessage.Data[1] == 0x7F)
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -	    if(RxMessage.Data[3] == 0x21)//重发
 | 
	
		
			
				|  |  | -    	{
 | 
	
		
			
				|  |  | -    	    DelayXms(50);
 | 
	
		
			
				|  |  | -            goto Send_Lable;
 | 
	
		
			
				|  |  | -    	}
 | 
	
		
			
				|  |  | -	    if(RxMessage.Data[3] == 0x78)//重新接收
 | 
	
		
			
				|  |  | -    	{
 | 
	
		
			
				|  |  | -    	    DelayXms(50);
 | 
	
		
			
				|  |  | -            goto Rece_Lable;
 | 
	
		
			
				|  |  | -    	}
 | 
	
		
			
				|  |  | -    	else
 | 
	
		
			
				|  |  | -    	{   
 | 
	
		
			
				|  |  | -    	    return ERROR;
 | 
	
		
			
				|  |  | -    	}
 | 
	
		
			
				|  |  | -    }	
 | 
	
		
			
				|  |  | -	else if(RxMessage.Data[0]==0x10)//多帧处理
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -	    leng = RxMessage.Data[1];
 | 
	
		
			
				|  |  | -	    memcpy(pTemp,RxMessage.Data+1,7);
 | 
	
		
			
				|  |  | -	    pTemp += 7;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        memset(&TxMessage,0,sizeof(CanTxMsg));
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | -        if(g_StdId == 0x07DF)TxMessage.StdId = 0x7E0;//标准OBD协议   
 | 
	
		
			
				|  |  | -        else TxMessage.StdId = g_StdId;
 | 
	
		
			
				|  |  | -        if(g_ExtId == 0x18DB33F1)TxMessage.ExtId = 0x18DA10F1;//标准OBD协议
 | 
	
		
			
				|  |  | -        else TxMessage.ExtId = g_ExtId;
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | -        TxMessage.DLC = 8;        
 | 
	
		
			
				|  |  | -        TxMessage.Data[0] = 0x30;	    
 | 
	
		
			
				|  |  | -	    CAN_SendData(&TxMessage,OBDType);
 | 
	
		
			
				|  |  | -	    
 | 
	
		
			
				|  |  | -        for(i=0;i<leng/7;i++)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            if(ERROR == CAN_ReceData(&RxMessage,200))
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -            }    
 | 
	
		
			
				|  |  | -            else
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -            	memcpy(pTemp,RxMessage.Data+1,7);  
 | 
	
		
			
				|  |  | -            	pTemp += 7;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    else//正常接收一帧数据
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        memcpy(pTemp,RxMessage.Data,8);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return SUCCESS;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -//不支持多帧发送,每帧长度由pSendBuf[0]决定
 | 
	
		
			
				|  |  | -//每帧字节不一定8个字节
 | 
	
		
			
				|  |  | -u8 CAN_SendRece_V(const u8 *pSendBuf,u8 OBDType)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -//    u8 *pTemp = CommunicateData;
 | 
	
		
			
				|  |  | -    u8 leng = pSendBuf[0];
 | 
	
		
			
				|  |  | -    u8 i;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    CanTxMsg TxMessage;
 | 
	
		
			
				|  |  | -    CanRxMsg RxMessage;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    ClearBuf();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Send_Lable: 
 | 
	
		
			
				|  |  | -    leng = pSendBuf[0];    
 | 
	
		
			
				|  |  | -    if(leng>8)leng = 8;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    memset(&TxMessage,0,sizeof(CanTxMsg));
 | 
	
		
			
				|  |  | -//    TxMessage.StdId = g_StdId;
 | 
	
		
			
				|  |  | -//    TxMessage.ExtId = g_ExtId;   
 | 
	
		
			
				|  |  | -    TxMessage.DLC   = leng;
 | 
	
		
			
				|  |  | -	memcpy(TxMessage.Data,pSendBuf+1,leng);
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | -    CAN_SendData(&TxMessage,OBDType);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Rece_Lable:
 | 
	
		
			
				|  |  | -	if(ERROR == CAN_ReceData(&RxMessage,200)) 
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -		return ERROR;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	if(RxMessage.Data[1] == 0x7F)
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -	    if(RxMessage.Data[3] == 0x21)//重发
 | 
	
		
			
				|  |  | -    	{
 | 
	
		
			
				|  |  | -    	    DelayXms(50);
 | 
	
		
			
				|  |  | -            goto Send_Lable;
 | 
	
		
			
				|  |  | -    	}
 | 
	
		
			
				|  |  | -	    if(RxMessage.Data[3] == 0x78)//重新接收
 | 
	
		
			
				|  |  | -    	{
 | 
	
		
			
				|  |  | -    	    DelayXms(50);
 | 
	
		
			
				|  |  | -            goto Rece_Lable;
 | 
	
		
			
				|  |  | -    	}
 | 
	
		
			
				|  |  | -    	else
 | 
	
		
			
				|  |  | -    	{   
 | 
	
		
			
				|  |  | -    	    return ERROR;
 | 
	
		
			
				|  |  | -    	}
 | 
	
		
			
				|  |  | -    }	
 | 
	
		
			
				|  |  | -	else if(RxMessage.Data[0]==0x10)//多帧处理
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -	    leng = RxMessage.Data[1];
 | 
	
		
			
				|  |  | -	    memcpy(pTemp,RxMessage.Data+1,7);
 | 
	
		
			
				|  |  | -	    pTemp += 7;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        memset(&TxMessage,0,sizeof(CanTxMsg));
 | 
	
		
			
				|  |  | -        if(g_StdId == 0x07DF)TxMessage.StdId = 0x7E0;//标准OBD协议   
 | 
	
		
			
				|  |  | -        else TxMessage.StdId = g_StdId;
 | 
	
		
			
				|  |  | -        if(g_ExtId == 0x18DB33F1)TxMessage.ExtId = 0x18DA10F1;//标准OBD协议
 | 
	
		
			
				|  |  | -        else TxMessage.ExtId = g_ExtId;
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | -        TxMessage.DLC = 8;        
 | 
	
		
			
				|  |  | -        TxMessage.Data[0] = 0x30;	    
 | 
	
		
			
				|  |  | -	    CAN_SendData(&TxMessage,OBDType);
 | 
	
		
			
				|  |  | -	    
 | 
	
		
			
				|  |  | -        for(i=0;i<leng/7;i++)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            if(ERROR == CAN_ReceData(&RxMessage,200))
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -            }    
 | 
	
		
			
				|  |  | -            else
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -            	memcpy(pTemp,RxMessage.Data+1,7);  
 | 
	
		
			
				|  |  | -            	pTemp += 7;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    else//正常接收一帧数据
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        memcpy(pTemp,RxMessage.Data,8);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return SUCCESS;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -
 |