📄 canapp.c
字号:
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 + -