drv_can.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. #include "common.h"
  2. #include "drv_can.h"
  3. #include "drv_io.h"
  4. extern uint8_t work_normal;
  5. //********************************************************CAN-START**********************************************************
  6. static uint8_t can_rx_ctr_self_buf[CAN_RX_BUF_MAX];
  7. static uint8_t can_rx_ctr_bro_buf[CAN_RX_CTR_BRO_BUF_MAX];
  8. static uint8_t can_rx_test_bro_buf[CAN_RX_TEST_BRO_BUF_MAX];
  9. can_parameter_struct can_parameter;
  10. can_filter_parameter_struct can_filter;
  11. #define CAN_BAUDRATE 250
  12. uint32_t filter_ctr_self_id = (CTR_ID << 10)|(SELF_ID << 3)|CAN_FF_EXTENDED|CAN_FT_DATA;
  13. uint32_t filter_ctr_bro_id = (CTR_ID << 10)|(BROCAST_ID << 3)|CAN_FF_EXTENDED|CAN_FT_DATA;
  14. #ifdef CONFIG_CAN_IAP
  15. uint32_t filter_test_bro_id = (PRINTF_TER_ID << 10)|(SELF_ID << 3)|CAN_FF_EXTENDED|CAN_FT_DATA;
  16. #else
  17. uint32_t filter_test_bro_id = (PRINTF_TER_ID << 10)|(BROCAST_ID << 3)|CAN_FF_EXTENDED|CAN_FT_DATA;
  18. #endif
  19. CAN_FRAME can_ctr_self;
  20. CAN_FRAME can_ctr_bro;
  21. CAN_FRAME can_test_bro;
  22. static shark_can_frame_t shark_can_tx_queue[200];
  23. static shark_u8 shark_can_tx_head;
  24. static shark_u8 shark_can_tx_tail;
  25. static shark_u16 shark_can_tx_err;
  26. static shark_bool shark_can_tx_frame(shark_can_frame_t *frame)
  27. {
  28. u8 mailbox;
  29. if (CAN_TSTAT_TME0 == (CAN_TSTAT(CAN0) & CAN_TSTAT_TME0)) {
  30. mailbox = CAN_MAILBOX0;
  31. } else if (CAN_TSTAT_TME1 == (CAN_TSTAT(CAN0) & CAN_TSTAT_TME1)) {
  32. mailbox = CAN_MAILBOX1;
  33. } else if (CAN_TSTAT_TME2 == (CAN_TSTAT(CAN0) & CAN_TSTAT_TME2)) {
  34. mailbox = CAN_MAILBOX2;
  35. } else {
  36. if (shark_can_tx_err < 20000) {
  37. shark_can_tx_err++;
  38. } else {
  39. shark_can_tx_err = 0;
  40. Can_Power_Enable(0);
  41. can_deinit(CAN0);
  42. CAN_Config_HW();
  43. Can_Power_Enable(1);
  44. }
  45. return shark_false;
  46. }
  47. shark_can_tx_err = 0;
  48. CAN_TMDATA0(CAN0, mailbox) = frame->values[0];
  49. CAN_TMDATA1(CAN0, mailbox) = frame->values[1];
  50. CAN_TMP(CAN0, mailbox) &= ~CAN_TMP_DLENC;
  51. CAN_TMP(CAN0, mailbox) |= frame->efid.length + 1;
  52. CAN_TMI(CAN0, mailbox) = frame->efid.value << 3 | CAN_FF_EXTENDED | CAN_FT_DATA | CAN_TMI_TEN;
  53. return shark_true;
  54. }
  55. void shark_can_tx_flush(void)
  56. {
  57. while (shark_can_tx_head != shark_can_tx_tail && shark_can_tx_frame(shark_can_tx_queue + shark_can_tx_head)) {
  58. shark_can_tx_head = (shark_can_tx_head + 1) % NELEM(shark_can_tx_queue);
  59. }
  60. }
  61. shark_bool shark_can_send_frame(shark_can_efid_t efid, const void *buff, u8 length)
  62. {
  63. u8 tail = (shark_can_tx_tail + 1) % NELEM(shark_can_tx_queue);
  64. shark_can_frame_t *frame;
  65. if (tail == shark_can_tx_head || work_normal == 0) {
  66. return shark_false;
  67. }
  68. frame = shark_can_tx_queue + shark_can_tx_tail;
  69. memcpy(frame->data, buff, length);
  70. frame->efid.value = efid.value;
  71. if (shark_can_tx_tail == shark_can_tx_head && shark_can_tx_frame(frame)) {
  72. return shark_true;
  73. }
  74. shark_can_tx_tail = tail;
  75. return shark_true;
  76. }
  77. shark_bool shark_can_send(u8 dest, u8 src, u8 type, const u8 *buff, u16 length)
  78. {
  79. shark_can_efid_t efid;
  80. u8 index = 1;
  81. efid.dest = dest;
  82. efid.src = src;
  83. efid.type = type;
  84. efid.priority = 6;
  85. efid.total = (length + 7) / 8;
  86. while (length > 0) {
  87. u8 wrlen = length > 8 ? 8 : length;
  88. efid.index = index;
  89. efid.length = wrlen - 1;
  90. if (shark_can_send_frame(efid, buff, wrlen)) {
  91. length -= wrlen;
  92. buff += wrlen;
  93. index++;
  94. } else {
  95. return shark_false;
  96. }
  97. }
  98. return shark_true;
  99. }
  100. void Can_Stop_Send(void)
  101. {
  102. shark_can_tx_head = shark_can_tx_tail = 0;
  103. }
  104. int8_t Send_Data_Can(CAN_FRAME*app_can_frame,uint8_t from)
  105. {
  106. return shark_can_send(app_can_frame->head.dest, app_can_frame->head.sour, app_can_frame->head.rsp, app_can_frame->data, app_can_frame->len);
  107. }
  108. void Check_Can_Poll(void)
  109. {
  110. if(work_normal)
  111. {
  112. if(can_error_get(CAN0) != CAN_ERROR_NONE)
  113. {
  114. Can_Power_Enable(0);
  115. can_deinit(CAN0);
  116. CAN_Config_HW();
  117. Can_Power_Enable(1);
  118. }
  119. }
  120. }
  121. static void Reset_Can_Rx_Buffer(CAN_FRAME*can_frame)
  122. {
  123. if(can_frame == NULL)
  124. return;
  125. memset(&can_frame->head,0x00,sizeof(can_frame->head));
  126. can_frame->len = 0;
  127. }
  128. uint16_t Get_Data_Can(CAN_FRAME*app_can_frame)
  129. {
  130. CAN_FRAME* cf_temp = NULL;
  131. if(app_can_frame == NULL)
  132. return 0;
  133. if(get_index_total_value(can_ctr_self.head.index) != 0 && can_ctr_self.head.index == can_ctr_self.head.total&&can_ctr_self.len)
  134. cf_temp = &can_ctr_self;
  135. else if(get_index_total_value(can_ctr_bro.head.index) != 0 && can_ctr_bro.head.index == can_ctr_bro.head.total&&can_ctr_bro.len)
  136. cf_temp = &can_ctr_bro;
  137. else if(get_index_total_value(can_test_bro.head.index) != 0 && can_test_bro.head.index == can_test_bro.head.total&&can_test_bro.len)
  138. cf_temp = &can_test_bro;
  139. if(cf_temp == NULL)
  140. return 0;
  141. memcpy(&app_can_frame->head,&cf_temp->head,sizeof(cf_temp->head));
  142. memcpy(app_can_frame->data,cf_temp->data,cf_temp->len);
  143. app_can_frame->len = cf_temp->len;
  144. Reset_Can_Rx_Buffer(cf_temp);
  145. return app_can_frame->len;
  146. }
  147. static void Can_NVIC_Config(void)
  148. {
  149. nvic_irq_enable(USBD_HP_CAN0_TX_IRQn,3,0);
  150. nvic_irq_enable(USBD_LP_CAN0_RX0_IRQn,3,0);
  151. }
  152. /**
  153. * @brief Configures the CAN.
  154. * @param None
  155. * @retval None
  156. */
  157. void CAN_Config_HW(void)
  158. {
  159. /* enable CAN clock */
  160. rcu_periph_clock_enable(RCU_CAN0);
  161. rcu_periph_clock_enable(RCU_GPIOB);
  162. rcu_periph_clock_enable(RCU_AF);
  163. /* configure CAN0 GPIO */
  164. gpio_init(GPIOB,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_8);
  165. gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_9);
  166. gpio_pin_remap_config(GPIO_CAN_PARTIAL_REMAP,ENABLE);
  167. rcu_periph_clock_enable(RCU_GPIOA);
  168. gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_7);
  169. Silent_Enable(0);
  170. can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
  171. can_struct_para_init(CAN_INIT_STRUCT, &can_filter);
  172. /* initialize CAN register */
  173. can_deinit(CAN0);
  174. /* initialize CAN parameters */
  175. can_parameter.time_triggered = DISABLE;
  176. can_parameter.auto_bus_off_recovery = DISABLE;
  177. can_parameter.auto_wake_up = DISABLE;
  178. can_parameter.auto_retrans = DISABLE;
  179. can_parameter.rec_fifo_overwrite = DISABLE;
  180. can_parameter.trans_fifo_order = ENABLE;
  181. can_parameter.working_mode = CAN_NORMAL_MODE;
  182. can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
  183. can_parameter.time_segment_1 = CAN_BT_BS1_5TQ;
  184. can_parameter.time_segment_2 = CAN_BT_BS2_3TQ;
  185. /* 1MBps */
  186. #if CAN_BAUDRATE == 1000
  187. can_parameter.prescaler = 6;
  188. /* 500KBps */
  189. #elif CAN_BAUDRATE == 500
  190. can_parameter.prescaler = 12;
  191. /* 250KBps */
  192. #elif CAN_BAUDRATE == 250
  193. can_parameter.prescaler = 24;
  194. /* 125KBps */
  195. #elif CAN_BAUDRATE == 125
  196. can_parameter.prescaler = 48;
  197. /* 100KBps */
  198. #elif CAN_BAUDRATE == 100
  199. can_parameter.prescaler = 60;
  200. /* 50KBps */
  201. #elif CAN_BAUDRATE == 50
  202. can_parameter.prescaler = 120;
  203. /* 20KBps */
  204. #elif CAN_BAUDRATE == 20
  205. can_parameter.prescaler = 300;
  206. #else
  207. #error "please select list can baudrate in private defines in drv_can.c "
  208. #endif
  209. /* initialize CAN */
  210. can_init(CAN0, &can_parameter);
  211. /* initialize filter */
  212. can_filter.filter_number=0;
  213. can_filter.filter_mode = CAN_FILTERMODE_MASK;
  214. can_filter.filter_bits = CAN_FILTERBITS_32BIT;
  215. #if 1
  216. can_filter.filter_list_high = (uint16_t)(filter_ctr_self_id >> 16);
  217. can_filter.filter_list_low = (uint16_t)(filter_ctr_self_id >> 0);
  218. can_filter.filter_mask_high = 0x0001;
  219. can_filter.filter_mask_low = 0xFFFF;
  220. #else
  221. can_filter.filter_list_high = 0x0000;
  222. can_filter.filter_list_low = 0x0000;
  223. can_filter.filter_mask_high = 0x0000;
  224. can_filter.filter_mask_low = 0x0000;
  225. #endif
  226. can_filter.filter_fifo_number = CAN_FIFO0;
  227. can_filter.filter_enable = ENABLE;
  228. can_filter_init(&can_filter);
  229. /* CAN1 filter number */
  230. #if 1
  231. can_filter.filter_number = 1;
  232. can_filter.filter_list_high = (uint16_t)(filter_ctr_bro_id >> 16);
  233. can_filter.filter_list_low = (uint16_t)(filter_ctr_bro_id >> 0);
  234. can_filter_init(&can_filter);
  235. can_filter.filter_number = 2;
  236. can_filter.filter_list_high = (uint16_t)(filter_test_bro_id >> 16);
  237. can_filter.filter_list_low = (uint16_t)(filter_test_bro_id >> 0);
  238. can_filter_init(&can_filter);
  239. #endif
  240. Can_NVIC_Config();
  241. can_interrupt_enable(CAN0, CAN_INT_RFNE0);
  242. }
  243. /**
  244. * @brief Configures the CAN.
  245. * @param None
  246. * @retval None
  247. */
  248. void CAN_Config(void)
  249. {
  250. memcpy(&can_ctr_self.head,&filter_ctr_self_id,sizeof(filter_ctr_self_id));
  251. memcpy(&can_ctr_bro.head,&filter_ctr_bro_id,sizeof(filter_ctr_bro_id));
  252. memcpy(&can_test_bro.head,&filter_test_bro_id,sizeof(filter_test_bro_id));
  253. can_ctr_self.data = can_rx_ctr_self_buf;
  254. can_ctr_bro.data = can_rx_ctr_bro_buf;
  255. can_test_bro.data = can_rx_test_bro_buf;
  256. /* enable CAN clock */
  257. rcu_periph_clock_enable(RCU_CAN0);
  258. rcu_periph_clock_enable(RCU_GPIOB);
  259. rcu_periph_clock_enable(RCU_AF);
  260. /* configure CAN0 GPIO */
  261. gpio_init(GPIOB,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_8);
  262. gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_9);
  263. gpio_pin_remap_config(GPIO_CAN_PARTIAL_REMAP,ENABLE);
  264. rcu_periph_clock_enable(RCU_GPIOA);
  265. gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_7);
  266. //Silent_Enable(1);
  267. Silent_Enable(0);
  268. can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
  269. can_struct_para_init(CAN_INIT_STRUCT, &can_filter);
  270. /* initialize CAN register */
  271. can_deinit(CAN0);
  272. /* initialize CAN parameters */
  273. can_parameter.time_triggered = DISABLE;
  274. can_parameter.auto_bus_off_recovery = DISABLE;
  275. can_parameter.auto_wake_up = DISABLE;
  276. can_parameter.auto_retrans = DISABLE;
  277. can_parameter.rec_fifo_overwrite = DISABLE;
  278. can_parameter.trans_fifo_order = ENABLE;
  279. can_parameter.working_mode = CAN_NORMAL_MODE;
  280. can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
  281. can_parameter.time_segment_1 = CAN_BT_BS1_5TQ;
  282. can_parameter.time_segment_2 = CAN_BT_BS2_3TQ;
  283. /* 1MBps */
  284. #if CAN_BAUDRATE == 1000
  285. can_parameter.prescaler = 6;
  286. /* 500KBps */
  287. #elif CAN_BAUDRATE == 500
  288. can_parameter.prescaler = 12;
  289. /* 250KBps */
  290. #elif CAN_BAUDRATE == 250
  291. can_parameter.prescaler = 24;
  292. /* 125KBps */
  293. #elif CAN_BAUDRATE == 125
  294. can_parameter.prescaler = 48;
  295. /* 100KBps */
  296. #elif CAN_BAUDRATE == 100
  297. can_parameter.prescaler = 60;
  298. /* 50KBps */
  299. #elif CAN_BAUDRATE == 50
  300. can_parameter.prescaler = 120;
  301. /* 20KBps */
  302. #elif CAN_BAUDRATE == 20
  303. can_parameter.prescaler = 300;
  304. #else
  305. #error "please select list can baudrate in private defines in drv_can.c "
  306. #endif
  307. /* initialize CAN */
  308. can_init(CAN0, &can_parameter);
  309. /* initialize filter */
  310. can_filter.filter_number=0;
  311. can_filter.filter_mode = CAN_FILTERMODE_MASK;
  312. can_filter.filter_bits = CAN_FILTERBITS_32BIT;
  313. #if 1
  314. can_filter.filter_list_high = (uint16_t)(filter_ctr_self_id >> 16);
  315. can_filter.filter_list_low = (uint16_t)(filter_ctr_self_id >> 0);
  316. can_filter.filter_mask_high = 0x0001;
  317. can_filter.filter_mask_low = 0xFFFF;
  318. #else
  319. can_filter.filter_list_high = 0x0000;
  320. can_filter.filter_list_low = 0x0000;
  321. can_filter.filter_mask_high = 0x0000;
  322. can_filter.filter_mask_low = 0x0000;
  323. #endif
  324. can_filter.filter_fifo_number = CAN_FIFO0;
  325. can_filter.filter_enable = ENABLE;
  326. can_filter_init(&can_filter);
  327. /* CAN1 filter number */
  328. #if 1
  329. can_filter.filter_number = 1;
  330. can_filter.filter_list_high = (uint16_t)(filter_ctr_bro_id >> 16);
  331. can_filter.filter_list_low = (uint16_t)(filter_ctr_bro_id >> 0);
  332. can_filter_init(&can_filter);
  333. can_filter.filter_number = 2;
  334. can_filter.filter_list_high = (uint16_t)(filter_test_bro_id >> 16);
  335. can_filter.filter_list_low = (uint16_t)(filter_test_bro_id >> 0);
  336. can_filter_init(&can_filter);
  337. #endif
  338. Can_NVIC_Config();
  339. can_interrupt_enable(CAN0, CAN_INT_RFNE0);
  340. }
  341. void USBD_LP_CAN0_RX0_IRQHandler(void)
  342. {
  343. can_receive_message_struct Rxmessage;
  344. CAN_FRAME* cf_temp;
  345. uint32_t head,buf_max;
  346. can_message_receive(CAN0, CAN_FIFO0, &Rxmessage);
  347. switch(Rxmessage.rx_fi)
  348. {
  349. case 0:
  350. cf_temp = &can_ctr_self;
  351. buf_max = sizeof(can_rx_ctr_self_buf);
  352. break;
  353. case 1:
  354. cf_temp = &can_ctr_bro;
  355. buf_max = sizeof(can_rx_ctr_bro_buf);
  356. break;
  357. case 2:
  358. cf_temp = &can_test_bro;
  359. buf_max = sizeof(can_rx_test_bro_buf);
  360. break;
  361. default:return;
  362. }
  363. head = (Rxmessage.rx_efid << 3)|(Rxmessage.rx_ff)|(Rxmessage.rx_ft);
  364. memcpy(&cf_temp->head,&head,sizeof(head));
  365. if(get_index_total_value(cf_temp->head.index) > get_index_total_value(cf_temp->head.total))
  366. return;
  367. head = get_index_total_value(cf_temp->head.total)*8UL;
  368. if(head > buf_max)
  369. return;
  370. head = get_index_total_value(cf_temp->head.index) - 1;
  371. memcpy(&cf_temp->data[head<<3],Rxmessage.rx_data,Rxmessage.rx_dlen);
  372. if(get_index_total_value(cf_temp->head.index) == get_index_total_value(cf_temp->head.total))
  373. {
  374. cf_temp->len = (head << 3) + Rxmessage.rx_dlen;
  375. //g_event |= EVENT_CAN_RECEIVE_FINISH;
  376. }
  377. }
  378. static u8 shark_can_log_buff[8];
  379. static u8 shark_can_log_length;
  380. //
  381. //ÓÃÓÚϵͳµ÷ÓÃprintf
  382. //
  383. int fputc(int ch, FILE *f)
  384. {
  385. if (ch == '\n') {
  386. if (shark_can_log_length > 0) {
  387. shark_can_send(0x72, 0x42, 3, shark_can_log_buff, shark_can_log_length);
  388. shark_can_log_length = 0;
  389. }
  390. } else if (shark_can_log_length < sizeof(shark_can_log_buff)) {
  391. shark_can_log_buff[shark_can_log_length] = ch;
  392. shark_can_log_length++;
  393. } else {
  394. shark_can_send(0x70, 0x42, 3, shark_can_log_buff, shark_can_log_length);
  395. shark_can_log_buff[0] = ch;
  396. shark_can_log_length = 1;
  397. }
  398. return ch;
  399. }
  400. //********************************************************CAN-END**********************************************************