drv_can.c 14 KB

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