CANNet.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /********************************************************************************
  2. * 常州易控汽车电子股份有限公司
  3. * (c) Copyright 2009-2015 ECTEK
  4. * 保留所有权利
  5. ********************************************************************************
  6. * 工程名称:整车管理
  7. * 文件名: CANNet.c
  8. * 功能描述 : CAN总线管理
  9. * 引用记录:
  10. * 备注:
  11. * 修订记录:
  12. * 日期 版本 作者 描述
  13. * 2011.07.14 00.01.00 李中 第一版
  14. *******************************************************************************/
  15. #include "HardwareLib.h"
  16. #include "CANNet.h"
  17. #include "AccPedCD.h"
  18. #include "BleCanProtocolFunc.h"
  19. #include "BcuCanProtocolFunc.h"
  20. #include "VcuCanProtocolFunc.h"
  21. MCANDrv_infoMsgConfS_TYPE CANNet_infoMsgTxConfSA[3];
  22. MCAN_stRetE_TYPE CAN1Result;
  23. uint16 CANNet_idxSchedUB;
  24. MCANDrv_infoMsgConfS_TYPE CANNet_InfoRxMsgConfSA[128];
  25. uint8 CANNet_datRxMsgBufM[128][9];
  26. void CANNet_Init(void)
  27. {
  28. /*示例代码*/
  29. /*各个CAN节点初始化*/
  30. MCANDrv_SetBaudrate(_CAN_INDEX_CAN0, 250000);
  31. MCANDrv_SetCANMode(_CAN_INDEX_CAN0, MCAN_NODEMODE_BUF);
  32. MCANDrv_SetCallbackFunc(_CAN_INDEX_CAN0, (pFunc_RxMsgCallback)CANNet_RecvMsgCAN0, NULL_PTR);
  33. MCANDrv_SetBaudrate(_CAN_INDEX_CAN1, 250000);
  34. MCANDrv_SetCANMode(_CAN_INDEX_CAN1, MCAN_NODEMODE_BUF);
  35. MCANDrv_SetCallbackFunc(_CAN_INDEX_CAN1, (pFunc_RxMsgCallback)CANNet_RecvMsgCAN1, NULL_PTR);
  36. /*第2路CAN用于CCP、UDS协议,由底层配置*/
  37. // MCANDrv_SetCallbackFunc(_CAN_INDEX_CAN2, (pFunc_RxMsgCallback)CANNet_RecvMsgCAN2, NULL_PTR);
  38. /*接收报文初始化,主要配置CAN2*/
  39. CANNet_InfoRxMsgConfSA[0].infoMsgIDUI = 0x1CEF0000UL;
  40. CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.CAN = 2;
  41. CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.MO = 3;
  42. CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.DIR = _MCAN_DIR_RX;
  43. CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.DLC = 8;
  44. CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  45. MCANDrv_SetMsgObj(CANNet_InfoRxMsgConfSA[0], CANNet_RecvMsgCAN2);
  46. CANNet_InfoRxMsgConfSA[1].infoMsgIDUI = 0x1C00ECEAUL;
  47. CANNet_InfoRxMsgConfSA[1].infoMsgParU.B.CAN = 2;
  48. CANNet_InfoRxMsgConfSA[1].infoMsgParU.B.MO = 4;
  49. CANNet_InfoRxMsgConfSA[1].infoMsgParU.B.DIR = _MCAN_DIR_RX;
  50. CANNet_InfoRxMsgConfSA[1].infoMsgParU.B.DLC = 8;
  51. CANNet_InfoRxMsgConfSA[1].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  52. MCANDrv_SetMsgObj(CANNet_InfoRxMsgConfSA[1], CANNet_RecvMsgCAN2);
  53. /*发送报文初始化*/
  54. CANNet_infoMsgTxConfSA[0].infoMsgIDUI = 0x1F000024UL;
  55. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.CAN = 0;
  56. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.MO = 0;
  57. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.DIR = _MCAN_DIR_TX;
  58. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.DLC = 8;
  59. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  60. // MCANDrv_SetMsgObj(CANNet_infoMsgTxConfSA[0], NULL_PTR);
  61. CANNet_infoMsgTxConfSA[1].infoMsgIDUI = 0x1F000025UL;
  62. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.CAN = 1;
  63. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.MO = 1;
  64. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.DIR = _MCAN_DIR_TX;
  65. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.DLC = 8;
  66. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  67. // MCANDrv_SetMsgObj(CANNet_infoMsgTxConfSA[1], NULL_PTR);
  68. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x1F000026UL;
  69. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.CAN = 2;
  70. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.MO = 2;
  71. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.DIR = _MCAN_DIR_TX;
  72. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.DLC = 8;
  73. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  74. }
  75. // CAN0接收消息处理函数 VCU
  76. void CANNet_RecvMsgCAN0(MCANDrv_infoMsgS_TYPE infoMsgS)
  77. {
  78. //直连状态下,CAN0空置,连接CAN1
  79. }
  80. // CAN1接收消息处理函数
  81. void CANNet_RecvMsgCAN1(MCANDrv_infoMsgS_TYPE infoMsgS)
  82. {
  83. BcuDecodeFunction(infoMsgS.infoConfS.infoMsgIDUI, infoMsgS.datMsgUBA);
  84. VcuDecodeFunction(infoMsgS.infoConfS.infoMsgIDUI, infoMsgS.datMsgUBA);
  85. }
  86. /*备注,CAN2接收报文时,需要配置接收报文的MO号,如果不配置,将进入不了CAN中断*/
  87. void CANNet_RecvMsgCAN2(MCANDrv_infoMsgS_TYPE infoMsgS)
  88. {
  89. Can2ProtocolDecode(infoMsgS.infoConfS.infoMsgIDUI, infoMsgS.datMsgUBA);
  90. }
  91. //发送消息管理
  92. void CAN0Net_Manage1ms(void)
  93. {
  94. /*
  95. static UINT32 Can0TimerCounter = 0;
  96. static UINT8 VcuIDIdx = 0;
  97. MCANDrv_infoMsgS_TYPE infoMsgS;
  98. static BOOL ChkFlg = FALSE;
  99. if (Can0TimerCounter % 100 == 0)
  100. {
  101. if (Can0TimerCounter % (Ebc2VcuOutTable[VcuIDIdx][1]) == 0)
  102. {
  103. CANNet_infoMsgTxConfSA[0].infoMsgIDUI = Ebc2VcuOutTable[VcuIDIdx][0];
  104. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[0];
  105. memset(infoMsgS.datMsgUBA, 0x00, 8);
  106. VcuEncodeFunction(Ebc2VcuOutTable[VcuIDIdx][0], &(infoMsgS.datMsgUBA[0]));
  107. MCANDrv_SendMsg(infoMsgS);
  108. }
  109. VcuIDIdx++;
  110. ChkFlg = FALSE;
  111. }
  112. if (VcuIDIdx >= (sizeof(Ebc2VcuOutTable) / 8))
  113. {
  114. VcuIDIdx = 0;
  115. ChkFlg = TRUE;
  116. }
  117. if (ChkFlg)
  118. {
  119. Can0TimerCounter = Can0TimerCounter + 1;
  120. }
  121. */
  122. }
  123. void CAN1Net_Manage1ms(void)
  124. {
  125. static UINT32 Can1TimerCounter = 0;
  126. static UINT8 BcuIDIdx = 0;
  127. static BOOL BcuChkFlg = FALSE;
  128. MCANDrv_infoMsgS_TYPE infoMsgS;
  129. if (Can1TimerCounter % 100 == 0)
  130. {
  131. if (Can1TimerCounter % (EbcOutTable[BcuIDIdx][1]) == 0)
  132. {
  133. CANNet_infoMsgTxConfSA[1].infoMsgIDUI = EbcOutTable[BcuIDIdx][0];
  134. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[1];
  135. memset(infoMsgS.datMsgUBA, 0x00, 8);
  136. BcuEncodeFunction(EbcOutTable[BcuIDIdx][0], &(infoMsgS.datMsgUBA[0]));
  137. MCANDrv_SendMsg(infoMsgS);
  138. }
  139. BcuIDIdx++;
  140. BcuChkFlg = FALSE;
  141. }
  142. if (BcuIDIdx >= (sizeof(EbcOutTable) / 8))
  143. {
  144. BcuIDIdx = 0;
  145. BcuChkFlg = TRUE;
  146. }
  147. if (BcuChkFlg)
  148. {
  149. Can1TimerCounter = Can1TimerCounter + 1;
  150. }
  151. }
  152. void CAN2Net_Manage1ms(void)
  153. {
  154. MCANDrv_infoMsgS_TYPE infoMsgS;
  155. static UINT32 Can2TimerCounter = 0;
  156. Can2TimerCounter = Can2TimerCounter + 1;
  157. uint8 cmdIdx = 0x00;
  158. uint8 DataIdx = 0x00;
  159. static uint8 AnsNum = 0x00; //应答次数
  160. static uint8 AnsInterval = 0;
  161. DataIdx = ebcd_st_toBleAns;
  162. AnsInterval++;
  163. if (ebcd_flg_Can2SendEnbale == TRUE && DataIdx > 0 && AnsInterval > 5)
  164. {
  165. if (AnsNum < DataPackCounter[DataIdx])
  166. {
  167. Can2ProtocolCode(cmdIdx, DataIdx, (DataPackBegin[DataIdx] + AnsNum), &(CANNet_infoMsgTxConfSA[2].infoMsgIDUI), &(infoMsgS.datMsgUBA[0]));
  168. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  169. MCANDrv_SendMsg(infoMsgS);
  170. AnsNum++;
  171. AnsInterval = 0;
  172. }
  173. else
  174. {
  175. AnsNum = 0;
  176. ebcd_st_toBleAns = 0;
  177. ebcd_flg_Can2SendEnbale = FALSE;
  178. }
  179. }
  180. }