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

📄 canapp.c

📁 以LPC2194为平台开发的整车ECU控制器程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			if((0 == CANRcvBufApp.FullFlag1))
			{
				CANRcvBufApp.RcvBuf[CAN1][CANRcvBufApp.WritePoint1] = RxBUF(CAN1);
				if(++CANRcvBufApp.WritePoint1 >= USE_CAN_RCV_BUF_SIZE)
				{
					CANRcvBufApp.WritePoint1=0;
				}
				if(CANRcvBufApp.WritePoint1 == CANRcvBufApp.ReadPoint1)
				{
					CANRcvBufApp.FullFlag1 =1;
				}				
			}
			break;
		case	CAN2:
			if((0 == CANRcvBufApp.FullFlag2))
			{
				CANRcvBufApp.RcvBuf[CAN2][CANRcvBufApp.WritePoint2] = RxBUF(CAN2);
				if(++CANRcvBufApp.WritePoint2 >= USE_CAN_RCV_BUF_SIZE)
				{
					CANRcvBufApp.WritePoint2=0;
				}
				if(CANRcvBufApp.WritePoint2 == CANRcvBufApp.ReadPoint2)
				{
					CANRcvBufApp.FullFlag2 =1;
				}
			}
			break;

		default:
			break;
	}
	RelCanRecBuf(CanNum);
}
//应用常量定义
//使用工作模式
const 	UINT32	USE_MOD_CAN[4] = 
{
	USE_MODE_CAN1,
	USE_MODE_CAN2,
	USE_MODE_CAN3,
	USE_MODE_CAN4
};

//使用波特率
const 	UINT32	USE_BTR_CAN[4] = 
{
	USE_BTR_CAN1,
	USE_BTR_CAN2,
	USE_BTR_CAN3,
	USE_BTR_CAN4
};
//使用发送缓冲区发送优先级模式选择
const 	UINT32	USE_TPM_CAN[4] = 
{
	USE_TPM_CAN1,
	USE_TPM_CAN2,
	USE_BTR_CAN3,
	USE_BTR_CAN4
};
//应用中断
const 	UINT32	USE_INT_CAN[4] = 
{
	USE_INT_CAN1,
	USE_INT_CAN2,
	USE_INT_CAN3,
	USE_INT_CAN4
};
//应用报警限制
const	UINT32	USE_EWL_CAN[4] = 
{
	USE_EWL_CAN1,
	USE_EWL_CAN2,
	USE_EWL_CAN3,
	USE_EWL_CAN4
};

//用来对AD数值的发送
/*UINT32 CANSendData_mainECU(eCANNUM CanNum,UINT32L pgn ,UINT32L data,UINT32L data1)
{
	   stcTxBUF SendData;
	   SendData.TxFrameInfo.Bits.RTR_BIT = 0;		//设为发送数据帧
       SendData.TxFrameInfo.Bits.FF_BIT = 1;		//设为扩展帧
	   pgn=65331;
	   SendData.TxCANID.FrameFm.stcETXFRFM.SA=0x03; //源地址
       SendData.TxCANID.FrameFm.stcETXFRFM.PS=51;   //特定PDU域PS
       SendData.TxCANID.FrameFm.stcETXFRFM.PF=255;  //PDU格式PF
       SendData.TxCANID.FrameFm.stcETXFRFM.DP=0;    //数据页
       SendData.TxCANID.FrameFm.stcETXFRFM.R =0;    //保留位
       SendData.TxCANID.FrameFm.stcETXFRFM.P =6;    //优先级
       SendData.TxFrameInfo.Bits.DLC_BIT=8;  
       //==============水温===============
       SendData.CANTDA.Bits.Data1_BIT=(char)(data & 0x000000FF);
       SendData.CANTDA.Bits.Data2_BIT=(char)((data & 0x0000FF00) >> 8);
       //==============真空压力==============
       SendData.CANTDA.Bits.Data3_BIT=(char)(data1 & 0x000000FF);
       SendData.CANTDA.Bits.Data4_BIT=(char)((data1 & 0x0000FF00) >> 8);
       //========================
       SendData.CANTDB.Bits.Data1_BIT=0xFF;
       SendData.CANTDB.Bits.Data2_BIT=0xFF;
       SendData.CANTDB.Bits.Data3_BIT=0xFF;
       SendData.CANTDB.Bits.Data4_BIT=0xFF;
	   return CANSendData(CanNum, 0, &SendData);
}*/

/****************************************************************************************
**函数名:UINT32 CANSendData_29bit(eCANNUM CanNum,UINT32L Pgn ,UINT32L data,UINT32L data1)
**输入:CANSendData(CanNum, 0, &SendData)函数
**返回:
**说明:用于29位ID的数据的发送
******************************************************************************************/
UINT32 CANSendData_29bit(eCANNUM CanNum,UINT32L Pgn ,UINT32L data,UINT32L data1)
{
  stcTxBUF SendData;
  SendData.TxFrameInfo.Bits.RTR_BIT = 0;		//设为发送数据帧
  SendData.TxFrameInfo.Bits.FF_BIT = 1;		//设为扩展帧
   switch(Pgn)
   {
     case  65522:  //主控模块报警报文
       SendData.TxCANID.FrameFm.stcETXFRFM.SA=0x03; //源地址
       SendData.TxCANID.FrameFm.stcETXFRFM.PS=242;  //特定PDU域PS
       SendData.TxCANID.FrameFm.stcETXFRFM.PF=255;  //PDU格式PF
       SendData.TxCANID.FrameFm.stcETXFRFM.DP=0;    //数据页
       SendData.TxCANID.FrameFm.stcETXFRFM.R =0;    //保留位
       SendData.TxCANID.FrameFm.stcETXFRFM.P =2;    //优先级
       SendData.TxFrameInfo.Bits.DLC_BIT=8;
       SendData.CANTDA.Bits.Data1_BIT=infoalarm_1.Word;
       SendData.CANTDA.Bits.Data2_BIT=infoalarm_2.Word;
       SendData.CANTDA.Bits.Data3_BIT=infoalarm_3.Word;
       SendData.CANTDA.Bits.Data4_BIT=0xFF;
       SendData.CANTDB.Bits.Data1_BIT=0xFF;
       SendData.CANTDB.Bits.Data2_BIT=0xFF;
       SendData.CANTDB.Bits.Data3_BIT=0xFF; 
       can_buf[0]=SendData.CANTDA.Bits.Data1_BIT;
       can_buf[1]=SendData.CANTDA.Bits.Data2_BIT;
       can_buf[2]=SendData.CANTDA.Bits.Data3_BIT;
       can_buf[3]=SendData.CANTDA.Bits.Data4_BIT;
       can_buf[4]=SendData.CANTDB.Bits.Data1_BIT;
       can_buf[5]=SendData.CANTDB.Bits.Data2_BIT;
       can_buf[6]=SendData.CANTDB.Bits.Data3_BIT;
       can_xiaoyan(can_buf);
       SendData.CANTDB.Bits.Data4_BIT=can_buf[7]; 
     break;
     case  65490:  //主控模块状态报文
       SendData.TxCANID.FrameFm.stcETXFRFM.SA=0x03; //源地址
       SendData.TxCANID.FrameFm.stcETXFRFM.PS=210;  //特定PDU域PS
       SendData.TxCANID.FrameFm.stcETXFRFM.PF=255;  //PDU格式PF
       SendData.TxCANID.FrameFm.stcETXFRFM.DP=0;    //数据页
       SendData.TxCANID.FrameFm.stcETXFRFM.R =0;    //保留位
       SendData.TxCANID.FrameFm.stcETXFRFM.P =3;    //优先级
       SendData.TxFrameInfo.Bits.DLC_BIT=8;
       //================状态报文====================
       SendData.CANTDA.Bits.Data1_BIT=comstate_1.Word;
       SendData.CANTDA.Bits.Data2_BIT=comstate_2.Word;
       SendData.CANTDA.Bits.Data3_BIT=0xFF;
       SendData.CANTDA.Bits.Data4_BIT=0xFF;
       SendData.CANTDB.Bits.Data1_BIT=0xFF;
       SendData.CANTDB.Bits.Data2_BIT=0xFF;
       SendData.CANTDB.Bits.Data3_BIT=0xFF; 
       can_buf[0]=SendData.CANTDA.Bits.Data1_BIT;
       can_buf[1]=SendData.CANTDA.Bits.Data2_BIT;
       can_buf[2]=SendData.CANTDA.Bits.Data3_BIT;
       can_buf[3]=SendData.CANTDA.Bits.Data4_BIT;
       can_buf[4]=SendData.CANTDB.Bits.Data1_BIT;
       can_buf[5]=SendData.CANTDB.Bits.Data2_BIT;
       can_buf[6]=SendData.CANTDB.Bits.Data3_BIT;
       can_xiaoyan(can_buf);
       SendData.CANTDB.Bits.Data4_BIT=can_buf[7];
     break;
     case  65328:
       SendData.TxCANID.FrameFm.stcETXFRFM.SA=0x03; //源地址
       SendData.TxCANID.FrameFm.stcETXFRFM.PS=48;   //特定PDU域PS
       SendData.TxCANID.FrameFm.stcETXFRFM.PF=255;  //PDU格式PF
       SendData.TxCANID.FrameFm.stcETXFRFM.DP=0;    //数据页
       SendData.TxCANID.FrameFm.stcETXFRFM.R =0;    //保留位
       SendData.TxCANID.FrameFm.stcETXFRFM.P =6;    //优先级
       SendData.TxFrameInfo.Bits.DLC_BIT=8;
       //================车速=============================
       SendData.CANTDA.Bits.Data1_BIT=(char)(data & 0x000000FF);
       SendData.CANTDA.Bits.Data2_BIT=0x00;
       //================总累积里程=======================
       SendData.CANTDA.Bits.Data3_BIT=(char)(data1 & 0x000000FF);
       SendData.CANTDA.Bits.Data4_BIT=(char)((data1 & 0x0000FF00) >> 8);
       SendData.CANTDB.Bits.Data1_BIT=(char)((data1 & 0x00FF0000) >> 16);
       //================保留=============================
       SendData.CANTDB.Bits.Data2_BIT=0xFF;
       SendData.CANTDB.Bits.Data3_BIT=0xFF; 
       can_buf[0]=SendData.CANTDA.Bits.Data1_BIT;
       can_buf[1]=SendData.CANTDA.Bits.Data2_BIT;
       can_buf[2]=SendData.CANTDA.Bits.Data3_BIT;
       can_buf[3]=SendData.CANTDA.Bits.Data4_BIT;
       can_buf[4]=SendData.CANTDB.Bits.Data1_BIT;
       can_buf[5]=SendData.CANTDB.Bits.Data2_BIT;
       can_buf[6]=SendData.CANTDB.Bits.Data3_BIT;
       can_xiaoyan(can_buf);
       SendData.CANTDB.Bits.Data4_BIT=can_buf[7]; 
     break;
    case 65329:
       SendData.TxCANID.FrameFm.stcETXFRFM.SA=0x03; //源地址
       SendData.TxCANID.FrameFm.stcETXFRFM.PS=49;   //特定PDU域PS
       SendData.TxCANID.FrameFm.stcETXFRFM.PF=255;  //PDU格式PF
       SendData.TxCANID.FrameFm.stcETXFRFM.DP=0;    //数据页
       SendData.TxCANID.FrameFm.stcETXFRFM.R =0;    //保留位
       SendData.TxCANID.FrameFm.stcETXFRFM.P =6;    //优先级
       SendData.TxFrameInfo.Bits.DLC_BIT=8;
       //================VIN=============================
       SendData.CANTDA.Bits.Data1_BIT=(char) (data&0x000000FF);
       SendData.CANTDA.Bits.Data2_BIT=(char)((data&0x0000FF00)>>8);
       SendData.CANTDA.Bits.Data3_BIT=(char)((data&0x00FF0000)>>16);
       SendData.CANTDA.Bits.Data4_BIT=(char)((data&0xFF000000)>>24);
       SendData.CANTDB.Bits.Data1_BIT=(char)(data1&0x000000FF);
       SendData.CANTDB.Bits.Data2_BIT=(char)((data1&0x0000FF00)>>8);
       SendData.CANTDB.Bits.Data3_BIT=(char)((data1&0x00FF0000)>>16); 
       can_buf[0]=SendData.CANTDA.Bits.Data1_BIT;
       can_buf[1]=SendData.CANTDA.Bits.Data2_BIT;
       can_buf[2]=SendData.CANTDA.Bits.Data3_BIT;
       can_buf[3]=SendData.CANTDA.Bits.Data4_BIT;
       can_buf[4]=SendData.CANTDB.Bits.Data1_BIT;
       can_buf[5]=SendData.CANTDB.Bits.Data2_BIT;
       can_buf[6]=SendData.CANTDB.Bits.Data3_BIT;
       can_xiaoyan(can_buf);
       SendData.CANTDB.Bits.Data4_BIT=can_buf[7]; 
       break;
    case 65330://用于发送实际温度值和真空度值
       SendData.TxCANID.FrameFm.stcETXFRFM.SA=0x03; //源地址
       SendData.TxCANID.FrameFm.stcETXFRFM.PS=50;   //特定PDU域PS
       SendData.TxCANID.FrameFm.stcETXFRFM.PF=255;  //PDU格式PF
       SendData.TxCANID.FrameFm.stcETXFRFM.DP=0;    //数据页
       SendData.TxCANID.FrameFm.stcETXFRFM.R =0;    //保留位
       SendData.TxCANID.FrameFm.stcETXFRFM.P =6;    //优先级
       SendData.TxFrameInfo.Bits.DLC_BIT=8;
       SendData.CANTDA.Bits.Data1_BIT=0xFF;
       SendData.CANTDA.Bits.Data2_BIT=0xFF;
       SendData.CANTDA.Bits.Data3_BIT=(char) (water_temp&0x000000FF);
       SendData.CANTDA.Bits.Data4_BIT=0x00;
       SendData.CANTDB.Bits.Data1_BIT=(char)(vacuum_pressure&0x000000FF);
       SendData.CANTDB.Bits.Data2_BIT=0xFF;
       SendData.CANTDB.Bits.Data3_BIT=0xFF; 
       can_buf[0]=SendData.CANTDA.Bits.Data1_BIT;
       can_buf[1]=SendData.CANTDA.Bits.Data2_BIT;
       can_buf[2]=SendData.CANTDA.Bits.Data3_BIT;
       can_buf[3]=SendData.CANTDA.Bits.Data4_BIT;
       can_buf[4]=SendData.CANTDB.Bits.Data1_BIT;
       can_buf[5]=SendData.CANTDB.Bits.Data2_BIT;
       can_buf[6]=SendData.CANTDB.Bits.Data3_BIT;
       can_xiaoyan(can_buf);
       SendData.CANTDB.Bits.Data4_BIT=can_buf[7]; 
       break;
    /*case 65331://用于发送实际温度值和真空度值
       SendData.TxCANID.FrameFm.stcETXFRFM.SA=0x03; //源地址
       SendData.TxCANID.FrameFm.stcETXFRFM.PS=50;   //特定PDU域PS
       SendData.TxCANID.FrameFm.stcETXFRFM.PF=255;  //PDU格式PF
       SendData.TxCANID.FrameFm.stcETXFRFM.DP=0;    //数据页
       SendData.TxCANID.FrameFm.stcETXFRFM.R =0;    //保留位
       SendData.TxCANID.FrameFm.stcETXFRFM.P =6;    //优先级
       SendData.TxFrameInfo.Bits.DLC_BIT=8;
       SendData.CANTDA.Bits.Data1_BIT=0x55;
       SendData.CANTDA.Bits.Data2_BIT=0x55;
       SendData.CANTDA.Bits.Data3_BIT=(char) (water_temp&0x000000FF);
       SendData.CANTDA.Bits.Data4_BIT=0x00;
       SendData.CANTDB.Bits.Data1_BIT=(char)(vacuum_pressure&0x000000FF);
       SendData.CANTDB.Bits.Data2_BIT=0xFF;
       SendData.CANTDB.Bits.Data3_BIT=0xFF; 
       can_buf[0]=SendData.CANTDA.Bits.Data1_BIT;
       can_buf[1]=SendData.CANTDA.Bits.Data2_BIT;
       can_buf[2]=SendData.CANTDA.Bits.Data3_BIT;
       can_buf[3]=SendData.CANTDA.Bits.Data4_BIT;
       can_buf[4]=SendData.CANTDB.Bits.Data1_BIT;
       can_buf[5]=SendData.CANTDB.Bits.Data2_BIT;
       can_buf[6]=SendData.CANTDB.Bits.Data3_BIT;
       can_xiaoyan(can_buf);
       SendData.CANTDB.Bits.Data4_BIT=can_buf[7]; 
       break;*/
	case 512://用于发送电脑版本号
       SendData.TxCANID.FrameFm.stcETXFRFM.SA=0x03; //源地址
       SendData.TxCANID.FrameFm.stcETXFRFM.PS=0xC8; //特定PDU域PS..DA
       SendData.TxCANID.FrameFm.stcETXFRFM.PF=2;    //PDU格式PF
       SendData.TxCANID.FrameFm.stcETXFRFM.DP=0;    //数据页
       SendData.TxCANID.FrameFm.stcETXFRFM.R =0;    //保留位
       SendData.TxCANID.FrameFm.stcETXFRFM.P =6;    //优先级
       SendData.TxFrameInfo.Bits.DLC_BIT=8;
       SendData.CANTDA.Bits.Data1_BIT=(char) (data&0x000000FF);
       SendData.CANTDA.Bits.Data2_BIT=(char)((data&0x0000FF00)>>8);
       SendData.CANTDA.Bits.Data3_BIT=(char)((data&0x00FF0000)>>16);
       SendData.CANTDA.Bits.Data4_BIT=(char) (data1&0x000000FF);
       SendData.CANTDB.Bits.Data1_BIT=(char)((data1&0x0000FF00)>>8);
       SendData.CANTDB.Bits.Data2_BIT=(char)((data1&0x00FF0000)>>16);
       SendData.CANTDB.Bits.Data3_BIT=0xFF; 
       can_buf[0]=SendData.CANTDA.Bits.Data1_BIT;
       can_buf[1]=SendData.CANTDA.Bits.Data2_BIT;
       can_buf[2]=SendData.CANTDA.Bits.Data3_BIT;
       can_buf[3]=SendData.CANTDA.Bits.Data4_BIT;
       can_buf[4]=SendData.CANTDB.Bits.Data1_BIT;
       can_buf[5]=SendData.CANTDB.Bits.Data2_BIT;
       can_buf[6]=SendData.CANTDB.Bits.Data3_BIT;
       can_xiaoyan(can_buf);
       SendData.CANTDB.Bits.Data4_BIT=can_buf[7]; 
       break;
    case 768://用于故障代码发送
       SendData.TxCANID.FrameFm.stcETXFRFM.SA=0x03; //源地址
       SendData.TxCANID.FrameFm.stcETXFRFM.PS=0xC8; //特定PDU域PS..DA
       SendData.TxCANID.FrameFm.stcETXFRFM.PF=3;    //PDU格式PF
       SendData.TxCANID.FrameFm.stcETXFRFM.DP=0;    //数据页
       SendData.TxCANID.FrameFm.stcETXFRFM.R =0;    //保留位
       SendData.TxCANID.FrameFm.stcETXFRFM.P =6;    //优先级
       SendData.TxFrameInfo.Bits.DLC_BIT=8;
       SendData.CANTDA.Bits.Data1_BIT=(char) (data&0x000000FF);
       SendData.CANTDA.Bits.Data2_BIT=(char) (data1&0x000000FF);
       SendData.CANTDA.Bits.Data3_BIT=(char)((data1&0x0000FF00)>>8);
       SendData.CANTDA.Bits.Data4_BIT=0x00;
       SendData.CANTDB.Bits.Data1_BIT=0x00;
       SendData.CANTDB.Bits.Data2_BIT=0x00;
       SendData.CANTDB.Bits.Data3_BIT=0x00; 
       can_buf[0]=SendData.CANTDA.Bits.Data1_BIT;
       can_buf[1]=SendData.CANTDA.Bits.Data2_BIT;
       can_buf[2]=SendData.CANTDA.Bits.Data3_BIT;
       can_buf[3]=SendData.CANTDA.Bits.Data4_BIT;
       can_buf[4]=SendData.CANTDB.Bits.Data1_BIT;
       can_buf[5]=SendData.CANTDB.Bits.Data2_BIT;
       can_buf[6]=SendData.CANTDB.Bits.Data3_BIT;
       can_xiaoyan(can_buf);
       SendData.CANTDB.Bits.Data4_BIT=can_buf[7]; 
       break;
    default:
       return 0;
	   break; 
   }
   return CANSendData(CanNum, 0, &SendData);
}

/****************************************************************************************
*
*UINT32 CANReadData_29bit(eCANNUM CanNum, unsigned long int* pIdCAN, 
*						unsigned int* pLengthOfData, char* pData)
*description	:主控ECU CAN 接收专用function.
*			 基于byd CAN协议---EF3 CAN总线协议(草案).doc
*input		:eCANNUM CanNum--------:要接收的CAN 端口
*			 unsigned long int* CANPGN--:存放接收到的CAN数据的PGN参数。默认为24位。
*			 cunsigned intr* pLengthOfData-------:存放接收的CAN数据长度-DLC
*			 char* pData--------------:存放接收到的CAN数据。调用者应该使
*									  此指针指向一个8 Bytes的char数组
*return		:UINT32--即调用ReadCANRcvCyBuf函数的返回值
*					==0,驱动接收到数据。
*					!=0,驱动没接收到数据.
****************************************************************************************/
UINT32 CANReadData_29bit(eCANNUM CanNum,uint32* CANPGN, 
							 uint32* pLengthOfData, pRCV_candata pData)
{
	UINT32	status=0;
	stcRxBUF RecDa;
    stcRxBUF* pRecDa = &RecDa;
    uPGN RecPgn;
    uPGN *pRecPgn = &RecPgn;
	
	status = ReadCANRcvCyBuf(CanNum, pRecDa);
	if(status)				
		return status;
	//提取PGN
	RecPgn.stcPGN.PS=RecDa.RxCANID.FrameFm.stcETXFRFM.PS;//提取PS
	RecPgn.stcPGN.PF=RecDa.RxCANID.FrameFm.stcETXFRFM.PF;//提取PF
	//RecPgn.stcPGN.DP=RecDa.RxCANID.FrameFm.stcETXFRFM.DP;//提取DP
	//RecPgn.stcPGN.R= RecDa.RxCANID.FrameFm.stcETXFRFM.R; //提取R
	RecPgn.stcPGN.RSV_BIT14 = 0;                         //前14保留为0
	//*CANPGN=RecPgn.Word;
	if(RecPgn.stcPGN.PF==255)
	{//正常报文
	  *CANPGN=RecPgn.Word;                                 //把值传递给PGN 
	}
	if(RecPgn.stcPGN.PF<=240)		//请求报文或者版本号请求报文((RecPgn.stcPGN.PF==234)||(RecPgn.stcPGN.PF==2))
	{//请求报文59904
	  module_num=RecDa.RxCANID.FrameFm.stcETXFRFM.PS;
	  RecPgn.stcPGN.PS=0;
	  *CANPGN=RecPgn.Word;
	}
	*pLengthOfData = RecDa.CANRcvFS.Bits.DLC_BIT;
	(*pData).Word = (char)RecDa.CANRDA.Bits.Data1_BIT;
	(pData + 1)->Word = (char)RecDa.CANRDA.Bits.Data2_BIT;
	(pData + 2)->Word = (char)RecDa.CANRDA.Bits.Data3_BIT;
	(pData + 3)->Word = (char)RecDa.CANRDA.Bits.Data4_BIT;
	(pData + 4)->Word = (char)RecDa.CANRDB.Bits.Data1_BIT;
	(pData + 5)->Word = (char)RecDa.CANRDB.Bits.Data2_BIT;
	(pData + 6)->Word = (char)RecDa.CANRDB.Bits.Data3_BIT;
	(pData + 7)->Word = (char)RecDa.CANRDB.Bits.Data4_BIT;
	return status;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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