drv_can.c 14 KB

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