drv_can_v2.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. /*
  2. * Copyright (c) 2006-2024, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-08-30 shelton first version
  9. */
  10. #include "drv_can_v2.h"
  11. #include "drv_config.h"
  12. #ifdef BSP_USING_CAN_V2
  13. #define LOG_TAG "drv_can"
  14. #include <drv_log.h>
  15. #ifdef RT_CAN_USING_CANFD
  16. static const uint8_t dlc_to_bytes[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64};
  17. #endif
  18. #ifdef SOC_SERIES_AT32M412
  19. /* attention !!! baud calculation example: apbclk / ((bs1 + bs2) * bittime_div), ep: 180 / ((45 + 135) * 1) = 1MHz*/
  20. /* attention !!! default apbclk 180 mhz */
  21. static const struct at32_baud_rate can_baud_rate_tab[] =
  22. {
  23. {CAN1MBaud, 1 , 45, 135, 45},
  24. {CAN800kBaud, 1 , 45, 180, 45},
  25. {CAN500kBaud, 1 , 90, 270, 90},
  26. {CAN250kBaud, 2 , 90, 270, 90},
  27. {CAN125kBaud, 3 , 120, 360, 120},
  28. {CAN100kBaud, 5 , 90, 270, 90},
  29. {CAN50kBaud, 9 , 100, 300, 100},
  30. {CAN20kBaud, 18, 125, 375, 125},
  31. {CAN10kBaud, 30, 120, 480, 120},
  32. };
  33. #endif
  34. #ifdef SOC_SERIES_AT32M416
  35. /* attention !!! baud calculation example: apbclk / ((bs1 + bs2) * bittime_div), ep: 180 / ((45 + 135) * 1) = 1MHz*/
  36. /* attention !!! default apbclk 180 mhz */
  37. static const struct at32_baud_rate can_baud_rate_tab[] =
  38. {
  39. {CAN1MBaud, 1 , 45, 135, 45},
  40. {CAN800kBaud, 1 , 45, 180, 45},
  41. {CAN500kBaud, 1 , 90, 270, 90},
  42. {CAN250kBaud, 2 , 90, 270, 90},
  43. {CAN125kBaud, 3 , 120, 360, 120},
  44. {CAN100kBaud, 5 , 90, 270, 90},
  45. {CAN50kBaud, 9 , 100, 300, 100},
  46. {CAN20kBaud, 18, 125, 375, 125},
  47. {CAN10kBaud, 30, 120, 480, 120},
  48. };
  49. #ifdef RT_CAN_USING_CANFD
  50. /* attention !!! baud calculation example: apbclk / ((bs1 + bs2) * bittime_div), ep: 180 / ((45 + 135) * 1) = 1MHz*/
  51. /* attention !!! default apbclk 180 mhz, ssoffset default value is 'seg1 + 1', baud_rate_fd.div must equal to baud_rate.div */
  52. static const struct at32_baud_rate_fd canfd_baud_rate_tab[] =
  53. {
  54. {CANFD_DATA_1MBaud, 1 , 45, 135, 45, 136},
  55. {CANFD_DATA_2MBaud, 1 , 18, 72, 18, 73},
  56. {CANFD_DATA_3MBaud, 1 , 15, 45, 15, 46},
  57. {CANFD_DATA_4MBaud, 1 , 9, 36, 9, 37},
  58. {CANFD_DATA_5MBaud, 1 , 9, 27, 9, 28},
  59. {CANFD_DATA_6MBaud, 1 , 6, 24, 6, 25},
  60. };
  61. #endif
  62. #endif
  63. enum {
  64. #ifdef BSP_USING_CAN1
  65. CAN1_INDEX,
  66. #endif
  67. #ifdef BSP_USING_CAN2
  68. CAN2_INDEX,
  69. #endif
  70. #ifdef BSP_USING_CAN3
  71. CAN3_INDEX,
  72. #endif
  73. };
  74. static struct at32_can can_config[] = {
  75. #ifdef BSP_USING_CAN1
  76. CAN1_CONFIG,
  77. #endif
  78. #ifdef BSP_USING_CAN2
  79. CAN2_CONFIG,
  80. #endif
  81. #ifdef BSP_USING_CAN3
  82. CAN3_CONFIG,
  83. #endif
  84. };
  85. static rt_uint32_t get_can_baud_index(rt_uint32_t baud)
  86. {
  87. rt_uint32_t len, index;
  88. len = sizeof(can_baud_rate_tab) / sizeof(can_baud_rate_tab[0]);
  89. for (index = 0; index < len; index++)
  90. {
  91. if (can_baud_rate_tab[index].baud_rate == baud)
  92. return index;
  93. }
  94. /* default baud is CAN1MBaud */
  95. return 0;
  96. }
  97. #ifdef RT_CAN_USING_CANFD
  98. static rt_uint32_t get_canfd_baud_index(rt_uint32_t baud)
  99. {
  100. rt_uint32_t len, index;
  101. len = sizeof(canfd_baud_rate_tab) / sizeof(canfd_baud_rate_tab[0]);
  102. for (index = 0; index < len; index++)
  103. {
  104. if (canfd_baud_rate_tab[index].baud_rate == baud)
  105. return index;
  106. }
  107. /* default baud is CAN1MBaud */
  108. return 0;
  109. }
  110. #endif
  111. static rt_err_t _can_config(struct rt_can_device *can, struct can_configure *cfg)
  112. {
  113. rt_uint32_t baud_index;
  114. can_mode_type can_mode;
  115. can_transmit_status_type statues;
  116. RT_ASSERT(can);
  117. RT_ASSERT(cfg);
  118. struct at32_can *can_instance = rt_container_of(can, struct at32_can, device);
  119. RT_ASSERT(can_instance);
  120. at32_msp_can_init((void *)can_instance->can_x);
  121. /* config can baudrate */
  122. do {
  123. can_transmit_status_get(can_instance->can_x, &statues);
  124. }
  125. while((statues.current_tstat != CAN_TSTAT_IDLE) || (can_stb_status_get(can_instance->can_x) != CAN_STB_STATUS_EMPTY) || \
  126. (can_rxbuf_status_get(can_instance->can_x) != CAN_RXBUF_STATUS_EMPTY));
  127. can_software_reset(can_instance->can_x, TRUE);
  128. #ifdef RT_CAN_USING_CANFD
  129. can_instance->enable_canfd = cfg->enable_canfd;
  130. if (cfg->use_bit_timing != 0U)
  131. {
  132. can_instance->can_x->lbtcfg_bit.presc = cfg->can_timing.prescaler - 1;
  133. can_instance->can_x->actime_bit.ac_seg_1 = cfg->can_timing.num_seg1 - 2;
  134. can_instance->can_x->actime_bit.ac_seg_2 = cfg->can_timing.num_seg2 - 1;
  135. can_instance->can_x->actime_bit.ac_sjw = cfg->can_timing.num_sjw - 1;
  136. can_instance->can_x->fdtime_bit.fd_seg_1 = cfg->canfd_timing.num_seg1 - 2;
  137. can_instance->can_x->fdtime_bit.fd_seg_2 = cfg->canfd_timing.num_seg2 - 1;
  138. can_instance->can_x->fdtime_bit.fd_sjw = cfg->canfd_timing.num_sjw - 1;
  139. can_instance->can_x->lbtcfg_bit.fd_sspoff = cfg->canfd_timing.num_sspoff;
  140. }
  141. else if(cfg->baud_rate_fd != 0U)
  142. {
  143. baud_index = get_canfd_baud_index(cfg->baud_rate_fd);
  144. /* get baudrate parameters */
  145. can_instance->can_x->fdtime_bit.fd_seg_1 = canfd_baud_rate_tab[baud_index].div - 1;
  146. can_instance->can_x->fdtime_bit.fd_seg_1 = canfd_baud_rate_tab[baud_index].bts1_size - 2;
  147. can_instance->can_x->fdtime_bit.fd_seg_2 = canfd_baud_rate_tab[baud_index].bts2_size - 1;
  148. can_instance->can_x->fdtime_bit.fd_sjw = canfd_baud_rate_tab[baud_index].rsaw_size - 1;
  149. can_instance->can_x->lbtcfg_bit.fd_sspoff = canfd_baud_rate_tab[baud_index].ssoffset;
  150. }
  151. else
  152. #endif
  153. {
  154. baud_index = get_can_baud_index(cfg->baud_rate);
  155. /* get baudrate parameters */
  156. can_instance->can_x->lbtcfg_bit.presc = can_baud_rate_tab[baud_index].div - 1;
  157. can_instance->can_x->actime_bit.ac_seg_1 = can_baud_rate_tab[baud_index].bts1_size - 2;
  158. can_instance->can_x->actime_bit.ac_seg_2 = can_baud_rate_tab[baud_index].bts2_size - 1;
  159. can_instance->can_x->actime_bit.ac_sjw = can_baud_rate_tab[baud_index].rsaw_size - 1;
  160. }
  161. can_stb_transmit_mode_set(can_instance->can_x, CAN_STB_TRANSMIT_BY_FIFO);
  162. can_software_reset(can_instance->can_x, FALSE);
  163. /* config can base parameters */
  164. switch (cfg->mode)
  165. {
  166. case RT_CAN_MODE_NORMAL:
  167. can_mode = CAN_MODE_COMMUNICATE;
  168. break;
  169. case RT_CAN_MODE_LISTEN:
  170. can_mode = CAN_MODE_LISTENONLY;
  171. break;
  172. case RT_CAN_MODE_LOOPBACK:
  173. can_mode = CAN_MODE_EXT_LOOPBACK;
  174. break;
  175. case RT_CAN_MODE_LOOPBACKANLISTEN:
  176. can_mode = CAN_MODE_LISTENONLY_EXT;
  177. break;
  178. }
  179. can_mode_set(can_instance->can_x, can_mode);
  180. can_retransmission_limit_set(can_instance->can_x, CAN_RE_TRANS_TIMES_UNLIMIT);
  181. can_rearbitration_limit_set(can_instance->can_x, CAN_RE_ARBI_TIMES_UNLIMIT);
  182. can_rxbuf_warning_set(can_instance->can_x, 3);
  183. return RT_EOK;
  184. }
  185. static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg)
  186. {
  187. rt_uint32_t argval;
  188. rt_uint32_t errtype;
  189. rt_uint8_t filter_number = 0;
  190. can_transmit_status_type statues;
  191. struct rt_can_filter_config *filter_cfg;
  192. RT_ASSERT(can != RT_NULL);
  193. struct at32_can *can_instance = rt_container_of(can, struct at32_can, device);
  194. RT_ASSERT(can_instance != RT_NULL);
  195. switch (cmd)
  196. {
  197. case RT_DEVICE_CTRL_CLR_INT:
  198. argval = (rt_uint32_t) arg;
  199. if (argval == RT_DEVICE_FLAG_INT_RX)
  200. {
  201. nvic_irq_disable(can_instance->rx_irqn);
  202. /* disable interrupt */
  203. can_interrupt_enable(can_instance->can_x, CAN_RAFIE_INT, FALSE);
  204. can_interrupt_enable(can_instance->can_x, CAN_RFIE_INT, FALSE);
  205. can_interrupt_enable(can_instance->can_x, CAN_ROIE_INT, FALSE);
  206. can_interrupt_enable(can_instance->can_x, CAN_RIE_INT, FALSE);
  207. }
  208. else if (argval == RT_DEVICE_FLAG_INT_TX)
  209. {
  210. nvic_irq_disable(can_instance->tx_irqn);
  211. /* disable interrupt */
  212. can_interrupt_enable(can_instance->can_x, CAN_TSIE_INT, FALSE);
  213. can_interrupt_enable(can_instance->can_x, CAN_TPIE_INT, FALSE);
  214. can_interrupt_enable(can_instance->can_x, CAN_AIE_INT, FALSE);
  215. can_interrupt_enable(can_instance->can_x, CAN_ALIE_INT, FALSE);
  216. }
  217. else if (argval == RT_DEVICE_CAN_INT_ERR)
  218. {
  219. nvic_irq_disable(can_instance->err_irqn);
  220. /* disable interrupt */
  221. can_interrupt_enable(can_instance->can_x, CAN_EIE_INT, FALSE);
  222. can_interrupt_enable(can_instance->can_x, CAN_BEIE_INT, FALSE);
  223. can_interrupt_enable(can_instance->can_x, CAN_EPIE_INT, FALSE);
  224. }
  225. break;
  226. case RT_DEVICE_CTRL_SET_INT:
  227. argval = (rt_uint32_t) arg;
  228. if (argval == RT_DEVICE_FLAG_INT_RX)
  229. {
  230. /* enable interrupt */
  231. can_interrupt_enable(can_instance->can_x, CAN_RAFIE_INT, TRUE);
  232. can_interrupt_enable(can_instance->can_x, CAN_RFIE_INT, TRUE);
  233. can_interrupt_enable(can_instance->can_x, CAN_ROIE_INT, TRUE);
  234. can_interrupt_enable(can_instance->can_x, CAN_RIE_INT, TRUE);
  235. nvic_irq_enable(can_instance->rx_irqn, 1, 0);
  236. }
  237. else if (argval == RT_DEVICE_FLAG_INT_TX)
  238. {
  239. /* enable interrupt */
  240. can_interrupt_enable(can_instance->can_x, CAN_TSIE_INT, TRUE);
  241. can_interrupt_enable(can_instance->can_x, CAN_TPIE_INT, TRUE);
  242. can_interrupt_enable(can_instance->can_x, CAN_AIE_INT, TRUE);
  243. can_interrupt_enable(can_instance->can_x, CAN_ALIE_INT, TRUE);
  244. nvic_irq_enable(can_instance->tx_irqn, 1, 0);
  245. }
  246. else if (argval == RT_DEVICE_CAN_INT_ERR)
  247. {
  248. /* enable interrupt */
  249. can_interrupt_enable(can_instance->can_x, CAN_EIE_INT, TRUE);
  250. can_interrupt_enable(can_instance->can_x, CAN_BEIE_INT, TRUE);
  251. can_interrupt_enable(can_instance->can_x, CAN_EPIE_INT, TRUE);
  252. nvic_irq_enable(can_instance->err_irqn, 1, 0);
  253. }
  254. break;
  255. case RT_CAN_CMD_SET_FILTER:
  256. if (RT_NULL == arg)
  257. {
  258. /* default filter config */
  259. can_filter_default_para_init(&can_instance->filter_init_struct);
  260. }
  261. else
  262. {
  263. filter_cfg = (struct rt_can_filter_config *)arg;
  264. /* get default filter */
  265. for (int i = 0; i < filter_cfg->count; i++)
  266. {
  267. if (filter_cfg->items[i].hdr_bank == -1)
  268. {
  269. filter_number = i;
  270. }
  271. else
  272. {
  273. filter_number = filter_cfg->items[i].hdr_bank;
  274. }
  275. can_instance->filter_init_struct.code_para.id = filter_cfg->items[i].id;
  276. can_instance->filter_init_struct.code_para.id_type = (can_identifier_type)filter_cfg->items[i].ide;
  277. can_instance->filter_init_struct.mask_para.id = (~(filter_cfg->items[i].mask) & ~(filter_cfg->items[i].id & filter_cfg->items[i].mask));
  278. can_instance->filter_init_struct.mask_para.id_type = FALSE;
  279. can_instance->filter_init_struct.mask_para.data_length = 0xF;
  280. can_instance->filter_init_struct.mask_para.frame_type = TRUE;
  281. can_instance->filter_init_struct.mask_para.recv_frame = TRUE;
  282. /* filter configuration */
  283. do {
  284. can_transmit_status_get(can_instance->can_x, &statues);
  285. }
  286. while((statues.current_tstat != CAN_TSTAT_IDLE) || (can_stb_status_get(can_instance->can_x) != CAN_STB_STATUS_EMPTY) || \
  287. (can_rxbuf_status_get(can_instance->can_x) != CAN_RXBUF_STATUS_EMPTY));
  288. can_software_reset(can_instance->can_x, TRUE);
  289. can_filter_set(can_instance->can_x, (can_filter_type)filter_number, &can_instance->filter_init_struct);
  290. can_software_reset(can_instance->can_x, FALSE);
  291. can_filter_enable(can_instance->can_x, (can_filter_type)filter_number, TRUE);
  292. }
  293. }
  294. break;
  295. case RT_CAN_CMD_SET_MODE:
  296. argval = (rt_uint32_t) arg;
  297. if (argval != RT_CAN_MODE_NORMAL &&
  298. argval != RT_CAN_MODE_LISTEN &&
  299. argval != RT_CAN_MODE_LOOPBACK &&
  300. argval != RT_CAN_MODE_LOOPBACKANLISTEN)
  301. {
  302. return -RT_ERROR;
  303. }
  304. if (argval != can_instance->device.config.mode)
  305. {
  306. can_instance->device.config.mode = argval;
  307. return _can_config(&can_instance->device, &can_instance->device.config);
  308. }
  309. break;
  310. case RT_CAN_CMD_SET_BAUD:
  311. argval = (rt_uint32_t) arg;
  312. if (argval != CAN1MBaud &&
  313. argval != CAN800kBaud &&
  314. argval != CAN500kBaud &&
  315. argval != CAN250kBaud &&
  316. argval != CAN125kBaud &&
  317. argval != CAN100kBaud &&
  318. argval != CAN50kBaud &&
  319. argval != CAN20kBaud &&
  320. argval != CAN10kBaud)
  321. {
  322. return -RT_ERROR;
  323. }
  324. if (argval != can_instance->device.config.baud_rate)
  325. {
  326. can_instance->device.config.baud_rate = argval;
  327. return _can_config(&can_instance->device, &can_instance->device.config);
  328. }
  329. break;
  330. case RT_CAN_CMD_SET_PRIV:
  331. argval = (rt_uint32_t) arg;
  332. if (argval != RT_CAN_MODE_PRIV &&
  333. argval != RT_CAN_MODE_NOPRIV)
  334. {
  335. return -RT_ERROR;
  336. }
  337. if (argval != can_instance->device.config.privmode)
  338. {
  339. can_instance->device.config.privmode = argval;
  340. return _can_config(&can_instance->device, &can_instance->device.config);
  341. }
  342. break;
  343. case RT_CAN_CMD_GET_STATUS:
  344. errtype = can_instance->can_x->err;
  345. can_instance->device.status.rcverrcnt = errtype >> 24;
  346. can_instance->device.status.snderrcnt = ((errtype >> 16) & 0xFF);
  347. can_instance->device.status.lasterrtype = ((errtype >> 13) & 0x7);
  348. rt_memcpy(arg, &can_instance->device.status, sizeof(can_instance->device.status));
  349. break;
  350. #ifdef RT_CAN_USING_CANFD
  351. case RT_CAN_CMD_SET_CANFD:
  352. if(can_instance->enable_canfd != argval)
  353. {
  354. can_instance->enable_canfd = (rt_uint32_t) argval;
  355. }
  356. break;
  357. case RT_CAN_CMD_SET_BAUD_FD:
  358. argval = (rt_uint32_t) arg;
  359. if (argval != CANFD_DATA_1MBaud &&
  360. argval != CANFD_DATA_2MBaud &&
  361. argval != CANFD_DATA_3MBaud &&
  362. argval != CANFD_DATA_4MBaud &&
  363. argval != CANFD_DATA_5MBaud &&
  364. argval != CANFD_DATA_6MBaud)
  365. {
  366. return -RT_ERROR;
  367. }
  368. if (argval != can_instance->device.config.baud_rate_fd)
  369. {
  370. can_instance->device.config.baud_rate_fd = argval;
  371. return _can_config(&can_instance->device, &can_instance->device.config);
  372. }
  373. break;
  374. case RT_CAN_CMD_SET_BITTIMING:
  375. {
  376. struct rt_can_bit_timing_config *timing_configs = (struct rt_can_bit_timing_config*)arg;
  377. if ((timing_configs == RT_NULL) || (timing_configs->count < 1) || (timing_configs->count > 2))
  378. {
  379. return -RT_ERROR;
  380. }
  381. if (timing_configs->count != 0U)
  382. {
  383. can_instance->device.config.can_timing = timing_configs->items[0];
  384. }
  385. if (timing_configs->count == 2)
  386. {
  387. can_instance->device.config.canfd_timing = timing_configs->items[1];
  388. }
  389. _can_config(&can_instance->device, &can_instance->device.config);
  390. }
  391. break;
  392. #endif
  393. }
  394. return RT_EOK;
  395. }
  396. static rt_ssize_t _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t box_num)
  397. {
  398. rt_uint8_t copy_length = 0;
  399. can_txbuf_type tx_message;
  400. struct at32_can *can_instance = rt_container_of(can, struct at32_can, device);
  401. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  402. tx_message.id = pmsg->id;
  403. if (RT_CAN_STDID == pmsg->ide)
  404. {
  405. tx_message.id_type = CAN_ID_STANDARD;
  406. }
  407. else
  408. {
  409. tx_message.id_type = CAN_ID_EXTENDED;
  410. }
  411. if (RT_CAN_DTR == pmsg->rtr)
  412. {
  413. tx_message.frame_type = CAN_FRAME_DATA;
  414. }
  415. else
  416. {
  417. tx_message.frame_type = CAN_FRAME_REMOTE;
  418. }
  419. #ifdef RT_CAN_USING_CANFD
  420. if (pmsg->fd_frame != 0)
  421. {
  422. tx_message.fd_format = CAN_FORMAT_FD;
  423. tx_message.fd_rate_switch = (can_rate_switch_type)pmsg->brs;
  424. RT_ASSERT(pmsg->len <= 15);
  425. }
  426. else
  427. #endif
  428. {
  429. RT_ASSERT(pmsg->len <= 8);
  430. }
  431. #ifdef RT_CAN_USING_CANFD
  432. copy_length = dlc_to_bytes[pmsg->len];
  433. #else
  434. copy_length = pmsg->len;
  435. #endif
  436. /* set up the data field */
  437. rt_memcpy(&tx_message.data[0], &pmsg->data[0], copy_length);
  438. /* set up the dlc */
  439. tx_message.data_length = (can_data_length_type)pmsg->len;
  440. can_txbuf_write(can_instance->can_x, CAN_TXBUF_STB, &tx_message);
  441. can_txbuf_transmit(can_instance->can_x, CAN_TRANSMIT_STB_ALL);
  442. return RT_EOK;
  443. }
  444. static rt_ssize_t _can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t fifo)
  445. {
  446. can_rxbuf_type rx_message;
  447. struct at32_can *can_instance = rt_container_of(can, struct at32_can, device);
  448. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  449. /* get data */
  450. can_rxbuf_read(can_instance->can_x, &rx_message);
  451. #ifdef RT_CAN_USING_CANFD
  452. pmsg->len = dlc_to_bytes[rx_message.data_length];
  453. pmsg->fd_frame = rx_message.fd_format;
  454. pmsg->brs = rx_message.fd_rate_switch;
  455. #else
  456. if(rx_message.data_length > 8)
  457. pmsg->len = 8;
  458. else
  459. pmsg->len = rx_message.data_length;
  460. #endif
  461. pmsg->id = rx_message.id;
  462. /* get the data field */
  463. rt_memcpy(&pmsg->data[0], &rx_message.data[0], pmsg->len);
  464. if (rx_message.id_type == CAN_ID_STANDARD)
  465. {
  466. pmsg->ide = RT_CAN_STDID;
  467. }
  468. else
  469. {
  470. pmsg->ide = RT_CAN_EXTID;
  471. }
  472. pmsg->rtr = rx_message.frame_type;
  473. return RT_EOK;
  474. }
  475. static const struct rt_can_ops _can_ops =
  476. {
  477. _can_config,
  478. _can_control,
  479. _can_sendmsg,
  480. _can_recvmsg,
  481. };
  482. static void _can_rx_isr(struct rt_can_device *can)
  483. {
  484. struct at32_can *can_instance = rt_container_of(can, struct at32_can, device);
  485. /* rx_buffer had data be received */
  486. if(can_interrupt_flag_get(can_instance->can_x, CAN_RIF_FLAG) != RESET)
  487. {
  488. can_flag_clear(can_instance->can_x, CAN_RIF_FLAG);
  489. rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND);
  490. }
  491. /* rx_buffer almost full */
  492. if(can_interrupt_flag_get(can_instance->can_x, CAN_RAFIF_FLAG) != RESET)
  493. {
  494. can_flag_clear(can_instance->can_x, CAN_RAFIF_FLAG);
  495. }
  496. /* rx_buffer full */
  497. if(can_interrupt_flag_get(can_instance->can_x, CAN_RFIF_FLAG) != RESET)
  498. {
  499. can_flag_clear(can_instance->can_x, CAN_RFIF_FLAG);
  500. }
  501. /* rx_buffer overflow */
  502. if(can_interrupt_flag_get(can_instance->can_x, CAN_ROIF_FLAG) != RESET)
  503. {
  504. can_flag_clear(can_instance->can_x, CAN_ROIF_FLAG);
  505. rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND);
  506. }
  507. }
  508. static void _can_tx_isr(struct rt_can_device *can)
  509. {
  510. struct at32_can *can_instance = rt_container_of(can, struct at32_can, device);
  511. /* transmit buffer be completed */
  512. if(can_interrupt_flag_get(can_instance->can_x, CAN_TSIF_FLAG) != RESET)
  513. {
  514. can_flag_clear(can_instance->can_x, CAN_TSIF_FLAG);
  515. rt_hw_can_isr(can, RT_CAN_EVENT_TX_DONE);
  516. }
  517. }
  518. void _can_err_isr(struct rt_can_device *can)
  519. {
  520. rt_uint32_t errtype;
  521. struct at32_can *can_instance = rt_container_of(can, struct at32_can, device);
  522. errtype = can_instance->can_x->err;
  523. switch (((errtype >> 13) & 0x7))
  524. {
  525. case RT_CAN_BUS_BIT_PAD_ERR:
  526. can_instance->device.status.bitpaderrcnt++;
  527. break;
  528. case RT_CAN_BUS_FORMAT_ERR:
  529. can_instance->device.status.formaterrcnt++;
  530. break;
  531. case RT_CAN_BUS_ACK_ERR:
  532. can_instance->device.status.ackerrcnt++;
  533. rt_hw_can_isr(&can_instance->device, RT_CAN_EVENT_TX_FAIL);
  534. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  535. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  536. can_instance->device.status.biterrcnt++;
  537. break;
  538. case RT_CAN_BUS_CRC_ERR:
  539. can_instance->device.status.crcerrcnt++;
  540. break;
  541. }
  542. can_instance->device.status.rcverrcnt = errtype >> 24;
  543. can_instance->device.status.snderrcnt = (errtype >> 16 & 0xFF);
  544. can_instance->device.status.lasterrtype = (errtype >> 13 & 0x7);
  545. can_flag_clear(can_instance->can_x, CAN_BEIF_FLAG);
  546. }
  547. #ifdef BSP_USING_CAN1
  548. void CAN1_TX_IRQHandler(void) {
  549. rt_interrupt_enter();
  550. _can_tx_isr(&can_config[CAN1_INDEX].device);
  551. rt_interrupt_leave();
  552. }
  553. void CAN1_RX_IRQHandler(void)
  554. {
  555. /* enter interrupt */
  556. rt_interrupt_enter();
  557. _can_rx_isr(&can_config[CAN1_INDEX].device);
  558. /* leave interrupt */
  559. rt_interrupt_leave();
  560. }
  561. void CAN1_ERR_IRQHandler(void)
  562. {
  563. /* enter interrupt */
  564. rt_interrupt_enter();
  565. _can_err_isr(&can_config[CAN1_INDEX].device);
  566. /* leave interrupt */
  567. rt_interrupt_leave();
  568. }
  569. #endif
  570. #ifdef BSP_USING_CAN2
  571. void CAN2_TX_IRQHandler(void) {
  572. rt_interrupt_enter();
  573. _can_tx_isr(&can_config[CAN2_INDEX].device);
  574. rt_interrupt_leave();
  575. }
  576. void CAN2_RX_IRQHandler(void)
  577. {
  578. /* enter interrupt */
  579. rt_interrupt_enter();
  580. _can_rx_isr(&can_config[CAN2_INDEX].device);
  581. /* leave interrupt */
  582. rt_interrupt_leave();
  583. }
  584. void CAN2_ERR_IRQHandler(void)
  585. {
  586. /* enter interrupt */
  587. rt_interrupt_enter();
  588. _can_err_isr(&can_config[CAN2_INDEX].device);
  589. /* leave interrupt */
  590. rt_interrupt_leave();
  591. }
  592. #endif
  593. #ifdef BSP_USING_CAN3
  594. void CAN3_TX_IRQHandler(void) {
  595. rt_interrupt_enter();
  596. _can_tx_isr(&can_config[CAN3_INDEX].device);
  597. rt_interrupt_leave();
  598. }
  599. void CAN3_RX_IRQHandler(void)
  600. {
  601. /* enter interrupt */
  602. rt_interrupt_enter();
  603. _can_rx_isr(&can_config[CAN3_INDEX].device);
  604. /* leave interrupt */
  605. rt_interrupt_leave();
  606. }
  607. void CAN3_ERR_IRQHandler(void)
  608. {
  609. /* enter interrupt */
  610. rt_interrupt_enter();
  611. _can_err_isr(&can_config[CAN3_INDEX].device);
  612. /* leave interrupt */
  613. rt_interrupt_leave();
  614. }
  615. #endif
  616. int rt_hw_can_init(void)
  617. {
  618. rt_size_t obj_num;
  619. int index;
  620. obj_num = sizeof(can_config) / sizeof(struct at32_can);
  621. struct can_configure config = CANDEFAULTCONFIG;
  622. config.privmode = RT_CAN_MODE_NOPRIV;
  623. config.ticks = 50;
  624. #ifdef RT_CAN_USING_HDR
  625. config.maxhdr = 16;
  626. #endif
  627. for (index = 0; index < obj_num; index++) {
  628. /* config default filter */
  629. can_filter_config_type filter_config;
  630. can_filter_default_para_init(&filter_config);
  631. can_config[index].filter_init_struct = filter_config;
  632. can_config[index].device.config = config;
  633. rt_hw_can_register(&can_config[index].device,
  634. can_config[index].name,
  635. &_can_ops,
  636. &can_config[index]);
  637. }
  638. return 0;
  639. }
  640. INIT_BOARD_EXPORT(rt_hw_can_init);
  641. #endif /* BSP_USING_CAN_V2 */