1
0

drv_can.c 33 KB

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