drv_can.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-08-05 Xeon Xu the first version
  9. * 2019-01-22 YLZ port from stm324xx-HAL to bsp stm3210x-HAL
  10. * 2019-02-19 YLZ add support EXTID RTR Frame. modify send, recv functions.
  11. * fix bug.port to BSP [stm32]
  12. * 2019-03-27 YLZ support double can channels, support stm32F4xx (only Legacy mode).
  13. * 2019-06-17 YLZ port to new STM32F1xx HAL V1.1.3.
  14. * 2021-02-02 YuZhe XU fix bug in filter config
  15. * 2021-8-25 SVCHAO The baud rate is configured according to the different APB1 frequencies.
  16. f4-series only.
  17. */
  18. #include "drv_can.h"
  19. #ifdef BSP_USING_CAN
  20. #define LOG_TAG "drv_can"
  21. #include <drv_log.h>
  22. /* attention !!! baud calculation example: Tclk / ((ss + bs1 + bs2) * brp) = 36 / ((1 + 8 + 3) * 3) = 1MHz*/
  23. #if defined (SOC_SERIES_STM32F1)/* APB1 36MHz(max) */
  24. static const struct stm32_baud_rate_tab can_baud_rate_tab[] =
  25. {
  26. {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 3)},
  27. {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_5TQ | CAN_BS2_3TQ | 5)},
  28. {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 6)},
  29. {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 12)},
  30. {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 24)},
  31. {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 30)},
  32. {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 60)},
  33. {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 150)},
  34. {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 300)}
  35. };
  36. #elif defined (SOC_SERIES_STM32F4) /* 42MHz or 45MHz */
  37. #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\
  38. defined(STM32F401xC) || defined(STM32F401xE) /* 42MHz(max) */
  39. static const struct stm32_baud_rate_tab can_baud_rate_tab[] =
  40. {
  41. {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 3)},
  42. {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_4TQ | 4)},
  43. {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 6)},
  44. {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 12)},
  45. {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 24)},
  46. {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 30)},
  47. {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 60)},
  48. {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 150)},
  49. {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 300)}
  50. };
  51. #else /* APB1 45MHz(max) */
  52. static const struct stm32_baud_rate_tab can_baud_rate_tab[] =
  53. {
  54. #ifdef BSP_USING_CAN168M
  55. {CAN1MBaud, (CAN_SJW_1TQ | CAN_BS1_3TQ | CAN_BS2_3TQ | 6)},
  56. #else
  57. {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 3)},
  58. #endif
  59. {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_5TQ | 4)},
  60. {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 6)},
  61. {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 12)},
  62. {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 24)},
  63. {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 30)},
  64. {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 60)},
  65. {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 150)},
  66. {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 300)}
  67. };
  68. #endif
  69. #elif defined (SOC_SERIES_STM32F7)/* APB1 54MHz(max) */
  70. static const struct stm32_baud_rate_tab can_baud_rate_tab[] =
  71. {
  72. {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 3)},
  73. {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_7TQ | 4)},
  74. {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 6)},
  75. {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 12)},
  76. {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 24)},
  77. {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 30)},
  78. {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 60)},
  79. {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 150)},
  80. {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_10TQ | CAN_BS2_7TQ | 300)}
  81. };
  82. #elif defined (SOC_SERIES_STM32L4)/* APB1 80MHz(max) */
  83. static const struct stm32_baud_rate_tab can_baud_rate_tab[] =
  84. {
  85. {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_5TQ | CAN_BS2_2TQ | 10)},
  86. {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_14TQ | CAN_BS2_5TQ | 5)},
  87. {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_7TQ | CAN_BS2_2TQ | 16)},
  88. {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_13TQ | CAN_BS2_2TQ | 20)},
  89. {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_13TQ | CAN_BS2_2TQ | 40)},
  90. {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_13TQ | CAN_BS2_2TQ | 50)},
  91. {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_13TQ | CAN_BS2_2TQ | 100)},
  92. {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_13TQ | CAN_BS2_2TQ | 250)},
  93. {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_13TQ | CAN_BS2_2TQ | 500)}
  94. };
  95. #endif
  96. #ifdef BSP_USING_CAN1
  97. static struct stm32_can drv_can1 =
  98. {
  99. .name = "can1",
  100. .CanHandle.Instance = CAN1,
  101. };
  102. #endif
  103. #ifdef BSP_USING_CAN2
  104. static struct stm32_can drv_can2 =
  105. {
  106. "can2",
  107. .CanHandle.Instance = CAN2,
  108. };
  109. #endif
  110. static rt_uint32_t get_can_baud_index(rt_uint32_t baud)
  111. {
  112. rt_uint32_t len, index;
  113. len = sizeof(can_baud_rate_tab) / sizeof(can_baud_rate_tab[0]);
  114. for (index = 0; index < len; index++)
  115. {
  116. if (can_baud_rate_tab[index].baud_rate == baud)
  117. return index;
  118. }
  119. return 0; /* default baud is CAN1MBaud */
  120. }
  121. static rt_err_t _can_config(struct rt_can_device *can, struct can_configure *cfg)
  122. {
  123. struct stm32_can *drv_can;
  124. rt_uint32_t baud_index;
  125. RT_ASSERT(can);
  126. RT_ASSERT(cfg);
  127. drv_can = (struct stm32_can *)can->parent.user_data;
  128. RT_ASSERT(drv_can);
  129. drv_can->CanHandle.Init.TimeTriggeredMode = DISABLE;
  130. drv_can->CanHandle.Init.AutoBusOff = ENABLE;
  131. drv_can->CanHandle.Init.AutoWakeUp = DISABLE;
  132. drv_can->CanHandle.Init.AutoRetransmission = DISABLE;
  133. drv_can->CanHandle.Init.ReceiveFifoLocked = DISABLE;
  134. drv_can->CanHandle.Init.TransmitFifoPriority = ENABLE;
  135. switch (cfg->mode)
  136. {
  137. case RT_CAN_MODE_NORMAL:
  138. drv_can->CanHandle.Init.Mode = CAN_MODE_NORMAL;
  139. break;
  140. case RT_CAN_MODE_LISTEN:
  141. drv_can->CanHandle.Init.Mode = CAN_MODE_SILENT;
  142. break;
  143. case RT_CAN_MODE_LOOPBACK:
  144. drv_can->CanHandle.Init.Mode = CAN_MODE_LOOPBACK;
  145. break;
  146. case RT_CAN_MODE_LOOPBACKANLISTEN:
  147. drv_can->CanHandle.Init.Mode = CAN_MODE_SILENT_LOOPBACK;
  148. break;
  149. }
  150. baud_index = get_can_baud_index(cfg->baud_rate);
  151. drv_can->CanHandle.Init.SyncJumpWidth = BAUD_DATA(SJW, baud_index);
  152. drv_can->CanHandle.Init.TimeSeg1 = BAUD_DATA(BS1, baud_index);
  153. drv_can->CanHandle.Init.TimeSeg2 = BAUD_DATA(BS2, baud_index);
  154. drv_can->CanHandle.Init.Prescaler = BAUD_DATA(RRESCL, baud_index);
  155. /* init can */
  156. if (HAL_CAN_Init(&drv_can->CanHandle) != HAL_OK)
  157. {
  158. return -RT_ERROR;
  159. }
  160. /* default filter config */
  161. HAL_CAN_ConfigFilter(&drv_can->CanHandle, &drv_can->FilterConfig);
  162. /* can start */
  163. HAL_CAN_Start(&drv_can->CanHandle);
  164. return RT_EOK;
  165. }
  166. static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg)
  167. {
  168. rt_uint32_t argval;
  169. struct stm32_can *drv_can;
  170. struct rt_can_filter_config *filter_cfg;
  171. RT_ASSERT(can != RT_NULL);
  172. drv_can = (struct stm32_can *)can->parent.user_data;
  173. RT_ASSERT(drv_can != RT_NULL);
  174. switch (cmd)
  175. {
  176. case RT_DEVICE_CTRL_CLR_INT:
  177. argval = (rt_uint32_t) arg;
  178. if (argval == RT_DEVICE_FLAG_INT_RX)
  179. {
  180. if (CAN1 == drv_can->CanHandle.Instance)
  181. {
  182. HAL_NVIC_DisableIRQ(CAN1_RX0_IRQn);
  183. HAL_NVIC_DisableIRQ(CAN1_RX1_IRQn);
  184. }
  185. #ifdef CAN2
  186. if (CAN2 == drv_can->CanHandle.Instance)
  187. {
  188. HAL_NVIC_DisableIRQ(CAN2_RX0_IRQn);
  189. HAL_NVIC_DisableIRQ(CAN2_RX1_IRQn);
  190. }
  191. #endif
  192. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_MSG_PENDING);
  193. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_FULL);
  194. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_OVERRUN);
  195. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO1_MSG_PENDING);
  196. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO1_FULL);
  197. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO1_OVERRUN);
  198. }
  199. else if (argval == RT_DEVICE_FLAG_INT_TX)
  200. {
  201. if (CAN1 == drv_can->CanHandle.Instance)
  202. {
  203. HAL_NVIC_DisableIRQ(CAN1_TX_IRQn);
  204. }
  205. #ifdef CAN2
  206. if (CAN2 == drv_can->CanHandle.Instance)
  207. {
  208. HAL_NVIC_DisableIRQ(CAN2_TX_IRQn);
  209. }
  210. #endif
  211. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_TX_MAILBOX_EMPTY);
  212. }
  213. else if (argval == RT_DEVICE_CAN_INT_ERR)
  214. {
  215. if (CAN1 == drv_can->CanHandle.Instance)
  216. {
  217. NVIC_DisableIRQ(CAN1_SCE_IRQn);
  218. }
  219. #ifdef CAN2
  220. if (CAN2 == drv_can->CanHandle.Instance)
  221. {
  222. NVIC_DisableIRQ(CAN2_SCE_IRQn);
  223. }
  224. #endif
  225. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR_WARNING);
  226. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR_PASSIVE);
  227. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_BUSOFF);
  228. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_LAST_ERROR_CODE);
  229. __HAL_CAN_DISABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR);
  230. }
  231. break;
  232. case RT_DEVICE_CTRL_SET_INT:
  233. argval = (rt_uint32_t) arg;
  234. if (argval == RT_DEVICE_FLAG_INT_RX)
  235. {
  236. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_MSG_PENDING);
  237. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_FULL);
  238. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO0_OVERRUN);
  239. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO1_MSG_PENDING);
  240. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO1_FULL);
  241. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_RX_FIFO1_OVERRUN);
  242. if (CAN1 == drv_can->CanHandle.Instance)
  243. {
  244. HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 1, 0);
  245. HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
  246. HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 1, 0);
  247. HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
  248. }
  249. #ifdef CAN2
  250. if (CAN2 == drv_can->CanHandle.Instance)
  251. {
  252. HAL_NVIC_SetPriority(CAN2_RX0_IRQn, 1, 0);
  253. HAL_NVIC_EnableIRQ(CAN2_RX0_IRQn);
  254. HAL_NVIC_SetPriority(CAN2_RX1_IRQn, 1, 0);
  255. HAL_NVIC_EnableIRQ(CAN2_RX1_IRQn);
  256. }
  257. #endif
  258. }
  259. else if (argval == RT_DEVICE_FLAG_INT_TX)
  260. {
  261. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_TX_MAILBOX_EMPTY);
  262. if (CAN1 == drv_can->CanHandle.Instance)
  263. {
  264. HAL_NVIC_SetPriority(CAN1_TX_IRQn, 1, 0);
  265. HAL_NVIC_EnableIRQ(CAN1_TX_IRQn);
  266. }
  267. #ifdef CAN2
  268. if (CAN2 == drv_can->CanHandle.Instance)
  269. {
  270. HAL_NVIC_SetPriority(CAN2_TX_IRQn, 1, 0);
  271. HAL_NVIC_EnableIRQ(CAN2_TX_IRQn);
  272. }
  273. #endif
  274. }
  275. else if (argval == RT_DEVICE_CAN_INT_ERR)
  276. {
  277. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR_WARNING);
  278. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR_PASSIVE);
  279. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_BUSOFF);
  280. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_LAST_ERROR_CODE);
  281. __HAL_CAN_ENABLE_IT(&drv_can->CanHandle, CAN_IT_ERROR);
  282. if (CAN1 == drv_can->CanHandle.Instance)
  283. {
  284. HAL_NVIC_SetPriority(CAN1_SCE_IRQn, 1, 0);
  285. HAL_NVIC_EnableIRQ(CAN1_SCE_IRQn);
  286. }
  287. #ifdef CAN2
  288. if (CAN2 == drv_can->CanHandle.Instance)
  289. {
  290. HAL_NVIC_SetPriority(CAN2_SCE_IRQn, 1, 0);
  291. HAL_NVIC_EnableIRQ(CAN2_SCE_IRQn);
  292. }
  293. #endif
  294. }
  295. break;
  296. case RT_CAN_CMD_SET_FILTER:
  297. {
  298. rt_uint32_t id_h = 0;
  299. rt_uint32_t id_l = 0;
  300. rt_uint32_t mask_h = 0;
  301. rt_uint32_t mask_l = 0;
  302. rt_uint32_t mask_l_tail = 0; //CAN_FxR2 bit [2:0]
  303. if (RT_NULL == arg)
  304. {
  305. /* default filter config */
  306. HAL_CAN_ConfigFilter(&drv_can->CanHandle, &drv_can->FilterConfig);
  307. }
  308. else
  309. {
  310. filter_cfg = (struct rt_can_filter_config *)arg;
  311. /* get default filter */
  312. for (int i = 0; i < filter_cfg->count; i++)
  313. {
  314. if (filter_cfg->items[i].hdr_bank == -1)
  315. {
  316. /* use default filter bank settings */
  317. if (rt_strcmp(drv_can->name, "can1") == 0)
  318. {
  319. /* can1 banks 0~13 */
  320. drv_can->FilterConfig.FilterBank = i;
  321. }
  322. else if (rt_strcmp(drv_can->name, "can2") == 0)
  323. {
  324. /* can2 banks 14~27 */
  325. drv_can->FilterConfig.FilterBank = i + 14;
  326. }
  327. }
  328. else
  329. {
  330. /* use user-defined filter bank settings */
  331. drv_can->FilterConfig.FilterBank = filter_cfg->items[i].hdr_bank;
  332. }
  333. /**
  334. * ID | CAN_FxR1[31:24] | CAN_FxR1[23:16] | CAN_FxR1[15:8] | CAN_FxR1[7:0] |
  335. * MASK | CAN_FxR2[31:24] | CAN_FxR2[23:16] | CAN_FxR2[15:8] | CAN_FxR2[7:0] |
  336. * STD ID | STID[10:3] | STDID[2:0] |<- 21bit ->|
  337. * EXT ID | EXTID[28:21] | EXTID[20:13] | EXTID[12:5] | EXTID[4:0] IDE RTR 0|
  338. * @note the 32bit STD ID must << 21 to fill CAN_FxR1[31:21] and EXT ID must << 3,
  339. * -> but the id bit of struct rt_can_filter_item is 29,
  340. * -> so STD id << 18 and EXT id Don't need << 3, when get the high 16bit.
  341. * -> FilterIdHigh : (((STDid << 18) or (EXT id)) >> 13) & 0xFFFF,
  342. * -> FilterIdLow: ((STDid << 18) or (EXT id << 3)) & 0xFFFF.
  343. * @note the mask bit of struct rt_can_filter_item is 32,
  344. * -> FilterMaskIdHigh: (((STD mask << 21) or (EXT mask <<3)) >> 16) & 0xFFFF
  345. * -> FilterMaskIdLow: ((STD mask << 21) or (EXT mask <<3)) & 0xFFFF
  346. */
  347. if (filter_cfg->items[i].mode == CAN_FILTERMODE_IDMASK)
  348. {
  349. /* make sure the CAN_FxR1[2:0](IDE RTR) work */
  350. mask_l_tail = 0x06;
  351. }
  352. else if (filter_cfg->items[i].mode == CAN_FILTERMODE_IDLIST)
  353. {
  354. /* same as CAN_FxR1 */
  355. mask_l_tail = (filter_cfg->items[i].ide << 2) |
  356. (filter_cfg->items[i].rtr << 1);
  357. }
  358. if (filter_cfg->items[i].ide == RT_CAN_STDID)
  359. {
  360. id_h = ((filter_cfg->items[i].id << 18) >> 13) & 0xFFFF;
  361. id_l = ((filter_cfg->items[i].id << 18) |
  362. (filter_cfg->items[i].ide << 2) |
  363. (filter_cfg->items[i].rtr << 1)) & 0xFFFF;
  364. mask_h = ((filter_cfg->items[i].mask << 21) >> 16) & 0xFFFF;
  365. mask_l = ((filter_cfg->items[i].mask << 21) | mask_l_tail) & 0xFFFF;
  366. }
  367. else if (filter_cfg->items[i].ide == RT_CAN_EXTID)
  368. {
  369. id_h = (filter_cfg->items[i].id >> 13) & 0xFFFF;
  370. id_l = ((filter_cfg->items[i].id << 3) |
  371. (filter_cfg->items[i].ide << 2) |
  372. (filter_cfg->items[i].rtr << 1)) & 0xFFFF;
  373. mask_h = ((filter_cfg->items[i].mask << 3) >> 16) & 0xFFFF;
  374. mask_l = ((filter_cfg->items[i].mask << 3) | mask_l_tail) & 0xFFFF;
  375. }
  376. drv_can->FilterConfig.FilterIdHigh = id_h;
  377. drv_can->FilterConfig.FilterIdLow = id_l;
  378. drv_can->FilterConfig.FilterMaskIdHigh = mask_h;
  379. drv_can->FilterConfig.FilterMaskIdLow = mask_l;
  380. drv_can->FilterConfig.FilterMode = filter_cfg->items[i].mode;
  381. drv_can->FilterConfig.FilterFIFOAssignment = filter_cfg->items[i].rxfifo;/*rxfifo = CAN_RX_FIFO0/CAN_RX_FIFO1*/
  382. /* Filter conf */
  383. HAL_CAN_ConfigFilter(&drv_can->CanHandle, &drv_can->FilterConfig);
  384. }
  385. }
  386. break;
  387. }
  388. case RT_CAN_CMD_SET_MODE:
  389. argval = (rt_uint32_t) arg;
  390. if (argval != RT_CAN_MODE_NORMAL &&
  391. argval != RT_CAN_MODE_LISTEN &&
  392. argval != RT_CAN_MODE_LOOPBACK &&
  393. argval != RT_CAN_MODE_LOOPBACKANLISTEN)
  394. {
  395. return -RT_ERROR;
  396. }
  397. if (argval != drv_can->device.config.mode)
  398. {
  399. drv_can->device.config.mode = argval;
  400. return _can_config(&drv_can->device, &drv_can->device.config);
  401. }
  402. break;
  403. case RT_CAN_CMD_SET_BAUD:
  404. argval = (rt_uint32_t) arg;
  405. if (argval != CAN1MBaud &&
  406. argval != CAN800kBaud &&
  407. argval != CAN500kBaud &&
  408. argval != CAN250kBaud &&
  409. argval != CAN125kBaud &&
  410. argval != CAN100kBaud &&
  411. argval != CAN50kBaud &&
  412. argval != CAN20kBaud &&
  413. argval != CAN10kBaud)
  414. {
  415. return -RT_ERROR;
  416. }
  417. if (argval != drv_can->device.config.baud_rate)
  418. {
  419. drv_can->device.config.baud_rate = argval;
  420. return _can_config(&drv_can->device, &drv_can->device.config);
  421. }
  422. break;
  423. case RT_CAN_CMD_SET_PRIV:
  424. argval = (rt_uint32_t) arg;
  425. if (argval != RT_CAN_MODE_PRIV &&
  426. argval != RT_CAN_MODE_NOPRIV)
  427. {
  428. return -RT_ERROR;
  429. }
  430. if (argval != drv_can->device.config.privmode)
  431. {
  432. drv_can->device.config.privmode = argval;
  433. return _can_config(&drv_can->device, &drv_can->device.config);
  434. }
  435. break;
  436. case RT_CAN_CMD_GET_STATUS:
  437. {
  438. rt_uint32_t errtype;
  439. errtype = drv_can->CanHandle.Instance->ESR;
  440. drv_can->device.status.rcverrcnt = errtype >> 24;
  441. drv_can->device.status.snderrcnt = (errtype >> 16 & 0xFF);
  442. drv_can->device.status.lasterrtype = errtype & 0x70;
  443. drv_can->device.status.errcode = errtype & 0x07;
  444. rt_memcpy(arg, &drv_can->device.status, sizeof(drv_can->device.status));
  445. }
  446. break;
  447. }
  448. return RT_EOK;
  449. }
  450. static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t box_num)
  451. {
  452. CAN_HandleTypeDef *hcan;
  453. hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle;
  454. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  455. CAN_TxHeaderTypeDef txheader = {0};
  456. HAL_CAN_StateTypeDef state = hcan->State;
  457. /* Check the parameters */
  458. RT_ASSERT(IS_CAN_DLC(pmsg->len));
  459. if ((state == HAL_CAN_STATE_READY) ||
  460. (state == HAL_CAN_STATE_LISTENING))
  461. {
  462. /*check select mailbox is empty */
  463. switch (1 << box_num)
  464. {
  465. case CAN_TX_MAILBOX0:
  466. if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME0) != SET)
  467. {
  468. /* Return function status */
  469. return -RT_ERROR;
  470. }
  471. break;
  472. case CAN_TX_MAILBOX1:
  473. if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME1) != SET)
  474. {
  475. /* Return function status */
  476. return -RT_ERROR;
  477. }
  478. break;
  479. case CAN_TX_MAILBOX2:
  480. if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME2) != SET)
  481. {
  482. /* Return function status */
  483. return -RT_ERROR;
  484. }
  485. break;
  486. default:
  487. RT_ASSERT(0);
  488. break;
  489. }
  490. if (RT_CAN_STDID == pmsg->ide)
  491. {
  492. txheader.IDE = CAN_ID_STD;
  493. RT_ASSERT(IS_CAN_STDID(pmsg->id));
  494. txheader.StdId = pmsg->id;
  495. }
  496. else
  497. {
  498. txheader.IDE = CAN_ID_EXT;
  499. RT_ASSERT(IS_CAN_EXTID(pmsg->id));
  500. txheader.ExtId = pmsg->id;
  501. }
  502. if (RT_CAN_DTR == pmsg->rtr)
  503. {
  504. txheader.RTR = CAN_RTR_DATA;
  505. }
  506. else
  507. {
  508. txheader.RTR = CAN_RTR_REMOTE;
  509. }
  510. /* clear TIR */
  511. hcan->Instance->sTxMailBox[box_num].TIR &= CAN_TI0R_TXRQ;
  512. /* Set up the Id */
  513. if (RT_CAN_STDID == pmsg->ide)
  514. {
  515. hcan->Instance->sTxMailBox[box_num].TIR |= (txheader.StdId << CAN_TI0R_STID_Pos) | txheader.RTR;
  516. }
  517. else
  518. {
  519. hcan->Instance->sTxMailBox[box_num].TIR |= (txheader.ExtId << CAN_TI0R_EXID_Pos) | txheader.IDE | txheader.RTR;
  520. }
  521. /* Set up the DLC */
  522. hcan->Instance->sTxMailBox[box_num].TDTR = pmsg->len & 0x0FU;
  523. /* Set up the data field */
  524. WRITE_REG(hcan->Instance->sTxMailBox[box_num].TDHR,
  525. ((uint32_t)pmsg->data[7] << CAN_TDH0R_DATA7_Pos) |
  526. ((uint32_t)pmsg->data[6] << CAN_TDH0R_DATA6_Pos) |
  527. ((uint32_t)pmsg->data[5] << CAN_TDH0R_DATA5_Pos) |
  528. ((uint32_t)pmsg->data[4] << CAN_TDH0R_DATA4_Pos));
  529. WRITE_REG(hcan->Instance->sTxMailBox[box_num].TDLR,
  530. ((uint32_t)pmsg->data[3] << CAN_TDL0R_DATA3_Pos) |
  531. ((uint32_t)pmsg->data[2] << CAN_TDL0R_DATA2_Pos) |
  532. ((uint32_t)pmsg->data[1] << CAN_TDL0R_DATA1_Pos) |
  533. ((uint32_t)pmsg->data[0] << CAN_TDL0R_DATA0_Pos));
  534. /* Request transmission */
  535. SET_BIT(hcan->Instance->sTxMailBox[box_num].TIR, CAN_TI0R_TXRQ);
  536. return RT_EOK;
  537. }
  538. else
  539. {
  540. /* Update error code */
  541. hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
  542. return -RT_ERROR;
  543. }
  544. }
  545. static int _can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t fifo)
  546. {
  547. HAL_StatusTypeDef status;
  548. CAN_HandleTypeDef *hcan;
  549. struct rt_can_msg *pmsg;
  550. CAN_RxHeaderTypeDef rxheader = {0};
  551. RT_ASSERT(can);
  552. hcan = &((struct stm32_can *)can->parent.user_data)->CanHandle;
  553. pmsg = (struct rt_can_msg *) buf;
  554. /* get data */
  555. status = HAL_CAN_GetRxMessage(hcan, fifo, &rxheader, pmsg->data);
  556. if (HAL_OK != status)
  557. return -RT_ERROR;
  558. /* get id */
  559. if (CAN_ID_STD == rxheader.IDE)
  560. {
  561. pmsg->ide = RT_CAN_STDID;
  562. pmsg->id = rxheader.StdId;
  563. }
  564. else
  565. {
  566. pmsg->ide = RT_CAN_EXTID;
  567. pmsg->id = rxheader.ExtId;
  568. }
  569. /* get type */
  570. if (CAN_RTR_DATA == rxheader.RTR)
  571. {
  572. pmsg->rtr = RT_CAN_DTR;
  573. }
  574. else
  575. {
  576. pmsg->rtr = RT_CAN_RTR;
  577. }
  578. /*get rxfifo = CAN_RX_FIFO0/CAN_RX_FIFO1*/
  579. pmsg->rxfifo = fifo;
  580. /* get len */
  581. pmsg->len = rxheader.DLC;
  582. /* get hdr_index */
  583. if (hcan->Instance == CAN1)
  584. {
  585. pmsg->hdr_index = rxheader.FilterMatchIndex;
  586. }
  587. #ifdef CAN2
  588. else if (hcan->Instance == CAN2)
  589. {
  590. pmsg->hdr_index = rxheader.FilterMatchIndex;
  591. }
  592. #endif
  593. return RT_EOK;
  594. }
  595. static const struct rt_can_ops _can_ops =
  596. {
  597. _can_config,
  598. _can_control,
  599. _can_sendmsg,
  600. _can_recvmsg,
  601. };
  602. static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo)
  603. {
  604. CAN_HandleTypeDef *hcan;
  605. RT_ASSERT(can);
  606. hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle;
  607. switch (fifo)
  608. {
  609. case CAN_RX_FIFO0:
  610. /* save to user list */
  611. if (HAL_CAN_GetRxFifoFillLevel(hcan, CAN_RX_FIFO0) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO0_MSG_PENDING))
  612. {
  613. rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8);
  614. }
  615. /* Check FULL flag for FIFO0 */
  616. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FF0) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO0_FULL))
  617. {
  618. /* Clear FIFO0 FULL Flag */
  619. __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF0);
  620. }
  621. /* Check Overrun flag for FIFO0 */
  622. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV0) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO0_OVERRUN))
  623. {
  624. /* Clear FIFO0 Overrun Flag */
  625. __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0);
  626. rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND | fifo << 8);
  627. }
  628. break;
  629. case CAN_RX_FIFO1:
  630. /* save to user list */
  631. if (HAL_CAN_GetRxFifoFillLevel(hcan, CAN_RX_FIFO1) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO1_MSG_PENDING))
  632. {
  633. rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8);
  634. }
  635. /* Check FULL flag for FIFO1 */
  636. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FF1) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO1_FULL))
  637. {
  638. /* Clear FIFO1 FULL Flag */
  639. __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF1);
  640. }
  641. /* Check Overrun flag for FIFO1 */
  642. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV1) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO1_OVERRUN))
  643. {
  644. /* Clear FIFO1 Overrun Flag */
  645. __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1);
  646. rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND | fifo << 8);
  647. }
  648. break;
  649. }
  650. }
  651. static void _can_sce_isr(struct rt_can_device *can)
  652. {
  653. CAN_HandleTypeDef *hcan;
  654. RT_ASSERT(can);
  655. hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle;
  656. rt_uint32_t errtype = hcan->Instance->ESR;
  657. switch ((errtype & 0x70) >> 4)
  658. {
  659. case RT_CAN_BUS_BIT_PAD_ERR:
  660. can->status.bitpaderrcnt++;
  661. break;
  662. case RT_CAN_BUS_FORMAT_ERR:
  663. can->status.formaterrcnt++;
  664. break;
  665. case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */
  666. can->status.ackerrcnt++;
  667. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0))
  668. {
  669. if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0))
  670. {
  671. rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  672. }
  673. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0);
  674. }
  675. else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1))
  676. {
  677. if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1))
  678. {
  679. rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  680. }
  681. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1);
  682. }
  683. else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2))
  684. {
  685. if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2))
  686. {
  687. rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  688. }
  689. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2);
  690. }
  691. else
  692. {
  693. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR0))/*IF AutoRetransmission = ENABLE,ACK ERR handler*/
  694. {
  695. SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);/*Abort the send request, trigger the TX interrupt,release completion quantity*/
  696. }
  697. else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR1))
  698. {
  699. SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1);
  700. }
  701. else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR2))
  702. {
  703. SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2);
  704. }
  705. }
  706. break;
  707. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  708. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  709. can->status.biterrcnt++;
  710. break;
  711. case RT_CAN_BUS_CRC_ERR:
  712. can->status.crcerrcnt++;
  713. break;
  714. }
  715. can->status.lasterrtype = errtype & 0x70;
  716. can->status.rcverrcnt = errtype >> 24;
  717. can->status.snderrcnt = (errtype >> 16 & 0xFF);
  718. can->status.errcode = errtype & 0x07;
  719. hcan->Instance->MSR |= CAN_MSR_ERRI;
  720. }
  721. static void _can_tx_isr(struct rt_can_device *can)
  722. {
  723. CAN_HandleTypeDef *hcan;
  724. RT_ASSERT(can);
  725. hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle;
  726. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0))
  727. {
  728. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0))
  729. {
  730. rt_hw_can_isr(can, RT_CAN_EVENT_TX_DONE | 0 << 8);
  731. }
  732. else
  733. {
  734. rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  735. }
  736. /* Write 0 to Clear transmission status flag RQCPx */
  737. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0);
  738. }
  739. else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1))
  740. {
  741. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1))
  742. {
  743. rt_hw_can_isr(can, RT_CAN_EVENT_TX_DONE | 1 << 8);
  744. }
  745. else
  746. {
  747. rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  748. }
  749. /* Write 0 to Clear transmission status flag RQCPx */
  750. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1);
  751. }
  752. else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2))
  753. {
  754. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2))
  755. {
  756. rt_hw_can_isr(can, RT_CAN_EVENT_TX_DONE | 2 << 8);
  757. }
  758. else
  759. {
  760. rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  761. }
  762. /* Write 0 to Clear transmission status flag RQCPx */
  763. SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2);
  764. }
  765. }
  766. #ifdef BSP_USING_CAN1
  767. /**
  768. * @brief This function handles CAN1 TX interrupts. transmit fifo0/1/2 is empty can trigger this interrupt
  769. */
  770. void CAN1_TX_IRQHandler(void)
  771. {
  772. rt_interrupt_enter();
  773. _can_tx_isr(&drv_can1.device);
  774. rt_interrupt_leave();
  775. }
  776. /**
  777. * @brief This function handles CAN1 RX0 interrupts.
  778. */
  779. void CAN1_RX0_IRQHandler(void)
  780. {
  781. rt_interrupt_enter();
  782. _can_rx_isr(&drv_can1.device, CAN_RX_FIFO0);
  783. rt_interrupt_leave();
  784. }
  785. /**
  786. * @brief This function handles CAN1 RX1 interrupts.
  787. */
  788. void CAN1_RX1_IRQHandler(void)
  789. {
  790. rt_interrupt_enter();
  791. _can_rx_isr(&drv_can1.device, CAN_RX_FIFO1);
  792. rt_interrupt_leave();
  793. }
  794. /**
  795. * @brief This function handles CAN1 SCE interrupts.
  796. */
  797. void CAN1_SCE_IRQHandler(void)
  798. {
  799. rt_interrupt_enter();
  800. _can_sce_isr(&drv_can1.device);
  801. rt_interrupt_leave();
  802. }
  803. #endif /* BSP_USING_CAN1 */
  804. #ifdef BSP_USING_CAN2
  805. /**
  806. * @brief This function handles CAN2 TX interrupts.
  807. */
  808. void CAN2_TX_IRQHandler(void)
  809. {
  810. rt_interrupt_enter();
  811. _can_tx_isr(&drv_can2.device);
  812. rt_interrupt_leave();
  813. }
  814. /**
  815. * @brief This function handles CAN2 RX0 interrupts.
  816. */
  817. void CAN2_RX0_IRQHandler(void)
  818. {
  819. rt_interrupt_enter();
  820. _can_rx_isr(&drv_can2.device, CAN_RX_FIFO0);
  821. rt_interrupt_leave();
  822. }
  823. /**
  824. * @brief This function handles CAN2 RX1 interrupts.
  825. */
  826. void CAN2_RX1_IRQHandler(void)
  827. {
  828. rt_interrupt_enter();
  829. _can_rx_isr(&drv_can2.device, CAN_RX_FIFO1);
  830. rt_interrupt_leave();
  831. }
  832. /**
  833. * @brief This function handles CAN2 SCE interrupts.
  834. */
  835. void CAN2_SCE_IRQHandler(void)
  836. {
  837. rt_interrupt_enter();
  838. _can_sce_isr(&drv_can2.device);
  839. rt_interrupt_leave();
  840. }
  841. #endif /* BSP_USING_CAN2 */
  842. /**
  843. * @brief Error CAN callback.
  844. * @param hcan pointer to a CAN_HandleTypeDef structure that contains
  845. * the configuration information for the specified CAN.
  846. * @retval None
  847. */
  848. void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
  849. {
  850. __HAL_CAN_ENABLE_IT(hcan, CAN_IT_ERROR_WARNING |
  851. CAN_IT_ERROR_PASSIVE |
  852. CAN_IT_BUSOFF |
  853. CAN_IT_LAST_ERROR_CODE |
  854. CAN_IT_ERROR |
  855. CAN_IT_RX_FIFO0_MSG_PENDING |
  856. CAN_IT_RX_FIFO0_OVERRUN |
  857. CAN_IT_RX_FIFO0_FULL |
  858. CAN_IT_RX_FIFO1_MSG_PENDING |
  859. CAN_IT_RX_FIFO1_OVERRUN |
  860. CAN_IT_RX_FIFO1_FULL |
  861. CAN_IT_TX_MAILBOX_EMPTY);
  862. }
  863. int rt_hw_can_init(void)
  864. {
  865. struct can_configure config = CANDEFAULTCONFIG;
  866. config.privmode = RT_CAN_MODE_NOPRIV;
  867. config.ticks = 50;
  868. #ifdef RT_CAN_USING_HDR
  869. config.maxhdr = 14;
  870. #ifdef CAN2
  871. config.maxhdr = 28;
  872. #endif
  873. #endif
  874. /* config default filter */
  875. CAN_FilterTypeDef filterConf = {0};
  876. filterConf.FilterIdHigh = 0x0000;
  877. filterConf.FilterIdLow = 0x0000;
  878. filterConf.FilterMaskIdHigh = 0x0000;
  879. filterConf.FilterMaskIdLow = 0x0000;
  880. filterConf.FilterFIFOAssignment = CAN_FILTER_FIFO0;
  881. filterConf.FilterBank = 0;
  882. filterConf.FilterMode = CAN_FILTERMODE_IDMASK;
  883. filterConf.FilterScale = CAN_FILTERSCALE_32BIT;
  884. filterConf.FilterActivation = ENABLE;
  885. filterConf.SlaveStartFilterBank = 14;
  886. #ifdef BSP_USING_CAN1
  887. filterConf.FilterBank = 0;
  888. drv_can1.FilterConfig = filterConf;
  889. drv_can1.device.config = config;
  890. /* register CAN1 device */
  891. rt_hw_can_register(&drv_can1.device,
  892. drv_can1.name,
  893. &_can_ops,
  894. &drv_can1);
  895. #endif /* BSP_USING_CAN1 */
  896. #ifdef BSP_USING_CAN2
  897. filterConf.FilterBank = filterConf.SlaveStartFilterBank;
  898. drv_can2.FilterConfig = filterConf;
  899. drv_can2.device.config = config;
  900. /* register CAN2 device */
  901. rt_hw_can_register(&drv_can2.device,
  902. drv_can2.name,
  903. &_can_ops,
  904. &drv_can2);
  905. #endif /* BSP_USING_CAN2 */
  906. return 0;
  907. }
  908. INIT_BOARD_EXPORT(rt_hw_can_init);
  909. #endif /* BSP_USING_CAN */
  910. /************************** end of file ******************/