/******************************************************************************** * 常州易控汽车电子股份有限公司 * (c) Copyright 2009-2015 ECTEK * 保留所有权利 ******************************************************************************** * 工程名称:整车管理 * 文件名: CANNet.c * 功能描述 : CAN总线管理 * 引用记录: * 备注: * 修订记录: * 日期 版本 作者 描述 * 2011.07.14 00.01.00 李中 第一版 *******************************************************************************/ #include "HardwareLib.h" #include "CANNet.h" #include "AccPedCD.h" MCANDrv_infoMsgConfS_TYPE CANNet_infoMsgTxConfSA[3]; uint16 CANNet_idxSchedUB; MCANDrv_infoMsgConfS_TYPE CANNet_InfoRxMsgConfSA[128]; uint8 CANNet_datRxMsgBufM[128][9]; uint32 CanRecvTest = 0; uint32 CanRecvTestDelay = 0; void CANNet_Init(void) { /*示例代码*/ /*各个CAN节点初始化*/ MCANDrv_SetBaudrate(_CAN_INDEX_CAN0, 250000); MCANDrv_SetCANMode(_CAN_INDEX_CAN0, MCAN_NODEMODE_BUF); MCANDrv_SetCallbackFunc(_CAN_INDEX_CAN0, (pFunc_RxMsgCallback)CANNet_RecvMsgCAN0, NULL_PTR); MCANDrv_SetBaudrate(_CAN_INDEX_CAN1, 250000); MCANDrv_SetCANMode(_CAN_INDEX_CAN1, MCAN_NODEMODE_BUF); MCANDrv_SetCallbackFunc(_CAN_INDEX_CAN1, (pFunc_RxMsgCallback)CANNet_RecvMsgCAN1, NULL_PTR); /*第2路CAN用于CCP、UDS协议,由底层配置*/ /*接收报文初始化*/ // CANNet_InfoRxMsgConfSA[0].infoMsgIDUI = 0x1F000023UL; // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.CAN = 0; // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.MO = 0; // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.DIR = _MCAN_DIR_RX; // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.DLC = 8; // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.IDE = _MCAN_IDE_EXT; // MCANDrv_SetMsgObj(CANNet_InfoRxMsgConfSA[0], CANNet_RecvMsgCAN0); /*发送报文初始化*/ CANNet_infoMsgTxConfSA[0].infoMsgIDUI = 0x1F000024UL; CANNet_infoMsgTxConfSA[0].infoMsgParU.B.CAN = 0; CANNet_infoMsgTxConfSA[0].infoMsgParU.B.MO = 0; CANNet_infoMsgTxConfSA[0].infoMsgParU.B.DIR = _MCAN_DIR_TX; CANNet_infoMsgTxConfSA[0].infoMsgParU.B.DLC = 8; CANNet_infoMsgTxConfSA[0].infoMsgParU.B.IDE = _MCAN_IDE_EXT; //MCANDrv_SetMsgObj(CANNet_infoMsgTxConfSA[0], NULL_PTR); CANNet_infoMsgTxConfSA[1].infoMsgIDUI = 0x1F000025UL; CANNet_infoMsgTxConfSA[1].infoMsgParU.B.CAN = 1; CANNet_infoMsgTxConfSA[1].infoMsgParU.B.MO = 1; CANNet_infoMsgTxConfSA[1].infoMsgParU.B.DIR = _MCAN_DIR_TX; CANNet_infoMsgTxConfSA[1].infoMsgParU.B.DLC = 8; CANNet_infoMsgTxConfSA[1].infoMsgParU.B.IDE = _MCAN_IDE_EXT; //MCANDrv_SetMsgObj(CANNet_infoMsgTxConfSA[1], NULL_PTR); CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x1F000026UL; CANNet_infoMsgTxConfSA[2].infoMsgParU.B.CAN = 2; CANNet_infoMsgTxConfSA[2].infoMsgParU.B.MO = 2; CANNet_infoMsgTxConfSA[2].infoMsgParU.B.DIR = _MCAN_DIR_TX; CANNet_infoMsgTxConfSA[2].infoMsgParU.B.DLC = 8; CANNet_infoMsgTxConfSA[2].infoMsgParU.B.IDE = _MCAN_IDE_EXT; } //CAN0接收消息处理函数 void CANNet_RecvMsgCAN0(MCANDrv_infoMsgS_TYPE infoMsgS) { //CAN接收样例 uint8 idxIncUB,idxByteUB; for(idxIncUB=0;idxIncUB<128;idxIncUB++) { if(infoMsgS.infoConfS.infoMsgIDUI == CANNet_InfoRxMsgConfSA[idxIncUB].infoMsgIDUI) { for(idxByteUB=0;idxByteUB<8;idxByteUB++) { CANNet_datRxMsgBufM[idxIncUB][idxByteUB]=infoMsgS.datMsgUBA[idxByteUB]; } CANNet_datRxMsgBufM[idxIncUB][8]++; } } CanRecvTestDelay = SysCon_tiRunHighResiUI; CanRecvTest = CanRecvTestDelay - CanRecvTest; } //CAN1接收消息处理函数 void CANNet_RecvMsgCAN1(MCANDrv_infoMsgS_TYPE infoMsgS) { //CAN接收样例 uint8 idxIncUB,idxByteUB; for(idxIncUB=0;idxIncUB<128;idxIncUB++) { if(infoMsgS.infoConfS.infoMsgIDUI == CANNet_InfoRxMsgConfSA[idxIncUB].infoMsgIDUI) { for(idxByteUB=0;idxByteUB<8;idxByteUB++) { CANNet_datRxMsgBufM[idxIncUB][idxByteUB]=infoMsgS.datMsgUBA[idxByteUB]; } CANNet_datRxMsgBufM[idxIncUB][8]++; } } } //发送消息管理 void CANNet_Manage1ms(void) { MCANDrv_infoMsgS_TYPE infoMsgS; switch(CANNet_idxSchedUB) { case 0: CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F0; infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2]; infoMsgS.datMsgUBA[0] = (uint8)(PressureValue>>24); infoMsgS.datMsgUBA[1] = (uint8)(PressureValue>>16); infoMsgS.datMsgUBA[2] = (uint8)(PressureValue)>>8; infoMsgS.datMsgUBA[3] = (uint8)(PressureValue); infoMsgS.datMsgUBA[4] = (uint8)(Distence1>>8); infoMsgS.datMsgUBA[5] = (uint8)(Distence1); infoMsgS.datMsgUBA[6] = (uint8)(Distence2>>8); infoMsgS.datMsgUBA[7] = (uint8)(Distence2); MCANDrv_SendMsg(infoMsgS); break; case 1: CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F1; infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2]; infoMsgS.datMsgUBA[0] = (uint8)(Switch1); infoMsgS.datMsgUBA[1] = (uint8)(Switch2); infoMsgS.datMsgUBA[2] = 0xFF; infoMsgS.datMsgUBA[3] = 0xFF; infoMsgS.datMsgUBA[4] = 0xFF; infoMsgS.datMsgUBA[5] = 0xFF; infoMsgS.datMsgUBA[6] = 0xFF; infoMsgS.datMsgUBA[7] = 0xFF; MCANDrv_SendMsg(infoMsgS); break; case 2: CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F2; infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2]; infoMsgS.datMsgUBA[0] = ControlState; infoMsgS.datMsgUBA[1] = 0xFF; infoMsgS.datMsgUBA[2] = 0xFF; infoMsgS.datMsgUBA[3] = 0xFF; infoMsgS.datMsgUBA[4] = (uint8)(Control_Times>>24); infoMsgS.datMsgUBA[5] = (uint8)(Control_Times>>16); infoMsgS.datMsgUBA[6] = (uint8)(Control_Times>>8); infoMsgS.datMsgUBA[7] = (uint8)(Control_Times); MCANDrv_SendMsg(infoMsgS); break; default: break; } CANNet_idxSchedUB=(uint16)((CANNet_idxSchedUB+1)%100); //100ms一个完整循环 }