CANNet.c 9.2 KB

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