⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 j1939_al.c

📁 基于ucosSAEj1939的汽车组合仪表,硬件是MC9S12H128
💻 C
字号:

/**************************************************************************************
*                                                                                       
*                      北京航空航大学 706教研室                         
*                   All rights reserved.       2005                                                 
*                                                                                       
*======================================================================================
*                                                                                       
*       文件名:         J1939_AL.c                                                        
*       大纲:           J1939协议栈                  
*       文件标识:                                                                       
*       摘 要:                                                                                                                                                              
*                                                                                      
*======================================================================================
*                                                                                      
*       描述:           应用层文档                                                                                      
*                                                                                      
*       控制器:         Freescale MC9s12H256                                         
*                                                                                      
*       编译器:         Metrowerks CodeWarrior IDE v5.2.1149                            
*                                                                                      
*======================================================================================
*                                                                                      
*       当前版本:   1.0.0                                                                   
*       编程人员:   孙进                                                                 
*       完成日期:   2006年2月                                                                                                                                                                                                   
*                                                                                       
*======================================================================================                                                                          
*
*       更新历史记录:                                                                   
*                                                                                      
***************************************************************************************/

#include "J1939_includes.h"
#include "\Ucos\includes.h"
#include <MC9S12H256.h>
#include "..\user.h"

extern void *EngSpeed_ptr;
extern void *VehSpeed_ptr;
extern void *WatTemp_ptr;
extern void *OilPres_ptr;
extern void *VehDistance_ptr;
#if MUTIPLE_PACKAGE_TRANSPORT
extern void *FaultCode_ptr;
#endif

extern OS_EVENT *EngSpeed_MBox;
extern OS_EVENT *VehSpeed_MBox;
extern OS_EVENT *WatTemp_MBox;
extern OS_EVENT *OilPres_MBox;
extern OS_EVENT *VehDistance_MBox;
#if MUTIPLE_PACKAGE_TRANSPORT
extern OS_EVENT *FaultCode_MBox;                               
#endif

//演示系统用
//extern void *TestEngSpeed_ptr;										               //转速指针
//extern void *TestVehSpeed_ptr;                                   //车速指针                                   
//extern void *TestWatTemp_ptr;										                 //水温指针 
//extern void *TestOilPres_ptr;                                    //油压指针

extern void *GeneralSignal_ptr;																		 //指示灯消息指针
extern void *EmergSignal_ptr; 
/*
extern void *TestSignal_ptr[QueueSize];                          //指示灯消息数组指针
extern void *TestSignal1_ptr;																		 //指示灯1消息指针
extern void *TestSignal2_ptr;																		 //指示灯2消息指针
extern void *TestSignal3_ptr;																		 //指示灯3消息指针
extern void *TestSignal4_ptr;																		 //指示灯4消息指针
extern void *TestSignal5_ptr;																		 //指示灯5消息指针
extern void *TestSignal6_ptr;																		 //指示灯6消息指针
extern void *TestSignal7_ptr;																		 //指示灯7消息指针
extern void *TestSignal8_ptr;																		 //指示灯8消息指针
extern void *TestSignal9_ptr;																		 //指示灯9消息指针
extern void *TestSignal10_ptr;																		 //指示灯10消息指针
extern void *TestSignal11_ptr;																		 //指示灯11消息指针
extern void *TestSignal12_ptr;																		 //指示灯12消息指针
*/
//extern OS_EVENT *TestEngSpeed_MBox;                               //转速消息邮箱
//extern OS_EVENT *TestVehSpeed_MBox;                               //车速消息邮箱
//extern OS_EVENT *TestWatTemp_MBox; 							                 //水温消息邮箱
//extern OS_EVENT *TestOilPres_MBox;                                //油压消息邮箱
extern OS_EVENT *GeneralSignal_MBox;                                      //指示灯消息邮箱
extern OS_EVENT *EmergSignal_MBox;
extern OS_EVENT *EmergFlg_Sem;

//PGN过滤表
const PGN_T _pgn_table[PGN_NUM] =
{     
    61443,//	F003	发动机负荷(当前速度下的负载百分比)
    61444,//	F004	发动机转速 ,发动机扭矩
    65226,//	FECA	DM1当前诊断故障代码
    65248,//	FEE0	车辆里程
    65257,// 	FEE9	燃料消耗量 / 每百公里油耗
    65262,//	FEEE	发动机冷却液温度,燃油温度,机油温度
    65263,//	FEEF	机油压力
    65265,//	FEF1	车辆速度(巡航控制速度)
    65266,//	FEF0	燃油消耗率
    65271,//	FEF7	电池电压
};


VEH_DISTANCE_T VehDistance; //里程
FAULT_CODE_T FaultCode;		  //故障码

U16 VehSpeed;               //车速
U16 EngSpeed;				        //转速
U08 WatTemp;				        //水温
U08 OilPres;				        //油压
//演示系统用
U16 GeneralSignal;
U16 EmergSignal;
/*
U08 Signal1;
U08 Signal2;
U08 Signal3;
U08 Signal4;
U08 Signal5;
U08 Signal6;
U08 Signal7;
U08 Signal8;
U08 Signal9;
U08 Signal10;
U08 Signal11;
U08 Signal12;
*/
//extern INT8U SignalNum;				        //分辨哪个指示灯亮/灭
 
//========================================================================================
//Application Interface Functions
//========================================================================================
/****************************************************************************************
@函数名称           : void Rev_J1939msg(J1939_RX_MESSAGE_T *msg_ptr)          
@参数               : None 
@返回值             : J1939_RX_MESSAGE_T *msg_ptr
@描述               : 报文处理函数,根据实际需要编写
@作者               : 孙进
@最后编辑时间       : 2005-11-23
@版本               : V1.0.0
*****************************************************************************************/
void Rev_J1939msg(J1939_RX_MESSAGE_T *msg_ptr)
{
    U08 i; 
    
    switch (msg_ptr->PGN)
    { 
      case 61444:	 //发动机转速 / 发动机扭矩		                
	    {
	      //发动机转速
		    EngSpeed = msg_ptr->data[4];
		    EngSpeed = (EngSpeed<<8) + msg_ptr->data[3];
		    EngSpeed_ptr = &EngSpeed;
		    OSMboxPost(EngSpeed_MBox,EngSpeed_ptr);
		    
		    //发动机扭矩 
	    }
	    break;
	    
	    case 65248:	 //车辆里程
	    {
	      //相对里程
		    VehDistance.trip_data = msg_ptr->data[3];
		    VehDistance.trip_data = (VehDistance.trip_data<<8) + msg_ptr->data[2];
		    VehDistance.trip_data = (VehDistance.trip_data<<8) + msg_ptr->data[1];
		    VehDistance.trip_data = (VehDistance.trip_data<<8) + msg_ptr->data[0];
		    
		    //总里程
		    VehDistance.total_data = msg_ptr->data[7];
		    VehDistance.total_data = (VehDistance.total_data<<8) + msg_ptr->data[6];
		    VehDistance.total_data = (VehDistance.total_data<<8) + msg_ptr->data[5];
		    VehDistance.total_data = (VehDistance.total_data<<8) + msg_ptr->data[4];
		    
		    VehDistance_ptr = &VehDistance;
		    OSMboxPost(VehDistance_MBox,VehDistance_ptr);
	    }
  	  break;
  	 

	    case 65262:		//发动机冷却液温度,燃油温度,机油温度
	    {
	      //发动机冷却液温度	
		    WatTemp = msg_ptr->data[0];
		    WatTemp_ptr = &WatTemp;
		    OSMboxPost(WatTemp_MBox,WatTemp_ptr);
		    
		    //燃油温度
		    //机油温度
	    }
	    break;
	
	    case 65263:		//机油压力
	    {
		    OilPres = msg_ptr->data[3];
		    OilPres_ptr = &OilPres;
		    OSMboxPost(OilPres_MBox,OilPres_ptr);
	    }	
	    break;

	    case 65265:		//车辆速度
	    {
		    VehSpeed = msg_ptr->data[2];
		    VehSpeed = (VehSpeed<<8) + msg_ptr->data[1];
		    VehSpeed_ptr = &VehSpeed;
		    OSMboxPost(VehSpeed_MBox,VehSpeed_ptr);
	    }
	    break;	
	    
	    #if MUTIPLE_PACKAGE_TRANSPORT
      case 65226: 	 //DM1当前诊断故障代码
      {
          FaultCode.count = (U08)((msg_ptr->byte_count - 2) / 4);
   
          if (FaultCode.count>J1939_FAULT_NUM)
            {
                for(i=0;i<J1939_FAULT_NUM;i++) 
                {
                    FaultCode.fault_code[i].spn = msg_ptr->data[4+i*4];
                    FaultCode.fault_code[i].spn = (FaultCode.fault_code[i].spn & 0xE0) << 3;
                    FaultCode.fault_code[i].spn += msg_ptr->data[3+i*4];
                    FaultCode.fault_code[i].spn = (FaultCode.fault_code[i].spn << 8) + msg_ptr->data[2+i*4];
                    FaultCode.fault_code[i].fmi = msg_ptr->data[4+i*4] & 0x1F;
                    FaultCode.fault_code[i].oc = msg_ptr->data[5+i*4] & 0xEF;                       
                }
            } 
            else 
            {
                for(i=0;i<FaultCode.count;i++) 
                {
                    FaultCode.fault_code[i].spn = msg_ptr->data[4+i*4];
                    FaultCode.fault_code[i].spn = (FaultCode.fault_code[i].spn & 0xE0) << 3;
                    FaultCode.fault_code[i].spn += msg_ptr->data[3+i*4];
                    FaultCode.fault_code[i].spn = (FaultCode.fault_code[i].spn << 8) + msg_ptr->data[2+i*4];
                    FaultCode.fault_code[i].fmi = msg_ptr->data[4+i*4] & 0x1F;
                    FaultCode.fault_code[i].oc = msg_ptr->data[5+i*4] & 0xEF;                       
                }
            }
            FaultCode_ptr = &FaultCode;
            OSMboxPost(FaultCode_MBox,FaultCode_ptr);	            
      }
      break;
      #endif
      
      case 61443:  //发动机负荷
      {
      }
      break;
      
      case 65257:  //燃料消耗量 / 每百公里油耗
      {
      }
      break;
      
      case 65266:  //燃油消耗率
      {
      }
      break;
      
      case 65271:  //电池电压
      {
      }
      break;
      
      //演示系统用 
/*
      case TESTENGSPEED_PGN:	 //测试发动机转速		                
	    {
	      //发动机转速
		    EngSpeed = msg_ptr->data[4];
		    EngSpeed = (EngSpeed<<8) + msg_ptr->data[3];
		    TestEngSpeed_ptr = &EngSpeed;
		    OSMboxPost(TestEngSpeed_MBox,TestEngSpeed_ptr);
		    
		    //发动机扭矩 
	    }
	    break;
	    
	    case TESTVEHSPEED_PGN:		//车辆速度
	    {
		    VehSpeed = msg_ptr->data[2];
		    VehSpeed = (VehSpeed<<8) + msg_ptr->data[1];
		    TestVehSpeed_ptr = &VehSpeed;
		    OSMboxPost(TestVehSpeed_MBox,TestVehSpeed_ptr);
	    }
	    break;	
	      
      case TESTOILPRES_PGN:		//机油压力
	    {
		    OilPres = msg_ptr->data[3];
		    TestOilPres_ptr = &OilPres;
		    OSMboxPost(TestOilPres_MBox,TestOilPres_ptr);
	    }	
	    break;
	    
	    case TESTWATTEMP_PGN:		//发动机冷却液温度,燃油温度,机油温度
	    {
	      //发动机冷却液温度	
		    WatTemp = msg_ptr->data[0];
		    TestWatTemp_ptr = &WatTemp;
		    OSMboxPost(TestWatTemp_MBox,TestWatTemp_ptr);
		    
		    //燃油温度
		    //机油温度
	    }
	    break;
*/	    
	    case GENERAL_SIGNAL_PGN: 
	    {
	      GeneralSignal = msg_ptr->data[1];
	      GeneralSignal = (GeneralSignal<<8) + msg_ptr->data[0];
	      GeneralSignal_ptr = &GeneralSignal;
	      OSMboxPost(GeneralSignal_MBox,GeneralSignal_ptr);
	    }
	    break;
	    
	    case EMERG_SIGNAL_PGN: 
	    {
	      EmergSignal = msg_ptr->data[1];
	      EmergSignal = (EmergSignal<<8) + msg_ptr->data[0];
	      EmergSignal_ptr = &EmergSignal;
	      OSMboxPost(EmergSignal_MBox,EmergSignal_ptr);
	      OSSemPost(EmergFlg_Sem);
	    }
	    break;

      default:
      break; 
    }
}  

/****************************************************************************************
@函数名称           : void AL_init(void)         
@参数               : None 
@返回值             : None
@描述               : 初始化函数
@作者               : 孙进
@最后编辑时间       : 2005-11-23
@版本               : V1.0.0
*****************************************************************************************/
void AL_init(void)
{
    U08 i;
    
    VehSpeed = 0;
    EngSpeed = 0;
    WatTemp = 0;
    OilPres = 0;

    FaultCode.count = 0;
    for(i=0;i<J1939_FAULT_NUM;i++) 
    {
        FaultCode.fault_code[i].spn = 0;
        FaultCode.fault_code[i].fmi = 0;
        FaultCode.fault_code[i].oc = 0;    
    }
}

/****************************************************************************************
@函数名称           : U08 PGN_filter(PGN_T pgn);         
@参数               : PGN_T pgn 需要查表的PGN
@返回值             : 返回1查找成功,返回0无此PGN
@描述               : //报文滤波函数    
@作者               : 孙进
@最后编辑时间       : 2005-11-23
@版本               : V1.0.0
*****************************************************************************************/
U08 PGN_filter(PGN_T pgn) 
{
    U08 left = 0; 
    U08 right = PGN_NUM - 1;
    U08 middle = 0;

    while(left<=right) 
    { 
        middle = (U08)((left + right) >> 1); 
        if(pgn==_pgn_table[middle])
        { 
            return TRUE; 
        }
        
        if(pgn>_pgn_table[middle]) 
        {
            left = middle + 1;
        } 
        else
        { 
            right = middle - 1;
        }
    } 
    return FALSE;
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -