CANNet.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  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 = 0x1CEF0001UL;
  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. // CAN接收样例
  79. // uint8 idxIncUB, idxByteUB;
  80. // for (idxIncUB = 0; idxIncUB < 128; idxIncUB++)
  81. // {
  82. // if (infoMsgS.infoConfS.infoMsgIDUI == CANNet_InfoRxMsgConfSA[idxIncUB].infoMsgIDUI)
  83. // {
  84. // for (idxByteUB = 0; idxByteUB < 8; idxByteUB++)
  85. // {
  86. // CANNet_datRxMsgBufM[idxIncUB][idxByteUB] = infoMsgS.datMsgUBA[idxByteUB];
  87. // }
  88. // CANNet_datRxMsgBufM[idxIncUB][8]++;
  89. // }
  90. // }
  91. VcuDecodeFunction(infoMsgS.infoConfS.infoMsgIDUI, infoMsgS.datMsgUBA);
  92. }
  93. // CAN1接收消息处理函数
  94. void CANNet_RecvMsgCAN1(MCANDrv_infoMsgS_TYPE infoMsgS)
  95. {
  96. // CAN接收样例
  97. // uint8 idxIncUB, idxByteUB;
  98. // for (idxIncUB = 0; idxIncUB < 128; idxIncUB++)
  99. // {
  100. // if (infoMsgS.infoConfS.infoMsgIDUI == CANNet_InfoRxMsgConfSA[idxIncUB].infoMsgIDUI)
  101. // {
  102. // for (idxByteUB = 0; idxByteUB < 8; idxByteUB++)
  103. // {
  104. // CANNet_datRxMsgBufM[idxIncUB][idxByteUB] = infoMsgS.datMsgUBA[idxByteUB];
  105. // }
  106. //
  107. // CANNet_datRxMsgBufM[idxIncUB][8]++;
  108. // }
  109. // }
  110. BcuDecodeFunction(infoMsgS.infoConfS.infoMsgIDUI, infoMsgS.datMsgUBA);
  111. }
  112. /*备注,CAN2接收报文时,需要配置接收报文的MO号,如果不配置,将进入不了CAN中断*/
  113. void CANNet_RecvMsgCAN2(MCANDrv_infoMsgS_TYPE infoMsgS)
  114. {
  115. #ifdef _APP_RELEASE_CODE
  116. Can2ProtocolDecode(infoMsgS.infoConfS.infoMsgIDUI,infoMsgS.datMsgUBA);
  117. #endif
  118. #ifdef _APP_TEST_MOTOR_CODE
  119. switch (infoMsgS.infoConfS.infoMsgIDUI)
  120. {
  121. case 0x0000007E3:
  122. {
  123. MotorControlEnable = infoMsgS.datMsgUBA[0] & 0x0F;
  124. MotorControlCmd = (infoMsgS.datMsgUBA[0] & 0xF0) >> 4;
  125. MotorDebugCmd = infoMsgS.datMsgUBA[1] & 0xFF;
  126. MotorLifeTestCmd = infoMsgS.datMsgUBA[2] & 0xFF;
  127. break;
  128. }
  129. case 0x0000007E4:
  130. {
  131. LockDelay = MAX((UINT16)((infoMsgS.datMsgUBA[1] << 8) | (infoMsgS.datMsgUBA[0])), 100);
  132. RunFailedDelay = MAX((UINT16)(((infoMsgS.datMsgUBA[3] << 8) | infoMsgS.datMsgUBA[2])), 1000);
  133. break;
  134. }
  135. default:
  136. break;
  137. }
  138. #endif
  139. }
  140. //发送消息管理
  141. void CAN0Net_Manage1ms(void)
  142. {
  143. static UINT32 Can0TimerCounter = 0;
  144. static UINT8 VcuIDIdx = 0;
  145. MCANDrv_infoMsgS_TYPE infoMsgS;
  146. static BOOL ChkFlg = FALSE;
  147. if (Can0TimerCounter % 100 == 0)
  148. {
  149. if (Can0TimerCounter % (Ebc2VcuOutTable[VcuIDIdx][1]) == 0)
  150. {
  151. CANNet_infoMsgTxConfSA[0].infoMsgIDUI = Ebc2VcuOutTable[VcuIDIdx][0];
  152. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[0];
  153. memset(infoMsgS.datMsgUBA, 0x00, 8);
  154. VcuEncodeFunction(Ebc2VcuOutTable[VcuIDIdx][0], &(infoMsgS.datMsgUBA[0]));
  155. MCANDrv_SendMsg(infoMsgS);
  156. }
  157. VcuIDIdx++;
  158. ChkFlg = FALSE;
  159. }
  160. if (VcuIDIdx >= (sizeof(Ebc2VcuOutTable) / 8))
  161. {
  162. VcuIDIdx = 0;
  163. ChkFlg = TRUE;
  164. }
  165. if (ChkFlg)
  166. {
  167. Can0TimerCounter = Can0TimerCounter + 1;
  168. }
  169. }
  170. void CAN1Net_Manage1ms(void)
  171. {
  172. static UINT32 Can1TimerCounter = 0;
  173. static UINT8 BcuIDIdx = 0;
  174. static BOOL BcuChkFlg = FALSE;
  175. MCANDrv_infoMsgS_TYPE infoMsgS;
  176. if (Can1TimerCounter % 100 == 0)
  177. {
  178. if (Can1TimerCounter % (Ebc2BcuOutTable[BcuIDIdx][1]) == 0)
  179. {
  180. CANNet_infoMsgTxConfSA[1].infoMsgIDUI = Ebc2BcuOutTable[BcuIDIdx][0];
  181. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[1];
  182. memset(infoMsgS.datMsgUBA, 0x00, 8);
  183. BcuEncodeFunction(Ebc2BcuOutTable[BcuIDIdx][0], &(infoMsgS.datMsgUBA[0]));
  184. MCANDrv_SendMsg(infoMsgS);
  185. }
  186. BcuIDIdx++;
  187. BcuChkFlg = FALSE;
  188. }
  189. if (BcuIDIdx >= (sizeof(Ebc2BcuOutTable) / 8))
  190. {
  191. BcuIDIdx = 0;
  192. BcuChkFlg = TRUE;
  193. }
  194. if (BcuChkFlg)
  195. {
  196. Can1TimerCounter = Can1TimerCounter + 1;
  197. }
  198. }
  199. void CAN2Net_Manage1ms(void)
  200. {
  201. MCANDrv_infoMsgS_TYPE infoMsgS;
  202. #ifdef _APP_RELEASE_CODE
  203. uint8 cmdIdx = 0x00;
  204. uint8 DataIdx = 0x00;
  205. static uint8 AnsNum = 0x00;//应答次数
  206. static uint8 AnsInterval = 0;
  207. DataIdx = ebcd_st_toBleAns;
  208. AnsInterval++;
  209. if(ebcd_flg_Can2SendEnbale==TRUE&&DataIdx>0&&AnsInterval>5)
  210. {
  211. if(AnsNum<DataPackCounter[DataIdx])
  212. {
  213. Can2ProtocolCode(cmdIdx,DataIdx,(DataPackBegin[DataIdx]+AnsNum),&(CANNet_infoMsgTxConfSA[2].infoMsgIDUI),&(infoMsgS.datMsgUBA[0]));
  214. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  215. MCANDrv_SendMsg(infoMsgS);
  216. AnsNum++;
  217. AnsInterval = 0;
  218. }
  219. else
  220. {
  221. AnsNum = 0;
  222. ebcd_st_toBleAns = 0;
  223. ebcd_flg_Can2SendEnbale = FALSE;
  224. }
  225. }
  226. #endif
  227. #ifdef _APP_TEST_MOTOR_CODE
  228. if (Can2TimerCounter % 100 == 1)
  229. {
  230. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F3;
  231. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  232. infoMsgS.datMsgUBA[0] = (uint8)(ebcd_st_lockSensor | (ebcd_st_unlockSensor << 4));
  233. infoMsgS.datMsgUBA[1] = MotorControlEnable;
  234. infoMsgS.datMsgUBA[2] = MotorControlCmd;
  235. infoMsgS.datMsgUBA[3] = MotorDebugCmd;
  236. infoMsgS.datMsgUBA[4] = MotorControlLockNum;
  237. infoMsgS.datMsgUBA[5] = MotorControlunLockNum;
  238. infoMsgS.datMsgUBA[6] = ebcd_P_airSensor;
  239. infoMsgS.datMsgUBA[7] = ebcd_P_airSensor>>8;
  240. MCANDrv_SendMsg(infoMsgS);
  241. }
  242. else if (Can2TimerCounter % 100 == 2)
  243. {
  244. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F4;
  245. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  246. infoMsgS.datMsgUBA[0] = LockDelay;
  247. infoMsgS.datMsgUBA[1] = LockDelay >> 8;
  248. infoMsgS.datMsgUBA[2] = RunFailedDelay;
  249. infoMsgS.datMsgUBA[3] = RunFailedDelay >> 8;
  250. infoMsgS.datMsgUBA[4] = LifeTestCounter;
  251. infoMsgS.datMsgUBA[5] = LifeTestCounter>>8;
  252. infoMsgS.datMsgUBA[6] = 0x00;
  253. infoMsgS.datMsgUBA[7] = 0x00;
  254. MCANDrv_SendMsg(infoMsgS);
  255. }
  256. Can2TimerCounter = Can2TimerCounter + 1;
  257. #endif
  258. #ifdef _APP_TEST_CODE
  259. switch (CANNet_idxSchedUB)
  260. {
  261. case 0:
  262. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F0;
  263. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  264. infoMsgS.datMsgUBA[0] = (uint8)(PressureValue >> 24);
  265. infoMsgS.datMsgUBA[1] = (uint8)(PressureValue >> 16);
  266. infoMsgS.datMsgUBA[2] = (uint8)(PressureValue >> 8);
  267. infoMsgS.datMsgUBA[3] = (uint8)(PressureValue >> 0);
  268. infoMsgS.datMsgUBA[4] = (uint8)(Distence1 >> 8);
  269. infoMsgS.datMsgUBA[5] = (uint8)(Distence1);
  270. infoMsgS.datMsgUBA[6] = (uint8)(Distence2 >> 8);
  271. infoMsgS.datMsgUBA[7] = (uint8)(Distence2);
  272. MCANDrv_SendMsg(infoMsgS);
  273. break;
  274. case 1:
  275. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F1;
  276. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  277. infoMsgS.datMsgUBA[0] = (uint8)(Switch1);
  278. infoMsgS.datMsgUBA[1] = (uint8)(Switch2);
  279. infoMsgS.datMsgUBA[2] = 0xFF;
  280. infoMsgS.datMsgUBA[3] = 0xFF;
  281. infoMsgS.datMsgUBA[4] = (uint8)(PressureValue >> 24);
  282. infoMsgS.datMsgUBA[5] = (uint8)(PressureValue >> 16);
  283. infoMsgS.datMsgUBA[6] = (uint8)(PressureValue >> 8);
  284. infoMsgS.datMsgUBA[7] = (uint8)(PressureValue >> 0);
  285. MCANDrv_SendMsg(infoMsgS);
  286. break;
  287. case 2:
  288. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F2;
  289. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  290. infoMsgS.datMsgUBA[0] = ControlState;
  291. infoMsgS.datMsgUBA[1] = 0xFF;
  292. infoMsgS.datMsgUBA[2] = 0xFF;
  293. infoMsgS.datMsgUBA[3] = 0xFF;
  294. infoMsgS.datMsgUBA[4] = (uint8)(Control_Times >> 24);
  295. infoMsgS.datMsgUBA[5] = (uint8)(Control_Times >> 16);
  296. infoMsgS.datMsgUBA[6] = (uint8)(Control_Times >> 8);
  297. infoMsgS.datMsgUBA[7] = (uint8)(Control_Times);
  298. MCANDrv_SendMsg(infoMsgS);
  299. break;
  300. default:
  301. break;
  302. }
  303. CANNet_idxSchedUB = (uint16)((CANNet_idxSchedUB + 1) % 100); // 100ms一个完整循环
  304. #endif
  305. }