mapp_can.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. //==================================================================
  2. //
  3. // Filename: mapp_can.c
  4. // Description: CAN2 driver.
  5. //
  6. //------------------------------------------------------------------
  7. //
  8. // version:
  9. // date: 23:54pm, 08.Apr.2012, by Sirius
  10. // Description:
  11. //
  12. //------------------------------------------------------------------
  13. //==================================================================
  14. /*------------------------------------------------------------------------------
  15. * I N C L U D E
  16. *------------------------------------------------------------------------------*/
  17. //#include <string.h>
  18. #include "stm32f0xx.h"
  19. #include "general.h"
  20. #include "main.h"
  21. #include "mapp_ami.h"
  22. #include "mapp_can_honda.h"
  23. #include "mapp_can_audi.h"
  24. #include "mapp_can_fod.h"
  25. #include "mapp_can_fod.h"
  26. #include "mapp_can_Buick.h"
  27. #include "mapp_can_trump.h"
  28. #include "mapp_arm.h"
  29. #include "mapp_ext.h"
  30. #include "mapp_gpio.h"
  31. #include "mapp_key.h"
  32. #include "mapp_msg.h"
  33. #include "mapp_can.h"
  34. #include "app_avm.h"
  35. #include "mapp_pwr.h"
  36. /*------------------------------------------------------------------------------
  37. * D E F I N E
  38. *------------------------------------------------------------------------------*/
  39. /*--- ADC1 DMA base address ---*/
  40. /*------------------------------------------------------------------------------
  41. * S T R U C T
  42. *------------------------------------------------------------------------------*/
  43. /*------------------------------------------------------------------------------
  44. * S T A T I C - V A R I A B L E S
  45. *------------------------------------------------------------------------------*/
  46. static VU16 s_vu16CanTaskTmr = 0;
  47. VU16 s_vu16CanLostTmr = 0;
  48. static VU16 s_vu16Can2RxMem = 0;
  49. static VU16 s_vu16AirDispTmr=0;
  50. /*------------------------------------------------------------------------------
  51. * G L O B A L
  52. *------------------------------------------------------------------------------*/
  53. T_CAN_RXQ gtCanRxBuf = {0}; /* CAN1 receive buffer */
  54. U08 MidFuction=0;
  55. T_CAN_STATE s_tCanState = {CAN_POWER_START};
  56. /*------------------------------------------------------------------------------
  57. * P R O T O T Y P E
  58. *------------------------------------------------------------------------------*/
  59. static void s_CanVariablesInit(void);
  60. static void s_CanDrvTrcvCfg(T_TRCVR_STATE stat);
  61. static void CarTypeJudgeTask(void);
  62. /*----------------------------------------------------------------------
  63. // Function uses : CanCfgInit
  64. // Input parameter :
  65. // Output parameter :
  66. // Use Function : Configuration CAN2 system.
  67. // Reserve date : 11:47am, 25.Jan.2013, written by Sirius
  68. ----------------------------------------------------------------------*/
  69. void CanCfgInit(void)
  70. {
  71. CAN_InitTypeDef CAN_InitStructure;
  72. GPIO_InitTypeDef GPIO_InitStructure;
  73. /* Configure CAN2 **************************************************/
  74. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  75. GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_4);
  76. GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_4);
  77. /* Configure CAN pin: TX */
  78. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;//TXRX
  79. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  80. GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  81. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  82. #ifdef CAN_BUICK_ONLY
  83. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//±ð¿Ë¼ÓÉÏÀ
  84. #else
  85. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  86. #endif
  87. //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//±ð¿Ë¼ÓÉÏÀ­
  88. GPIO_Init(GPIOA, &GPIO_InitStructure);
  89. /* CAN2 Periph clocks enable */
  90. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
  91. /* CAN1 and CAN2 register init */
  92. CAN_DeInit(CAN);
  93. //CAN_DeInit(CAN2);
  94. /* Struct init*/
  95. CAN_StructInit(&CAN_InitStructure);
  96. /* CAN1 and CAN2 cell init */
  97. CAN_InitStructure.CAN_TTCM = DISABLE;
  98. CAN_InitStructure.CAN_ABOM = ENABLE;
  99. CAN_InitStructure.CAN_AWUM = DISABLE;
  100. CAN_InitStructure.CAN_NART = DISABLE;
  101. CAN_InitStructure.CAN_RFLM = DISABLE;
  102. CAN_InitStructure.CAN_TXFP = ENABLE;
  103. CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  104. CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
  105. CAN_InitStructure.CAN_BS1 = CAN_BS1_5tq;
  106. CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;
  107. if((gtCarType.CarType == CARTYPE_AUDI )||(gtCarType.CarType == CARTYPE_FOD)) {
  108. CAN_InitStructure.CAN_Prescaler = 12;
  109. } else if( gtCarType.CarType == CARTYPE_HONDA ) {
  110. CAN_InitStructure.CAN_Prescaler = 48;
  111. } else if( gtCarType.CarType == CARTYPE_BUICK) {
  112. CAN_InitStructure.CAN_Prescaler = 180;
  113. } else if( gtCarType.CarType == CARTYPE_TRUMPCHI) {
  114. CAN_InitStructure.CAN_Prescaler = 48;
  115. } else {
  116. gtCarType.CarType = CARTYPE_AUDI;
  117. CAN_InitStructure.CAN_Prescaler = 12;
  118. }
  119. /*Initializes CAN1 */
  120. CAN_Init(CAN, &CAN_InitStructure);
  121. //if (gtSysCfg.can2Brt == CAN_050K) {
  122. // CAN_InitStructure.CAN_Prescaler = 90; /* 36MHz/[(SWJ+BS1+BS2)*Prescaler]=50Kbps */
  123. //} else if (gtSysCfg.can2Brt == CAN_100K) {
  124. // CAN_InitStructure.CAN_Prescaler = 45; /* 36MHz/[(SWJ+BS1+BS2)*Prescaler]=100Kbps */
  125. //} else if (gtSysCfg.can2Brt == CAN_125K) {
  126. // CAN_InitStructure.CAN_Prescaler = 36; /* 36MHz/[(SWJ+BS1+BS2)*Prescaler]=125Kbps */
  127. //} else if (gtSysCfg.can2Brt == CAN_250K) {
  128. // CAN_InitStructure.CAN_Prescaler = 18; /* 36MHz/[(SWJ+BS1+BS2)*Prescaler]=250Kbps */
  129. //} else if (gtSysCfg.can2Brt == CAN_500K) {
  130. // CAN_InitStructure.CAN_Prescaler = 9; /* 36MHz/[(SWJ+BS1+BS2)*Prescaler]=500Kbps */
  131. //} else {
  132. // CAN_InitStructure.CAN_Prescaler = 9; /* 36MHz/[(SWJ+BS1+BS2)*Prescaler]=500Kbps */
  133. //}
  134. /*Initializes CAN2 */
  135. //CAN_Init(CAN2, &CAN_InitStructure);
  136. /* CAN1 filter init */
  137. CanHondaFilterInit();
  138. /* IT Configuration for CAN1 */
  139. CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);
  140. }
  141. /*----------------------------------------------------------------------
  142. // Function uses : CanTask
  143. // Input parameter :
  144. // Output parameter :
  145. // Use Function : CAN BUS main task.
  146. // Reserve date : 11:31am, 29.Jan.2013, written by Sirius
  147. ----------------------------------------------------------------------*/
  148. void CanTask(void)
  149. {
  150. switch (s_tCanState) {
  151. case CAN_POWER_START:
  152. //------------------------------------------------------------------
  153. // Wait about 100ms for system hardware stable.
  154. // 09:17am, 30.Aug.2012, modified by Sirius
  155. //------------------------------------------------------------------
  156. s_vu16CanTaskTmr = 0;//OS_TIMER_200MS
  157. s_tCanState++;
  158. break;
  159. case CAN_TRCVR_INIT:
  160. if (s_vu16CanTaskTmr) {
  161. break;
  162. }
  163. s_CanVariablesInit();
  164. s_vu16CanTaskTmr = 0;
  165. s_tCanState++;
  166. break;
  167. case CAN_LAYER_INIT:
  168. if (s_vu16CanTaskTmr) {
  169. break;
  170. }
  171. //------------------------------------------------------------------
  172. // Init can controller.
  173. // 10:09am, 30.Aug.2012, modified by Sirius
  174. //------------------------------------------------------------------
  175. CanCfgInit();
  176. s_CanDrvTrcvCfg(TRCVR_INIT);
  177. s_tCanState++;
  178. break;
  179. case CAN_WAKE_UP:
  180. if (s_vu16CanTaskTmr) {
  181. break;
  182. }
  183. CAN_WakeUp(CAN);
  184. s_vu16CanTaskTmr = OS_TIMER_500MS;
  185. s_tCanState++;
  186. break;
  187. case CAN_STATE_RUN:
  188. if( s_vu16CanTaskTmr ) {
  189. return;
  190. }
  191. break;
  192. case CAN_STATE_SLEEP:
  193. if (s_vu16CanTaskTmr) {
  194. break;
  195. }
  196. s_CanDrvTrcvCfg(TRCVR_OFF);
  197. break;
  198. default:
  199. break;
  200. }
  201. }
  202. /*----------------------------------------------------------------------
  203. // Function uses : CanTaskTmr
  204. // Input parameter :
  205. // Output parameter :
  206. // Use Function :
  207. // Reserve date : 09:11am, 30.Aug.2012, written by Sirius
  208. ----------------------------------------------------------------------*/
  209. void CanTaskTmr(void)
  210. {
  211. if (s_vu16CanTaskTmr) { s_vu16CanTaskTmr--; }
  212. if (s_vu16CanLostTmr != 0xffff) {s_vu16CanLostTmr++; }
  213. CanFodTaskTmr();
  214. }
  215. /*----------------------------------------------------------------------
  216. // Function uses : CanTaskState
  217. // Input parameter :
  218. // Output parameter :
  219. // Use Function :
  220. // Reserve date : 13:52pm, 25.Dec.2012, written by Sirius
  221. ----------------------------------------------------------------------*/
  222. T_CAN_STATE CanTaskState(void)
  223. {
  224. return (s_tCanState);
  225. }
  226. /*----------------------------------------------------------------------
  227. // Function uses : CanBusSleep
  228. // Input parameter :
  229. // Output parameter :
  230. // Use Function : can bus go into sleep mode.
  231. // Reserve date : 12:22pm, 29.Jan.2013, written by Sirius
  232. ----------------------------------------------------------------------*/
  233. void CanBusSleep(void)
  234. {
  235. //CAN_Sleep(CAN1);
  236. //CAN_Sleep(CAN2);
  237. // s_CanDrvTrcvCfg(TRCVR_WATOFF);
  238. // s_tCanState = CAN_STATE_SLEEP;
  239. }
  240. /*----------------------------------------------------------------------
  241. // Function uses : CanBusRunState
  242. // Input parameter :
  243. // Output parameter :
  244. // Use Function : can bus go into sleep mode.
  245. // Reserve date : 12:22pm, 29.Jan.2013, written by Sirius
  246. ----------------------------------------------------------------------*/
  247. U08 CanBusRunState(void)
  248. {
  249. // if(CAN_STATE_RUN == s_tCanState) {
  250. // return 1;
  251. // } else {
  252. // return 0;
  253. // }
  254. }
  255. /*----------------------------------------------------------------------
  256. // Function uses : CanBusWakeup
  257. // Input parameter :
  258. // Output parameter :
  259. // Use Function : can bus ready to wake up.
  260. // Reserve date : 12:22pm, 29.Jan.2013, written by Sirius
  261. ----------------------------------------------------------------------*/
  262. void CanBusWakeup(void)
  263. {
  264. // s_CanVariablesInit();
  265. // s_CanDrvTrcvCfg(TRCVR_INIT);
  266. // s_tCanState = CAN_WAKE_UP;
  267. // s_vu16CanTaskTmr = OS_TIMER_100MS; /* Wait 100ms for TRCV stable */
  268. }
  269. /*----------------------------------------------------------------------
  270. // Function name : Judge CAN system go into sleep.
  271. // Input parameter :
  272. // Output parameter :
  273. // Use Function :
  274. // Reserve date : 10:10am, 31.May.2013, written by Charlie
  275. ----------------------------------------------------------------------*/
  276. BOOL CanBusActive(void)
  277. {
  278. return (s_vu16CanLostTmr < OS_TIMER_3S);
  279. }
  280. //----------------------------------------------------------------------------
  281. void CanVariablesInit(void)
  282. {
  283. s_vu16CanTaskTmr = 0;
  284. // s_tCanState = CAN_POWER_START;
  285. }
  286. /*----------------------------------------------------------------------
  287. // Function uses : s_CanVariablesInit
  288. // Input parameter :
  289. // Output parameter :
  290. // Use Function :
  291. // Reserve date : 09:30am, 30.Aug.2012, written by Sirius
  292. ----------------------------------------------------------------------*/
  293. static void s_CanVariablesInit(void)
  294. {
  295. //gtCanRxBuf.enque = 0;
  296. //gtCanRxBuf.deque = 0;
  297. //MEMSET(&gtCanRxBuf, 0 , sizeof(T_CAN_RXQ));
  298. }
  299. /*----------------------------------------------------------------------
  300. // Function uses : s_CanDrvTrcvCfg
  301. // Input parameter : Transceiver TJA1040 standby control.
  302. // Output parameter :
  303. // Use Function :
  304. // Reserve date : 10:36am, 29.Jan.2013, written by Sirius
  305. ----------------------------------------------------------------------*/
  306. static void s_CanDrvTrcvCfg(T_TRCVR_STATE stat)
  307. {
  308. /* switch (stat) {
  309. case TRCVR_INIT:
  310. case TRCVR_ON:
  311. default:
  312. GpioTrcv1040StandbyCfg(RESET);
  313. break;
  314. case TRCVR_OFF:
  315. GpioTrcv1040StandbyCfg(SET);
  316. GpioTrcv28056StandbyCfg(RESET);
  317. GpioTrcv28056EnableCfg(RESET);
  318. break;
  319. case TRCVR_WATOFF:
  320. GpioTrcv1040StandbyCfg(SET);
  321. break;
  322. }*/
  323. }
  324. /*----------------------------------------------------------------------
  325. // Function uses : s_CanMsgAnalyse
  326. // Input parameter :
  327. // Output parameter :
  328. // Use Function : deque can message received from other node.
  329. // Reserve date : 14:11pm, 29.Jan.2013, written by Sirius
  330. ----------------------------------------------------------------------*/
  331. void CanMsgAnalyseTask(void)
  332. {
  333. U32 frmid = 0; /* CAN frame ID */
  334. if (CAN_STATE_RUN != s_tCanState) {
  335. return;
  336. }
  337. //------------------------------------------------------------------
  338. // CAN1 data received & processed.
  339. // 14:51pm, 29.Jan.2013, modified by Sirius
  340. //------------------------------------------------------------------
  341. while(gtCanRxBuf.enque != gtCanRxBuf.deque) {
  342. gtPwrCfg.CanLostTmr = 0;
  343. if(gtCanRxBuf.msgQ[gtCanRxBuf.deque].IDE)
  344. {
  345. frmid=gtCanRxBuf.msgQ[gtCanRxBuf.deque].ExtId;
  346. }
  347. else
  348. {
  349. frmid=gtCanRxBuf.msgQ[gtCanRxBuf.deque].StdId;
  350. }
  351. CanHondaMsgAnalyseTask(frmid);
  352. gtCanRxBuf.deque++;
  353. if (gtCanRxBuf.deque >= CAN_RX_MSG_CNT) {
  354. gtCanRxBuf.deque = 0;
  355. }
  356. }
  357. }
  358. /*------------------------------- E O F ----------------------------------------*/