CANNet.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. uint16 CANNet_idxSchedUB;
  20. MCANDrv_infoMsgConfS_TYPE CANNet_InfoRxMsgConfSA[128];
  21. uint8 CANNet_datRxMsgBufM[128][9];
  22. uint32 CanRecvTest = 0;
  23. uint32 CanRecvTestDelay = 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. /*接收报文初始化*/
  36. // CANNet_InfoRxMsgConfSA[0].infoMsgIDUI = 0x1F000023UL;
  37. // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.CAN = 0;
  38. // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.MO = 0;
  39. // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.DIR = _MCAN_DIR_RX;
  40. // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.DLC = 8;
  41. // CANNet_InfoRxMsgConfSA[0].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  42. // MCANDrv_SetMsgObj(CANNet_InfoRxMsgConfSA[0], CANNet_RecvMsgCAN0);
  43. /*发送报文初始化*/
  44. CANNet_infoMsgTxConfSA[0].infoMsgIDUI = 0x1F000024UL;
  45. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.CAN = 0;
  46. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.MO = 0;
  47. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.DIR = _MCAN_DIR_TX;
  48. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.DLC = 8;
  49. CANNet_infoMsgTxConfSA[0].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  50. //MCANDrv_SetMsgObj(CANNet_infoMsgTxConfSA[0], NULL_PTR);
  51. CANNet_infoMsgTxConfSA[1].infoMsgIDUI = 0x1F000025UL;
  52. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.CAN = 1;
  53. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.MO = 1;
  54. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.DIR = _MCAN_DIR_TX;
  55. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.DLC = 8;
  56. CANNet_infoMsgTxConfSA[1].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  57. //MCANDrv_SetMsgObj(CANNet_infoMsgTxConfSA[1], NULL_PTR);
  58. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x1F000026UL;
  59. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.CAN = 2;
  60. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.MO = 2;
  61. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.DIR = _MCAN_DIR_TX;
  62. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.DLC = 8;
  63. CANNet_infoMsgTxConfSA[2].infoMsgParU.B.IDE = _MCAN_IDE_EXT;
  64. }
  65. //CAN0接收消息处理函数
  66. void CANNet_RecvMsgCAN0(MCANDrv_infoMsgS_TYPE infoMsgS)
  67. {
  68. //CAN接收样例
  69. uint8 idxIncUB,idxByteUB;
  70. for(idxIncUB=0;idxIncUB<128;idxIncUB++)
  71. {
  72. if(infoMsgS.infoConfS.infoMsgIDUI == CANNet_InfoRxMsgConfSA[idxIncUB].infoMsgIDUI)
  73. {
  74. for(idxByteUB=0;idxByteUB<8;idxByteUB++)
  75. {
  76. CANNet_datRxMsgBufM[idxIncUB][idxByteUB]=infoMsgS.datMsgUBA[idxByteUB];
  77. }
  78. CANNet_datRxMsgBufM[idxIncUB][8]++;
  79. }
  80. }
  81. CanRecvTestDelay = SysCon_tiRunHighResiUI;
  82. CanRecvTest = CanRecvTestDelay - CanRecvTest;
  83. }
  84. //CAN1接收消息处理函数
  85. void CANNet_RecvMsgCAN1(MCANDrv_infoMsgS_TYPE infoMsgS)
  86. {
  87. //CAN接收样例
  88. uint8 idxIncUB,idxByteUB;
  89. for(idxIncUB=0;idxIncUB<128;idxIncUB++)
  90. {
  91. if(infoMsgS.infoConfS.infoMsgIDUI == CANNet_InfoRxMsgConfSA[idxIncUB].infoMsgIDUI)
  92. {
  93. for(idxByteUB=0;idxByteUB<8;idxByteUB++)
  94. {
  95. CANNet_datRxMsgBufM[idxIncUB][idxByteUB]=infoMsgS.datMsgUBA[idxByteUB];
  96. }
  97. CANNet_datRxMsgBufM[idxIncUB][8]++;
  98. }
  99. }
  100. }
  101. //发送消息管理
  102. void CANNet_Manage1ms(void)
  103. {
  104. MCANDrv_infoMsgS_TYPE infoMsgS;
  105. switch(CANNet_idxSchedUB)
  106. {
  107. case 0:
  108. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F0;
  109. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  110. infoMsgS.datMsgUBA[0] = (uint8)(PressureValue>>24);
  111. infoMsgS.datMsgUBA[1] = (uint8)(PressureValue>>16);
  112. infoMsgS.datMsgUBA[2] = (uint8)(PressureValue)>>8;
  113. infoMsgS.datMsgUBA[3] = (uint8)(PressureValue);
  114. infoMsgS.datMsgUBA[4] = (uint8)(Distence1>>8);
  115. infoMsgS.datMsgUBA[5] = (uint8)(Distence1);
  116. infoMsgS.datMsgUBA[6] = (uint8)(Distence2>>8);
  117. infoMsgS.datMsgUBA[7] = (uint8)(Distence2);
  118. MCANDrv_SendMsg(infoMsgS);
  119. break;
  120. case 1:
  121. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F1;
  122. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  123. infoMsgS.datMsgUBA[0] = (uint8)(Switch1);
  124. infoMsgS.datMsgUBA[1] = (uint8)(Switch2);
  125. infoMsgS.datMsgUBA[2] = 0xFF;
  126. infoMsgS.datMsgUBA[3] = 0xFF;
  127. infoMsgS.datMsgUBA[4] = 0xFF;
  128. infoMsgS.datMsgUBA[5] = 0xFF;
  129. infoMsgS.datMsgUBA[6] = 0xFF;
  130. infoMsgS.datMsgUBA[7] = 0xFF;
  131. MCANDrv_SendMsg(infoMsgS);
  132. break;
  133. case 2:
  134. CANNet_infoMsgTxConfSA[2].infoMsgIDUI = 0x7F2;
  135. infoMsgS.infoConfS = CANNet_infoMsgTxConfSA[2];
  136. infoMsgS.datMsgUBA[0] = ControlState;
  137. infoMsgS.datMsgUBA[1] = 0xFF;
  138. infoMsgS.datMsgUBA[2] = 0xFF;
  139. infoMsgS.datMsgUBA[3] = 0xFF;
  140. infoMsgS.datMsgUBA[4] = (uint8)(Control_Times>>24);
  141. infoMsgS.datMsgUBA[5] = (uint8)(Control_Times>>16);
  142. infoMsgS.datMsgUBA[6] = (uint8)(Control_Times>>8);
  143. infoMsgS.datMsgUBA[7] = (uint8)(Control_Times);
  144. MCANDrv_SendMsg(infoMsgS);
  145. break;
  146. default:
  147. break;
  148. }
  149. CANNet_idxSchedUB=(uint16)((CANNet_idxSchedUB+1)%100); //100ms一个完整循环
  150. }