CANNet.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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. MCANDrv_infoMsgConfS_TYPE CANNet_infoMsgTxConfSA[3];
  19. MCAN_stRetE_TYPE CAN1Result;
  20. uint16 CANNet_idxSchedUB;
  21. MCANDrv_infoMsgConfS_TYPE CANNet_InfoRxMsgConfSA[128];
  22. uint8 CANNet_datRxMsgBufM[128][9];
  23. void CANNet_Init(void)
  24. {
  25. /*示例代码*/
  26. /*各个CAN节点初始化*/
  27. MCANDrv_SetBaudrate(_CAN_INDEX_CAN0, 250000);
  28. MCANDrv_SetCANMode(_CAN_INDEX_CAN0, MCAN_NODEMODE_BUF);
  29. MCANDrv_SetCallbackFunc(_CAN_INDEX_CAN0, (pFunc_RxMsgCallback)CANNet_RecvMsgCAN0, NULL_PTR);
  30. MCANDrv_SetBaudrate(_CAN_INDEX_CAN1, 250000);
  31. MCANDrv_SetCANMode(_CAN_INDEX_CAN1, MCAN_NODEMODE_BUF);
  32. MCANDrv_SetCallbackFunc(_CAN_INDEX_CAN1, (pFunc_RxMsgCallback)CANNet_RecvMsgCAN1, NULL_PTR);
  33. /*第2路CAN用于CCP、UDS协议,由底层配置*/
  34. /*接收报文初始化*/
  35. // CANNet_InfoRxMsgConfSA[0].infoMsgIDUI = 0x1F000023UL;
  36. // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.CAN = 0;
  37. // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.MO = 0;
  38. // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.DIR = _MCAN_DIR_RX;
  39. // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.DLC = 8;
  40. // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  41. // MCANDrv_SetMsgObj(CANNet_InfoRxMsgConfSA[0], CANNet_RecvMsgCAN0);
  42. /*发送报文初始化*/
  43. CANNet_infoMsgTxConfSA[0].infoMsgIDUI = 0x1F000024UL;
  44. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.CAN = 0;
  45. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.MO = 0;
  46. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.DIR = _MCAN_DIR_TX;
  47. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.DLC = 8;
  48. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  49. // MCANDrv_SetMsgObj(CANNet_infoMsgTxConfSA[0], NULL_PTR);
  50. CANNet_infoMsgTxConfSA[1].infoMsgIDUI = 0x1F000025UL;
  51. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.CAN = 1;
  52. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.MO = 1;
  53. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.DIR = _MCAN_DIR_TX;
  54. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.DLC = 8;
  55. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  56. // MCANDrv_SetMsgObj(CANNet_infoMsgTxConfSA[1], NULL_PTR);
  57. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x1F000026UL;
  58. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.CAN = 2;
  59. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.MO = 2;
  60. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.DIR = _MCAN_DIR_TX;
  61. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.DLC = 8;
  62. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  63. }
  64. // CAN0接收消息处理函数 VCU
  65. void CANNet_RecvMsgCAN0(MCANDrv_infoMsgS_TYPE infoMsgS)
  66. {
  67. // CAN接收样例
  68. // uint8 idxIncUB, idxByteUB;
  69. // for (idxIncUB = 0; idxIncUB < 128; idxIncUB++)
  70. // {
  71. // if (infoMsgS.infoConfS.infoMsgIDUI == CANNet_InfoRxMsgConfSA[idxIncUB].infoMsgIDUI)
  72. // {
  73. // for (idxByteUB = 0; idxByteUB < 8; idxByteUB++)
  74. // {
  75. // CANNet_datRxMsgBufM[idxIncUB][idxByteUB] = infoMsgS.datMsgUBA[idxByteUB];
  76. // }
  77. // CANNet_datRxMsgBufM[idxIncUB][8]++;
  78. // }
  79. // }
  80. VcuDecodeFunction(infoMsgS.infoConfS.infoMsgIDUI,infoMsgS.datMsgUBA);
  81. }
  82. // CAN1接收消息处理函数
  83. void CANNet_RecvMsgCAN1(MCANDrv_infoMsgS_TYPE infoMsgS)
  84. {
  85. // CAN接收样例
  86. // uint8 idxIncUB, idxByteUB;
  87. // for (idxIncUB = 0; idxIncUB < 128; idxIncUB++)
  88. // {
  89. // if (infoMsgS.infoConfS.infoMsgIDUI == CANNet_InfoRxMsgConfSA[idxIncUB].infoMsgIDUI)
  90. // {
  91. // for (idxByteUB = 0; idxByteUB < 8; idxByteUB++)
  92. // {
  93. // CANNet_datRxMsgBufM[idxIncUB][idxByteUB] = infoMsgS.datMsgUBA[idxByteUB];
  94. // }
  95. //
  96. // CANNet_datRxMsgBufM[idxIncUB][8]++;
  97. // }
  98. // }
  99. BcuDecodeFunction(infoMsgS.infoConfS.infoMsgIDUI,infoMsgS.datMsgUBA);
  100. }
  101. //
  102. //发送消息管理
  103. void CAN0Net_Manage1ms(void)
  104. {
  105. static UINT32 Can0TimerCounter = 0;
  106. static UINT8 VcuIDIdx = 0;
  107. MCANDrv_infoMsgS_TYPE infoMsgS;
  108. static BOOL ChkFlg = FALSE;
  109. //sizeof(Ebc2VcuOutTable)/8
  110. if(Can0TimerCounter%100==0)
  111. {
  112. if(Can0TimerCounter%(Ebc2VcuOutTable[VcuIDIdx][1])==0)
  113. {
  114. CANNet_infoMsgTxConfSA[0].infoMsgIDUI = Ebc2VcuOutTable[VcuIDIdx][0];
  115. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[0];
  116. memset(infoMsgS.datMsgUBA,0x00,8);
  117. VcuEncodeFunction(Ebc2VcuOutTable[VcuIDIdx][0],&(infoMsgS.datMsgUBA[0]));
  118. MCANDrv_SendMsg(infoMsgS);
  119. }
  120. VcuIDIdx++;
  121. ChkFlg = FALSE;
  122. }
  123. if(VcuIDIdx>=(sizeof(Ebc2VcuOutTable)/8))
  124. {
  125. VcuIDIdx = 0;
  126. ChkFlg = TRUE;
  127. }
  128. if(ChkFlg)
  129. {
  130. Can0TimerCounter = Can0TimerCounter + 1;
  131. }
  132. }
  133. void CAN1Net_Manage1ms(void)
  134. {
  135. static UINT32 Can1TimerCounter = 0;
  136. static UINT8 BcuIDIdx = 0;
  137. static BOOL BcuChkFlg = FALSE;
  138. MCANDrv_infoMsgS_TYPE infoMsgS;
  139. if(Can1TimerCounter%100==0)
  140. {
  141. if(Can1TimerCounter%(Ebc2BcuOutTable[BcuIDIdx][1])==0)
  142. {
  143. CANNet_infoMsgTxConfSA[1].infoMsgIDUI = Ebc2BcuOutTable[BcuIDIdx][0];
  144. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[1];
  145. memset(infoMsgS.datMsgUBA,0x00,8);
  146. BcuEncodeFunction(Ebc2BcuOutTable[BcuIDIdx][0],&(infoMsgS.datMsgUBA[0]));
  147. CAN1Result = MCANDrv_SendMsg(infoMsgS);
  148. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F0;
  149. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  150. infoMsgS.datMsgUBA[0] = (uint8)(CAN1Result >> 24);
  151. infoMsgS.datMsgUBA[1] = (uint8)(CAN1Result >> 16);
  152. infoMsgS.datMsgUBA[2] = (uint8)(CAN1Result >> 8);
  153. infoMsgS.datMsgUBA[3] = (uint8)(CAN1Result >> 0);
  154. infoMsgS.datMsgUBA[4] = (uint8)(Can1TimerCounter >> 24);
  155. infoMsgS.datMsgUBA[5] = (uint8)(Can1TimerCounter >> 16);
  156. infoMsgS.datMsgUBA[6] = (uint8)(Can1TimerCounter >> 8);
  157. infoMsgS.datMsgUBA[7] = (uint8)(Can1TimerCounter);
  158. MCANDrv_SendMsg(infoMsgS);
  159. }
  160. BcuIDIdx++;
  161. BcuChkFlg = FALSE;
  162. }
  163. if(BcuIDIdx>=(sizeof(Ebc2BcuOutTable)/8))
  164. {
  165. BcuIDIdx = 0;
  166. BcuChkFlg = TRUE;
  167. }
  168. if(BcuChkFlg)
  169. {
  170. Can1TimerCounter = Can1TimerCounter +1;
  171. }
  172. }
  173. void CAN2Net_Manage1ms(void)
  174. {
  175. static UINT32 Can2TimerCounter = 0;
  176. MCANDrv_infoMsgS_TYPE infoMsgS;
  177. if(Can2TimerCounter%100==0)
  178. {
  179. }
  180. Can2TimerCounter = Can2TimerCounter +1;
  181. #ifdef _APP_TEST_CODE
  182. switch (CANNet_idxSchedUB)
  183. {
  184. case 0:
  185. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F0;
  186. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  187. infoMsgS.datMsgUBA[0] = (uint8)(PressureValue >> 24);
  188. infoMsgS.datMsgUBA[1] = (uint8)(PressureValue >> 16);
  189. infoMsgS.datMsgUBA[2] = (uint8)(PressureValue >> 8);
  190. infoMsgS.datMsgUBA[3] = (uint8)(PressureValue >> 0);
  191. infoMsgS.datMsgUBA[4] = (uint8)(Distence1 >> 8);
  192. infoMsgS.datMsgUBA[5] = (uint8)(Distence1);
  193. infoMsgS.datMsgUBA[6] = (uint8)(Distence2 >> 8);
  194. infoMsgS.datMsgUBA[7] = (uint8)(Distence2);
  195. MCANDrv_SendMsg(infoMsgS);
  196. break;
  197. case 1:
  198. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F1;
  199. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  200. infoMsgS.datMsgUBA[0] = (uint8)(Switch1);
  201. infoMsgS.datMsgUBA[1] = (uint8)(Switch2);
  202. infoMsgS.datMsgUBA[2] = 0xFF;
  203. infoMsgS.datMsgUBA[3] = 0xFF;
  204. infoMsgS.datMsgUBA[4] = (uint8)(PressureValue >> 24);
  205. infoMsgS.datMsgUBA[5] = (uint8)(PressureValue >> 16);
  206. infoMsgS.datMsgUBA[6] = (uint8)(PressureValue >> 8);
  207. infoMsgS.datMsgUBA[7] = (uint8)(PressureValue >> 0);
  208. MCANDrv_SendMsg(infoMsgS);
  209. break;
  210. case 2:
  211. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F2;
  212. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  213. infoMsgS.datMsgUBA[0] = ControlState;
  214. infoMsgS.datMsgUBA[1] = 0xFF;
  215. infoMsgS.datMsgUBA[2] = 0xFF;
  216. infoMsgS.datMsgUBA[3] = 0xFF;
  217. infoMsgS.datMsgUBA[4] = (uint8)(Control_Times >> 24);
  218. infoMsgS.datMsgUBA[5] = (uint8)(Control_Times >> 16);
  219. infoMsgS.datMsgUBA[6] = (uint8)(Control_Times >> 8);
  220. infoMsgS.datMsgUBA[7] = (uint8)(Control_Times);
  221. MCANDrv_SendMsg(infoMsgS);
  222. break;
  223. default:
  224. break;
  225. }
  226. CANNet_idxSchedUB = (uint16)((CANNet_idxSchedUB + 1) % 100); // 100ms一个完整循环
  227. #endif
  228. }