drv_can.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-10-19 Nations first version
  9. */
  10. #include <drv_can.h>
  11. #ifdef RT_USING_CAN
  12. #if defined(BSP_USING_CAN) || defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2)
  13. #if defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  14. #ifdef BSP_USING_CAN
  15. static struct n32_can drv_can =
  16. {
  17. .name = "bxcan",
  18. .CANx = CAN,
  19. };
  20. #endif
  21. #endif
  22. #ifdef BSP_USING_CAN1
  23. static struct n32_can drv_can1 =
  24. {
  25. .name = "bxcan1",
  26. .CANx = CAN1,
  27. };
  28. #endif
  29. #ifdef BSP_USING_CAN2
  30. static struct n32_can drv_can2 =
  31. {
  32. .name = "bxcan2",
  33. .CANx = CAN2,
  34. };
  35. #endif
  36. #if defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  37. #ifdef BSP_USING_CAN
  38. static void bxcan_hw_init(void)
  39. {
  40. GPIO_InitType GPIO_InitStructure;
  41. RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_CAN, ENABLE);
  42. RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB | RCC_APB2_PERIPH_AFIO, ENABLE);
  43. GPIO_InitStruct(&GPIO_InitStructure);
  44. /* Configure CAN_TX PB9 and CAN_RX PB8 */
  45. GPIO_InitStructure.Pin = GPIO_PIN_9;
  46. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  47. GPIO_InitStructure.GPIO_Pull = GPIO_Pull_Up;
  48. GPIO_InitStructure.GPIO_Alternate = GPIO_AF5_CAN;
  49. GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
  50. GPIO_InitStructure.Pin = GPIO_PIN_8;
  51. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Input;
  52. GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
  53. }
  54. #endif
  55. #endif
  56. #ifdef BSP_USING_CAN1
  57. static void bxcan1_hw_init(void)
  58. {
  59. GPIO_InitType GPIO_InitStructure;
  60. RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB | RCC_APB2_PERIPH_AFIO, ENABLE);
  61. RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_CAN1, ENABLE);
  62. GPIO_InitStruct(&GPIO_InitStructure);
  63. /* Configure CAN1_TX PB9 and CAN1_RX PB8 */
  64. GPIO_InitStructure.Pin = GPIO_PIN_8;
  65. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  66. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  67. GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
  68. GPIO_InitStructure.Pin = GPIO_PIN_9;
  69. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  70. GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
  71. /* Remap CAN1 GPIOs */
  72. GPIO_ConfigPinRemap(GPIO_RMP2_CAN1, ENABLE);
  73. }
  74. #endif /* BSP_USING_CAN1 */
  75. #ifdef BSP_USING_CAN2
  76. static void bxcan2_hw_init(void)
  77. {
  78. GPIO_InitType GPIO_InitStructure;
  79. RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
  80. RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_CAN2, ENABLE);
  81. GPIO_InitStruct(&GPIO_InitStructure);
  82. /* Configure CAN2_TX PB13 and CAN2_RX PB12 */
  83. GPIO_InitStructure.Pin = GPIO_PIN_12;
  84. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  85. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  86. GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
  87. GPIO_InitStructure.Pin = GPIO_PIN_13;
  88. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  89. GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
  90. }
  91. #endif /* BSP_USING_CAN2 */
  92. /* baud calculation example: Tclk / ((ss + bs1 + bs2) * brp), 36 / ((1 + 8 + 3) * 3) = 1MHz*/
  93. #if defined(SOC_N32G45X) || defined(SOC_N32WB452) || defined(SOC_N32G4FR) /* APB1 36MHz(max) */
  94. static const struct n32_baud_rate_tab can_baud_rate_tab[] =
  95. {
  96. N32_CAN_BAUD_DEF(CAN1MBaud, CAN_RSJW_1tq, CAN_TBS1_5tq, CAN_TBS2_3tq, 4),
  97. N32_CAN_BAUD_DEF(CAN800kBaud, CAN_RSJW_1tq, CAN_TBS1_5tq, CAN_TBS2_3tq, 5),
  98. N32_CAN_BAUD_DEF(CAN500kBaud, CAN_RSJW_1tq, CAN_TBS1_5tq, CAN_TBS2_3tq, 8),
  99. N32_CAN_BAUD_DEF(CAN250kBaud, CAN_RSJW_1tq, CAN_TBS1_5tq, CAN_TBS2_3tq, 16),
  100. N32_CAN_BAUD_DEF(CAN125kBaud, CAN_RSJW_1tq, CAN_TBS1_5tq, CAN_TBS2_3tq, 32),
  101. N32_CAN_BAUD_DEF(CAN100kBaud, CAN_RSJW_2tq, CAN_TBS1_9tq, CAN_TBS2_8tq, 20),
  102. N32_CAN_BAUD_DEF(CAN50kBaud, CAN_RSJW_2tq, CAN_TBS1_9tq, CAN_TBS2_8tq, 40),
  103. N32_CAN_BAUD_DEF(CAN20kBaud, CAN_RSJW_2tq, CAN_TBS1_9tq, CAN_TBS2_8tq, 100),
  104. N32_CAN_BAUD_DEF(CAN10kBaud, CAN_RSJW_2tq, CAN_TBS1_9tq, CAN_TBS2_8tq, 200),
  105. };
  106. #endif /* SOC_N32G45X SOC_N32WB452 */
  107. #if defined(SOC_N32L43X) || defined(SOC_N32G43X) /* APB1 27MHz(max) */
  108. static const struct n32_baud_rate_tab can_baud_rate_tab[] =
  109. {
  110. N32_CAN_BAUD_DEF(CAN1MBaud, CAN_RSJW_1tq, CAN_TBS1_6tq, CAN_TBS2_2tq, 3),
  111. N32_CAN_BAUD_DEF(CAN500kBaud, CAN_RSJW_1tq, CAN_TBS1_6tq, CAN_TBS2_2tq, 6),
  112. N32_CAN_BAUD_DEF(CAN250kBaud, CAN_RSJW_1tq, CAN_TBS1_9tq, CAN_TBS2_8tq, 6),
  113. N32_CAN_BAUD_DEF(CAN125kBaud, CAN_RSJW_1tq, CAN_TBS1_9tq, CAN_TBS2_8tq, 12),
  114. N32_CAN_BAUD_DEF(CAN100kBaud, CAN_RSJW_2tq, CAN_TBS1_5tq, CAN_TBS2_3tq, 30),
  115. N32_CAN_BAUD_DEF(CAN50kBaud, CAN_RSJW_2tq, CAN_TBS1_5tq, CAN_TBS2_3tq, 60),
  116. N32_CAN_BAUD_DEF(CAN20kBaud, CAN_RSJW_2tq, CAN_TBS1_5tq, CAN_TBS2_3tq, 150),
  117. N32_CAN_BAUD_DEF(CAN10kBaud, CAN_RSJW_1tq, CAN_TBS1_9tq, CAN_TBS2_8tq, 150),
  118. };
  119. #endif /* SOC_N32L43X */
  120. #if defined(SOC_N32L40X) /* APB1 16MHz(max) */
  121. static const struct n32_baud_rate_tab can_baud_rate_tab[] =
  122. {
  123. N32_CAN_BAUD_DEF(CAN1MBaud, CAN_RSJW_1tq, CAN_TBS1_5tq, CAN_TBS2_2tq, 2),
  124. N32_CAN_BAUD_DEF(CAN800kBaud, CAN_RSJW_1tq, CAN_TBS1_2tq, CAN_TBS2_1tq, 5),
  125. N32_CAN_BAUD_DEF(CAN500kBaud, CAN_RSJW_1tq, CAN_TBS1_5tq, CAN_TBS2_2tq, 4),
  126. N32_CAN_BAUD_DEF(CAN250kBaud, CAN_RSJW_1tq, CAN_TBS1_5tq, CAN_TBS2_2tq, 8),
  127. N32_CAN_BAUD_DEF(CAN125kBaud, CAN_RSJW_1tq, CAN_TBS1_5tq, CAN_TBS2_2tq, 16),
  128. N32_CAN_BAUD_DEF(CAN100kBaud, CAN_RSJW_1tq, CAN_TBS1_5tq, CAN_TBS2_2tq, 20),
  129. N32_CAN_BAUD_DEF(CAN50kBaud, CAN_RSJW_1tq, CAN_TBS1_5tq, CAN_TBS2_2tq, 40),
  130. N32_CAN_BAUD_DEF(CAN20kBaud, CAN_RSJW_1tq, CAN_TBS1_5tq, CAN_TBS2_2tq, 100),
  131. N32_CAN_BAUD_DEF(CAN10kBaud, CAN_RSJW_1tq, CAN_TBS1_9tq, CAN_TBS2_6tq, 100),
  132. };
  133. #endif /* SOC_N32L40X */
  134. static rt_uint32_t get_can_baud_index(rt_uint32_t baud)
  135. {
  136. rt_uint32_t len, index;
  137. len = sizeof(can_baud_rate_tab) / sizeof(can_baud_rate_tab[0]);
  138. for(index = 0; index < len; index++)
  139. {
  140. if (can_baud_rate_tab[index].baud_rate == baud)
  141. return index;
  142. }
  143. return 0; /* default baud is CAN1MBaud */
  144. }
  145. static rt_err_t setfilter(struct n32_can *drv_can)
  146. {
  147. #if defined(SOC_N32G45X) || defined(SOC_N32WB452) || defined(SOC_N32G4FR)
  148. if (drv_can->CANx == CAN1)
  149. {
  150. CAN1_InitFilter(&(drv_can->FilterConfig));
  151. }
  152. #ifdef CAN2
  153. else if (drv_can->CANx == CAN2)
  154. {
  155. CAN2_InitFilter(&(drv_can->FilterConfig));
  156. }
  157. #endif
  158. #elif defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  159. if (drv_can->CANx == CAN)
  160. {
  161. CAN_InitFilter(&(drv_can->FilterConfig));
  162. }
  163. #endif
  164. else
  165. {
  166. rt_kprintf("Can filter config error\n");
  167. return -RT_EINVAL;
  168. }
  169. return RT_EOK;
  170. }
  171. static rt_err_t bxcan_init(struct rt_can_device *can, struct can_configure *cfg)
  172. {
  173. struct n32_can *drv_can;
  174. rt_uint32_t baud_index;
  175. RT_ASSERT(can);
  176. RT_ASSERT(cfg);
  177. drv_can = (struct n32_can *)can->parent.user_data;
  178. RT_ASSERT(drv_can);
  179. /* Struct init*/
  180. CAN_InitStruct(&(drv_can->can_init));
  181. drv_can->can_init.TTCM = DISABLE;
  182. drv_can->can_init.ABOM = DISABLE;
  183. drv_can->can_init.AWKUM = DISABLE;
  184. drv_can->can_init.NART = DISABLE;
  185. drv_can->can_init.RFLM = DISABLE;
  186. drv_can->can_init.TXFP = ENABLE;
  187. // Mode
  188. switch (cfg->mode)
  189. {
  190. case RT_CAN_MODE_NORMAL:
  191. drv_can->can_init.OperatingMode = CAN_Normal_Mode;
  192. break;
  193. case RT_CAN_MODE_LISTEN:
  194. drv_can->can_init.OperatingMode = CAN_Silent_Mode;
  195. break;
  196. case RT_CAN_MODE_LOOPBACK:
  197. drv_can->can_init.OperatingMode = CAN_LoopBack_Mode;
  198. break;
  199. case RT_CAN_MODE_LOOPBACKANLISTEN:
  200. drv_can->can_init.OperatingMode = CAN_Silent_LoopBack_Mode;
  201. break;
  202. default:
  203. drv_can->can_init.OperatingMode = CAN_Normal_Mode;
  204. break;
  205. }
  206. // Baud
  207. baud_index = get_can_baud_index(cfg->baud_rate);
  208. drv_can->can_init.RSJW = can_baud_rate_tab[baud_index].RSJW;
  209. drv_can->can_init.TBS1 = can_baud_rate_tab[baud_index].TBS1;
  210. drv_can->can_init.TBS2 = can_baud_rate_tab[baud_index].TBS2;
  211. drv_can->can_init.BaudRatePrescaler = can_baud_rate_tab[baud_index].PRESCALE;
  212. /* init can */
  213. if (CAN_Init(drv_can->CANx, &(drv_can->can_init)) != CAN_InitSTS_Success)
  214. {
  215. rt_kprintf("Can init error\n");
  216. return -RT_ERROR;
  217. }
  218. /* default filter config */
  219. setfilter(drv_can);
  220. return RT_EOK;
  221. }
  222. static rt_err_t configure(struct rt_can_device *can, struct can_configure *cfg)
  223. {
  224. struct n32_can *drv_can;
  225. CAN_Module *pbxcan;
  226. drv_can = (struct n32_can *)can->parent.user_data;
  227. pbxcan = drv_can->CANx;
  228. #if defined(SOC_N32G45X) || defined(SOC_N32WB452) || defined(SOC_N32G4FR)
  229. if (pbxcan == CAN1)
  230. {
  231. #ifdef BSP_USING_CAN1
  232. bxcan1_hw_init();
  233. bxcan_init(&drv_can->device, &drv_can->device.config);
  234. #endif
  235. }
  236. else if (pbxcan == CAN2)
  237. {
  238. #ifdef BSP_USING_CAN2
  239. bxcan2_hw_init();
  240. bxcan_init(&drv_can->device, &drv_can->device.config);
  241. #endif
  242. }
  243. #endif
  244. #if defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  245. if (pbxcan == CAN)
  246. {
  247. #ifdef BSP_USING_CAN
  248. bxcan_hw_init();
  249. bxcan_init(&drv_can->device, &drv_can->device.config);
  250. #endif
  251. }
  252. #endif
  253. return RT_EOK;
  254. }
  255. /**
  256. * @brief Configures the NVIC for CAN.
  257. */
  258. void CAN_NVIC_Config(IRQn_Type IRQn, uint8_t PreemptionPriority, uint8_t SubPriority,FunctionalState cmd)
  259. {
  260. NVIC_InitType NVIC_InitStructure;
  261. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  262. NVIC_InitStructure.NVIC_IRQChannel = IRQn;
  263. NVIC_InitStructure.NVIC_IRQChannelCmd = cmd;
  264. if (cmd)
  265. {
  266. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriority;
  267. NVIC_InitStructure.NVIC_IRQChannelSubPriority = SubPriority;
  268. }
  269. NVIC_Init(&NVIC_InitStructure);
  270. }
  271. static rt_err_t control(struct rt_can_device *can, int cmd, void *arg)
  272. {
  273. rt_uint32_t argval;
  274. struct n32_can *drv_can;
  275. struct rt_can_filter_config *filter_cfg;
  276. RT_ASSERT(can != RT_NULL);
  277. drv_can = (struct n32_can *)can->parent.user_data;
  278. RT_ASSERT(drv_can != RT_NULL);
  279. switch (cmd)
  280. {
  281. case RT_DEVICE_CTRL_CLR_INT:
  282. argval = (rt_uint32_t) arg;
  283. if (argval == RT_DEVICE_FLAG_INT_RX)
  284. {
  285. #if defined(SOC_N32G45X) || defined(SOC_N32WB452) || defined(SOC_N32G4FR)
  286. if (CAN1 == drv_can->CANx)
  287. {
  288. NVIC_DisableIRQ(USB_LP_CAN1_RX0_IRQn);
  289. NVIC_DisableIRQ(CAN1_RX1_IRQn);
  290. }
  291. #ifdef CAN2
  292. if (CAN2 == drv_can->CANx)
  293. {
  294. NVIC_DisableIRQ(CAN2_RX0_IRQn);
  295. NVIC_DisableIRQ(CAN2_RX1_IRQn);
  296. }
  297. #endif
  298. #elif defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  299. if (CAN == drv_can->CANx)
  300. {
  301. NVIC_DisableIRQ(CAN_RX0_IRQn);
  302. NVIC_DisableIRQ(CAN_RX1_IRQn);
  303. }
  304. #endif
  305. CAN_INTConfig(drv_can->CANx, CAN_INT_FMP0, DISABLE); /* DATFIFO 0 message pending Interrupt */
  306. CAN_INTConfig(drv_can->CANx, CAN_INT_FF0, DISABLE); /* DATFIFO 0 full Interrupt */
  307. CAN_INTConfig(drv_can->CANx, CAN_INT_FOV0, DISABLE); /* DATFIFO 0 overrun Interrupt */
  308. CAN_INTConfig(drv_can->CANx, CAN_INT_FMP1, DISABLE); /* DATFIFO 1 message pending Interrupt */
  309. CAN_INTConfig(drv_can->CANx, CAN_INT_FF1, DISABLE); /* DATFIFO 1 full Interrupt */
  310. CAN_INTConfig(drv_can->CANx, CAN_INT_FOV1, DISABLE); /* DATFIFO 1 overrun Interrupt */
  311. }
  312. else if (argval == RT_DEVICE_FLAG_INT_TX)
  313. {
  314. #if defined(SOC_N32G45X) || defined(SOC_N32WB452)
  315. if (CAN1 == drv_can->CANx)
  316. {
  317. NVIC_DisableIRQ(USB_HP_CAN1_TX_IRQn);
  318. }
  319. #ifdef CAN2
  320. if (CAN2 == drv_can->CANx)
  321. {
  322. NVIC_DisableIRQ(CAN2_TX_IRQn);
  323. }
  324. #endif
  325. #elif defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  326. if (CAN == drv_can->CANx)
  327. {
  328. NVIC_DisableIRQ(CAN_TX_IRQn);
  329. }
  330. #endif
  331. CAN_INTConfig(drv_can->CANx, CAN_INT_TME, DISABLE); /* Transmit mailbox empty Interrupt */
  332. }
  333. else if (argval == RT_DEVICE_CAN_INT_ERR)
  334. {
  335. #if defined(SOC_N32G45X) || defined(SOC_N32WB452) || defined(SOC_N32G4FR)
  336. if (CAN1 == drv_can->CANx)
  337. {
  338. NVIC_DisableIRQ(CAN1_SCE_IRQn);
  339. }
  340. #ifdef CAN2
  341. if (CAN2 == drv_can->CANx)
  342. {
  343. NVIC_DisableIRQ(CAN2_SCE_IRQn);
  344. }
  345. #endif
  346. #elif defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  347. if (CAN == drv_can->CANx)
  348. {
  349. NVIC_DisableIRQ(CAN_SCE_IRQn);
  350. }
  351. #endif
  352. CAN_INTConfig(drv_can->CANx, CAN_INT_EWG, DISABLE); /* Error warning Interrupt */
  353. CAN_INTConfig(drv_can->CANx, CAN_INT_EPV, DISABLE); /* Error passive Interrupt */
  354. CAN_INTConfig(drv_can->CANx, CAN_INT_BOF, DISABLE); /* Bus-off Interrupt */
  355. CAN_INTConfig(drv_can->CANx, CAN_INT_LEC, DISABLE); /* Last error code Interrupt */
  356. CAN_INTConfig(drv_can->CANx, CAN_INT_ERR, DISABLE); /* Error Interrupt */
  357. }
  358. break;
  359. case RT_DEVICE_CTRL_SET_INT:
  360. argval = (rt_uint32_t) arg;
  361. if (argval == RT_DEVICE_FLAG_INT_RX)
  362. {
  363. CAN_INTConfig(drv_can->CANx, CAN_INT_FMP0, ENABLE); /* DATFIFO 0 message pending Interrupt */
  364. CAN_INTConfig(drv_can->CANx, CAN_INT_FF0, ENABLE); /* DATFIFO 0 full Interrupt */
  365. CAN_INTConfig(drv_can->CANx, CAN_INT_FOV0, ENABLE); /* DATFIFO 0 overrun Interrupt */
  366. CAN_INTConfig(drv_can->CANx, CAN_INT_FMP1, ENABLE); /* DATFIFO 1 message pending Interrupt */
  367. CAN_INTConfig(drv_can->CANx, CAN_INT_FF1, ENABLE); /* DATFIFO 1 full Interrupt */
  368. CAN_INTConfig(drv_can->CANx, CAN_INT_FOV1, ENABLE); /* DATFIFO 1 overrun Interrupt */
  369. #if defined(SOC_N32G45X) || defined(SOC_N32WB452) || defined(SOC_N32G4FR)
  370. if (CAN1 == drv_can->CANx)
  371. {
  372. CAN_NVIC_Config(USB_LP_CAN1_RX0_IRQn, 1, 0, ENABLE);
  373. CAN_NVIC_Config(CAN1_RX1_IRQn, 1, 0, ENABLE);
  374. }
  375. #ifdef CAN2
  376. if (CAN2 == drv_can->CANx)
  377. {
  378. CAN_NVIC_Config(CAN2_RX0_IRQn, 1, 0, ENABLE);
  379. CAN_NVIC_Config(CAN2_RX1_IRQn, 1, 0, ENABLE);
  380. }
  381. #endif
  382. #elif defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  383. if (CAN == drv_can->CANx)
  384. {
  385. CAN_NVIC_Config(CAN_RX0_IRQn, 1, 0, ENABLE);
  386. CAN_NVIC_Config(CAN_RX1_IRQn, 1, 0, ENABLE);
  387. }
  388. #endif
  389. }
  390. else if (argval == RT_DEVICE_FLAG_INT_TX)
  391. {
  392. CAN_INTConfig(drv_can->CANx, CAN_INT_TME, ENABLE); /* Transmit mailbox empty Interrupt */
  393. #if defined(SOC_N32G45X) || defined(SOC_N32WB452) || defined(SOC_N32G4FR)
  394. if (CAN1 == drv_can->CANx)
  395. {
  396. CAN_NVIC_Config(USB_HP_CAN1_TX_IRQn, 1, 0, ENABLE);
  397. }
  398. #ifdef CAN2
  399. if (CAN2 == drv_can->CANx)
  400. {
  401. CAN_NVIC_Config(CAN2_TX_IRQn, 1, 0, ENABLE);
  402. }
  403. #endif
  404. #elif defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  405. if (CAN == drv_can->CANx)
  406. {
  407. CAN_NVIC_Config(CAN_TX_IRQn, 1, 0, ENABLE);
  408. }
  409. #endif
  410. }
  411. else if (argval == RT_DEVICE_CAN_INT_ERR)
  412. {
  413. CAN_INTConfig(drv_can->CANx, CAN_INT_EWG, ENABLE); /* Error warning Interrupt */
  414. CAN_INTConfig(drv_can->CANx, CAN_INT_EPV, ENABLE); /* Error passive Interrupt */
  415. CAN_INTConfig(drv_can->CANx, CAN_INT_BOF, ENABLE); /* Bus-off Interrupt */
  416. CAN_INTConfig(drv_can->CANx, CAN_INT_LEC, ENABLE); /* Last error code Interrupt */
  417. CAN_INTConfig(drv_can->CANx, CAN_INT_ERR, ENABLE); /* Error Interrupt */
  418. #if defined(SOC_N32G45X) || defined(SOC_N32WB452) || defined(SOC_N32G4FR)
  419. if (CAN1 == drv_can->CANx)
  420. {
  421. CAN_NVIC_Config(CAN1_SCE_IRQn, 1, 0, ENABLE);
  422. }
  423. #ifdef CAN2
  424. if (CAN2 == drv_can->CANx)
  425. {
  426. CAN_NVIC_Config(CAN2_SCE_IRQn, 1, 0, ENABLE);
  427. }
  428. #endif
  429. #elif defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  430. if (CAN == drv_can->CANx)
  431. {
  432. CAN_NVIC_Config(CAN_SCE_IRQn, 1, 0, ENABLE);
  433. }
  434. #endif
  435. }
  436. break;
  437. case RT_CAN_CMD_SET_FILTER:
  438. {
  439. rt_uint32_t id_h = 0;
  440. rt_uint32_t id_l = 0;
  441. rt_uint32_t mask_h = 0;
  442. rt_uint32_t mask_l = 0;
  443. rt_uint32_t mask_l_tail = 0; //CAN_FxR2 bit [2:0]
  444. if (RT_NULL == arg)
  445. {
  446. /* Default filter config */
  447. setfilter(drv_can);
  448. }
  449. else
  450. {
  451. filter_cfg = (struct rt_can_filter_config *)arg;
  452. /* Get default filter */
  453. for(int i = 0; i < filter_cfg->count; i++)
  454. {
  455. if (filter_cfg->items[i].hdr_bank == -1)
  456. {
  457. /* Can banks 0~13 */
  458. drv_can->FilterConfig.Filter_Num = i;
  459. }
  460. else
  461. {
  462. /* Use user-defined filter bank settings */
  463. drv_can->FilterConfig.Filter_Num = filter_cfg->items[i].hdr_bank;
  464. }
  465. /* Filter groups work in identifier masking bit mode */
  466. if (filter_cfg->items[i].mode == CAN_Filter_IdMaskMode)
  467. {
  468. /* make sure the IDE and RTR work */
  469. mask_l_tail = 0x06;
  470. drv_can->FilterConfig.Filter_Mode = CAN_Filter_IdMaskMode;
  471. }
  472. /* Filter groups work in identifier list mode */
  473. else if (filter_cfg->items[i].mode == CAN_Filter_IdListMode)
  474. {
  475. mask_l_tail = (filter_cfg->items[i].ide << 2) | (filter_cfg->items[i].rtr << 1);
  476. drv_can->FilterConfig.Filter_Mode = CAN_Filter_IdListMode;
  477. }
  478. if (filter_cfg->items[i].ide == RT_CAN_STDID)
  479. {
  480. id_h = ((filter_cfg->items[i].id << 18) >> 13) & 0xFFFF;
  481. id_l = ((filter_cfg->items[i].id << 18) |
  482. (filter_cfg->items[i].ide << 2) |
  483. (filter_cfg->items[i].rtr << 1)) & 0xFFFF;
  484. mask_h = ((filter_cfg->items[i].mask << 21) >> 16) & 0xFFFF;
  485. mask_l = ((filter_cfg->items[i].mask << 21) | mask_l_tail) & 0xFFFF;
  486. }
  487. else if (filter_cfg->items[i].ide == RT_CAN_EXTID)
  488. {
  489. id_h = (filter_cfg->items[i].id >> 13) & 0xFFFF;
  490. id_l = ((filter_cfg->items[i].id << 3) |
  491. (filter_cfg->items[i].ide << 2) |
  492. (filter_cfg->items[i].rtr << 1)) & 0xFFFF;
  493. mask_h = ((filter_cfg->items[i].mask << 3) >> 16) & 0xFFFF;
  494. mask_l = ((filter_cfg->items[i].mask << 3) | mask_l_tail) & 0xFFFF;
  495. }
  496. drv_can->FilterConfig.Filter_HighId = id_h;
  497. drv_can->FilterConfig.Filter_LowId = id_l;
  498. drv_can->FilterConfig.FilterMask_HighId = mask_h;
  499. drv_can->FilterConfig.FilterMask_LowId = mask_l;
  500. drv_can->FilterConfig.Filter_FIFOAssignment = CAN_FIFO0;
  501. drv_can->FilterConfig.Filter_Scale = CAN_Filter_32bitScale;
  502. drv_can->FilterConfig.Filter_Act = ENABLE;
  503. /* Filter conf */
  504. setfilter(drv_can);
  505. }
  506. }
  507. break;
  508. }
  509. case RT_CAN_CMD_SET_MODE:
  510. argval = (rt_uint32_t) arg;
  511. if (argval != RT_CAN_MODE_NORMAL &&
  512. argval != RT_CAN_MODE_LISTEN &&
  513. argval != RT_CAN_MODE_LOOPBACK &&
  514. argval != RT_CAN_MODE_LOOPBACKANLISTEN)
  515. {
  516. return -RT_ERROR;
  517. }
  518. if (argval != drv_can->device.config.mode)
  519. {
  520. drv_can->device.config.mode = argval;
  521. return configure(&drv_can->device, &drv_can->device.config);
  522. }
  523. break;
  524. case RT_CAN_CMD_SET_BAUD:
  525. argval = (rt_uint32_t) arg;
  526. if (argval != CAN1MBaud &&
  527. argval != CAN800kBaud &&
  528. argval != CAN500kBaud &&
  529. argval != CAN250kBaud &&
  530. argval != CAN125kBaud &&
  531. argval != CAN100kBaud &&
  532. argval != CAN50kBaud &&
  533. argval != CAN20kBaud &&
  534. argval != CAN10kBaud)
  535. {
  536. return -RT_ERROR;
  537. }
  538. if (argval != drv_can->device.config.baud_rate)
  539. {
  540. drv_can->device.config.baud_rate = argval;
  541. return configure(&drv_can->device, &drv_can->device.config);
  542. }
  543. break;
  544. case RT_CAN_CMD_SET_PRIV:
  545. argval = (rt_uint32_t) arg;
  546. if (argval != RT_CAN_MODE_PRIV &&
  547. argval != RT_CAN_MODE_NOPRIV)
  548. {
  549. return -RT_ERROR;
  550. }
  551. if (argval != drv_can->device.config.privmode)
  552. {
  553. drv_can->device.config.privmode = argval;
  554. return configure(&drv_can->device, &drv_can->device.config);
  555. }
  556. break;
  557. case RT_CAN_CMD_GET_STATUS:
  558. {
  559. rt_uint32_t errtype;
  560. errtype = drv_can->CANx->ESTS;
  561. drv_can->device.status.rcverrcnt = errtype >> 24;
  562. drv_can->device.status.snderrcnt = (errtype >> 16 & 0xFF);
  563. drv_can->device.status.lasterrtype = errtype & 0x70;
  564. drv_can->device.status.errcode = errtype & 0x07;
  565. rt_memcpy(arg, &drv_can->device.status, sizeof(drv_can->device.status));
  566. }
  567. break;
  568. }
  569. return RT_EOK;
  570. }
  571. /* CAN Mailbox Transmit Request */
  572. #define TMIDxR_TXRQ ((uint32_t)0x00000001)
  573. static int can_sendmsg_rtmsg(CAN_Module *CANx, struct rt_can_msg *pmsg, uint32_t mailbox_index)
  574. {
  575. CanTxMessage CAN_TxMessage = {0};
  576. CanTxMessage *TxMessage = &CAN_TxMessage;
  577. /* Check the parameters */
  578. assert_param(IS_CAN_ALL_PERIPH(CANx));
  579. if (RT_CAN_STDID == pmsg->ide)
  580. {
  581. TxMessage->IDE = CAN_Standard_Id;
  582. RT_ASSERT(IS_CAN_STDID(pmsg->id));
  583. TxMessage->StdId = pmsg->id;
  584. }
  585. else
  586. {
  587. TxMessage->IDE = CAN_Extended_Id;
  588. RT_ASSERT(IS_CAN_EXTID(pmsg->id));
  589. TxMessage->ExtId = pmsg->id;
  590. }
  591. if (RT_CAN_DTR == pmsg->rtr)
  592. {
  593. TxMessage->RTR = CAN_RTRQ_DATA;
  594. }
  595. else
  596. {
  597. TxMessage->RTR = CAN_RTRQ_REMOTE;
  598. }
  599. if (mailbox_index != CAN_TxSTS_NoMailBox)
  600. {
  601. /* Set up the Id */
  602. CANx->sTxMailBox[mailbox_index].TMI &= TMIDxR_TXRQ;
  603. if (TxMessage->IDE == CAN_Standard_Id)
  604. {
  605. assert_param(IS_CAN_STDID(TxMessage->StdId));
  606. CANx->sTxMailBox[mailbox_index].TMI |= ((TxMessage->StdId << 21) | TxMessage->RTR);
  607. }
  608. else
  609. {
  610. assert_param(IS_CAN_EXTID(TxMessage->ExtId));
  611. CANx->sTxMailBox[mailbox_index].TMI |= ((TxMessage->ExtId << 3) | TxMessage->IDE | TxMessage->RTR);
  612. }
  613. /* Set up the DLC */
  614. TxMessage->DLC = pmsg->len & 0x0FU;
  615. CANx->sTxMailBox[mailbox_index].TMDT &= (uint32_t)0xFFFFFFF0;
  616. CANx->sTxMailBox[mailbox_index].TMDT |= TxMessage->DLC;
  617. /* Set up the data field */
  618. CANx->sTxMailBox[mailbox_index].TMDH = (((uint32_t)pmsg->data[7] << 24) |
  619. ((uint32_t)pmsg->data[6] << 16) |
  620. ((uint32_t)pmsg->data[5] << 8) |
  621. ((uint32_t)pmsg->data[4]));
  622. CANx->sTxMailBox[mailbox_index].TMDL = (((uint32_t)pmsg->data[3] << 24) |
  623. ((uint32_t)pmsg->data[2] << 16) |
  624. ((uint32_t)pmsg->data[1] << 8) |
  625. ((uint32_t)pmsg->data[0]));
  626. /* Request transmission */
  627. CANx->sTxMailBox[mailbox_index].TMI |= TMIDxR_TXRQ;
  628. return RT_EOK;
  629. }
  630. return -RT_ERROR;
  631. }
  632. static int sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t box_num)
  633. {
  634. struct n32_can *drv_can;
  635. RT_ASSERT(can != RT_NULL);
  636. RT_ASSERT(buf != RT_NULL);
  637. drv_can = (struct n32_can *)can->parent.user_data;
  638. RT_ASSERT(drv_can != RT_NULL);
  639. /* Select one empty transmit mailbox */
  640. switch (box_num)
  641. {
  642. case 0:
  643. if ((drv_can->CANx->TSTS & CAN_TSTS_TMEM0) != CAN_TSTS_TMEM0)
  644. {
  645. /* Return function status */
  646. return -RT_ERROR;
  647. }
  648. break;
  649. case 1:
  650. if ((drv_can->CANx->TSTS & CAN_TSTS_TMEM1) != CAN_TSTS_TMEM1)
  651. {
  652. /* Return function status */
  653. return -RT_ERROR;
  654. }
  655. break;
  656. case 2:
  657. if ((drv_can->CANx->TSTS & CAN_TSTS_TMEM2) != CAN_TSTS_TMEM2)
  658. {
  659. /* Return function status */
  660. return -RT_ERROR;
  661. }
  662. break;
  663. default:
  664. RT_ASSERT(0);
  665. break;
  666. }
  667. // Start send msg
  668. return can_sendmsg_rtmsg(drv_can->CANx, ((struct rt_can_msg *)buf), box_num);
  669. }
  670. static int can_recvmsg_rtmsg(CAN_Module *CANx, struct rt_can_msg *pmsg, uint32_t FIFONum)
  671. {
  672. CanRxMessage CAN_RxMessage = {0};
  673. CanRxMessage *RxMessage = &CAN_RxMessage;
  674. /* Check the parameters */
  675. assert_param(IS_CAN_ALL_PERIPH(CANx));
  676. assert_param(IS_CAN_FIFO(FIFONum));
  677. /* Check the Rx FIFO */
  678. if (FIFONum == CAN_FIFO0) /* Rx element is assigned to Rx FIFO 0 */
  679. {
  680. /* Check that the Rx FIFO 0 is not empty */
  681. if ((CANx->RFF0 & CAN_RFF0_FFMP0) == 0U)
  682. {
  683. return -RT_ERROR;
  684. }
  685. }
  686. else /* Rx element is assigned to Rx FIFO 1 */
  687. {
  688. /* Check that the Rx FIFO 1 is not empty */
  689. if ((CANx->RFF1 & CAN_RFF1_FFMP1) == 0U)
  690. {
  691. return -RT_ERROR;
  692. }
  693. }
  694. /* Get the Id */
  695. RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONum].RMI;
  696. if (RxMessage->IDE == CAN_Standard_Id)
  697. {
  698. RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONum].RMI >> 21);
  699. }
  700. else
  701. {
  702. RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONum].RMI >> 3);
  703. }
  704. RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONum].RMI;
  705. /* Get the DLC */
  706. RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONum].RMDT;
  707. /* Get the FMI */
  708. RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONum].RMDT >> 8);
  709. /* Get the data field */
  710. pmsg->data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONum].RMDL;
  711. pmsg->data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONum].RMDL >> 8);
  712. pmsg->data[2] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONum].RMDL >> 16);
  713. pmsg->data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONum].RMDL >> 24);
  714. pmsg->data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONum].RMDH;
  715. pmsg->data[5] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONum].RMDH >> 8);
  716. pmsg->data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONum].RMDH >> 16);
  717. pmsg->data[7] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONum].RMDH >> 24);
  718. /* get len */
  719. pmsg->len = RxMessage->DLC;
  720. /* get id */
  721. if (RxMessage->IDE == CAN_Standard_Id)
  722. {
  723. pmsg->ide = RT_CAN_STDID;
  724. pmsg->id = RxMessage->StdId;
  725. }
  726. else
  727. {
  728. pmsg->ide = RT_CAN_EXTID;
  729. pmsg->id = RxMessage->ExtId;
  730. }
  731. /* get type */
  732. if (CAN_RTRQ_Data == RxMessage->RTR)
  733. {
  734. pmsg->rtr = RT_CAN_DTR;
  735. }
  736. else
  737. {
  738. pmsg->rtr = RT_CAN_RTR;
  739. }
  740. /* get hdr_index */
  741. #if defined(SOC_N32G45X) || defined(SOC_N32WB452)
  742. if (CANx == CAN1)
  743. {
  744. pmsg->hdr_index = (RxMessage->FMI + 1) >> 1;
  745. }
  746. #ifdef CAN2
  747. else if (CANx == CAN2)
  748. {
  749. pmsg->hdr_index = (RxMessage->FMI + 1) >> 1;
  750. }
  751. #endif
  752. #elif defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  753. if (CANx == CAN)
  754. {
  755. pmsg->hdr_index = (RxMessage->FMI + 1) >> 1;
  756. }
  757. #endif
  758. /* Release the DATFIFO */
  759. /* Release FIFO0 */
  760. if (FIFONum == CAN_FIFO0)
  761. {
  762. CANx->RFF0 |= CAN_RFF0_RFFOM0;
  763. }
  764. /* Release FIFO1 */
  765. else /* FIFONum == CAN_FIFO1 */
  766. {
  767. CANx->RFF1 |= CAN_RFF1_RFFOM1;
  768. }
  769. return RT_EOK;
  770. }
  771. static int recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t fifo)
  772. {
  773. struct n32_can *drv_can;
  774. RT_ASSERT(can != RT_NULL);
  775. RT_ASSERT(buf != RT_NULL);
  776. drv_can = (struct n32_can *)can->parent.user_data;
  777. RT_ASSERT(drv_can != RT_NULL);
  778. /* Get data */
  779. return can_recvmsg_rtmsg(drv_can->CANx, ((struct rt_can_msg *)buf), fifo);
  780. }
  781. static const struct rt_can_ops canops =
  782. {
  783. configure,
  784. control,
  785. sendmsg,
  786. recvmsg,
  787. };
  788. static void can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo)
  789. {
  790. struct n32_can *drv_can;
  791. RT_ASSERT(can != RT_NULL);
  792. drv_can = (struct n32_can *)can->parent.user_data;
  793. RT_ASSERT(drv_can != RT_NULL);
  794. switch (fifo)
  795. {
  796. case CAN_FIFO0:
  797. /* save to user list */
  798. if (CAN_GetFlagSTS(drv_can->CANx, CAN_FLAG_FFMP0) && CAN_PendingMessage(drv_can->CANx, CAN_FIFO0))
  799. {
  800. rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8);
  801. }
  802. /* Check FULL flag for FIFO0 */
  803. if (CAN_GetFlagSTS(drv_can->CANx, CAN_FLAG_FFULL0))
  804. {
  805. /* Clear FIFO0 FULL Flag */
  806. CAN_ClearFlag(drv_can->CANx, CAN_FLAG_FFULL0);
  807. }
  808. /* Check Overrun flag for FIFO0 */
  809. if (CAN_GetFlagSTS(drv_can->CANx, CAN_FLAG_FFOVR0))
  810. {
  811. /* Clear FIFO0 Overrun Flag */
  812. CAN_ClearFlag(drv_can->CANx, CAN_FLAG_FFOVR0);
  813. rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND | fifo << 8);
  814. }
  815. break;
  816. case CAN_FIFO1:
  817. /* save to user list */
  818. if (CAN_GetFlagSTS(drv_can->CANx, CAN_FLAG_FFMP1) && CAN_PendingMessage(drv_can->CANx, CAN_FIFO1))
  819. {
  820. rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8);
  821. }
  822. /* Check FULL flag for FIFO1 */
  823. if (CAN_GetFlagSTS(drv_can->CANx, CAN_FLAG_FFULL1))
  824. {
  825. /* Clear FIFO1 FULL Flag */
  826. CAN_ClearFlag(drv_can->CANx, CAN_FLAG_FFULL1);
  827. }
  828. /* Check Overrun flag for FIFO1 */
  829. if (CAN_GetFlagSTS(drv_can->CANx, CAN_FLAG_FFOVR1))
  830. {
  831. /* Clear FIFO1 Overrun Flag */
  832. CAN_ClearFlag(drv_can->CANx, CAN_FLAG_FFOVR1);
  833. rt_hw_can_isr(can, RT_CAN_EVENT_RXOF_IND | fifo << 8);
  834. }
  835. break;
  836. }
  837. }
  838. #ifdef BSP_USING_CAN1
  839. void USB_HP_CAN1_TX_IRQHandler(void)
  840. {
  841. rt_interrupt_enter();
  842. if (CAN_GetFlagSTS(drv_can1.CANx, CAN_FLAG_RQCPM0))
  843. {
  844. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_DONE | (0x00 << 8));
  845. CAN_ClearFlag(drv_can1.CANx, CAN_FLAG_RQCPM0);
  846. }
  847. if (CAN_GetFlagSTS(drv_can1.CANx, CAN_FLAG_RQCPM1))
  848. {
  849. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_DONE | (0x01 << 8));
  850. CAN_ClearFlag(drv_can1.CANx, CAN_FLAG_RQCPM1);
  851. }
  852. if (CAN_GetFlagSTS(drv_can1.CANx, CAN_FLAG_RQCPM2))
  853. {
  854. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_DONE | (0x02 << 8));
  855. CAN_ClearFlag(drv_can1.CANx, CAN_FLAG_RQCPM2);
  856. }
  857. rt_interrupt_leave();
  858. }
  859. void USB_LP_CAN1_RX0_IRQHandler(void)
  860. {
  861. /* enter interrupt */
  862. rt_interrupt_enter();
  863. can_rx_isr(&drv_can1.device, CAN_FIFO0);
  864. /* leave interrupt */
  865. rt_interrupt_leave();
  866. }
  867. void CAN1_RX1_IRQHandler(void)
  868. {
  869. /* enter interrupt */
  870. rt_interrupt_enter();
  871. can_rx_isr(&drv_can1.device, CAN_FIFO1);
  872. /* leave interrupt */
  873. rt_interrupt_leave();
  874. }
  875. void CAN1_SCE_IRQHandler(void)
  876. {
  877. uint32_t errtype;
  878. rt_interrupt_enter();
  879. if (CAN_GetIntStatus(drv_can1.CANx, CAN_INT_ERR))
  880. {
  881. errtype = drv_can1.CANx->ESTS;
  882. /* ESTS -> LEC */
  883. switch ((errtype & 0x70) >> 4)
  884. {
  885. case RT_CAN_BUS_BIT_PAD_ERR:
  886. break;
  887. case RT_CAN_BUS_FORMAT_ERR:
  888. drv_can1.device.status.formaterrcnt++;
  889. break;
  890. case RT_CAN_BUS_ACK_ERR:
  891. drv_can1.device.status.ackerrcnt++;
  892. if (!READ_BIT(drv_can1.CANx->TSTS, CAN_TSTS_TXOKM0))
  893. {
  894. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  895. }
  896. else if (!READ_BIT(drv_can1.CANx->TSTS, CAN_TSTS_TXOKM1))
  897. {
  898. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  899. }
  900. else if (!READ_BIT(drv_can1.CANx->TSTS, CAN_TSTS_TXOKM2))
  901. {
  902. rt_hw_can_isr(&drv_can1.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  903. }
  904. break;
  905. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  906. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  907. drv_can1.device.status.biterrcnt++;
  908. break;
  909. case RT_CAN_BUS_CRC_ERR:
  910. drv_can1.device.status.crcerrcnt++;
  911. break;
  912. }
  913. drv_can1.device.status.lasterrtype = errtype & 0x70;
  914. drv_can1.device.status.rcverrcnt = errtype >> 24;
  915. drv_can1.device.status.snderrcnt = (errtype >> 16 & 0xFF);
  916. drv_can1.device.status.errcode = errtype & 0x07;
  917. CAN_ClearINTPendingBit(drv_can1.CANx, CAN_INT_ERR);
  918. }
  919. rt_interrupt_leave();
  920. }
  921. #endif /*BSP_USING_CAN1*/
  922. #ifdef BSP_USING_CAN2
  923. void CAN2_TX_IRQHandler(void)
  924. {
  925. rt_interrupt_enter();
  926. if (CAN_GetFlagSTS(drv_can2.CANx, CAN_FLAG_RQCPM0))
  927. {
  928. CAN_ClearFlag(drv_can2.CANx, CAN_FLAG_RQCPM0);
  929. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_DONE | (0x00 << 8));
  930. }
  931. if (CAN_GetFlagSTS(drv_can2.CANx, CAN_FLAG_RQCPM1))
  932. {
  933. CAN_ClearFlag(drv_can2.CANx, CAN_FLAG_RQCPM1);
  934. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_DONE | (0x01 << 8));
  935. }
  936. if (CAN_GetFlagSTS(drv_can2.CANx, CAN_FLAG_RQCPM2))
  937. {
  938. CAN_ClearFlag(drv_can2.CANx, CAN_FLAG_RQCPM2);
  939. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_DONE | (0x02 << 8));
  940. }
  941. rt_interrupt_leave();
  942. }
  943. void CAN2_RX0_IRQHandler(void)
  944. {
  945. /* enter interrupt */
  946. rt_interrupt_enter();
  947. can_rx_isr(&drv_can2.device, CAN_FIFO0);
  948. /* leave interrupt */
  949. rt_interrupt_leave();
  950. }
  951. void CAN2_RX1_IRQHandler(void)
  952. {
  953. /* enter interrupt */
  954. rt_interrupt_enter();
  955. can_rx_isr(&drv_can2.device, CAN_FIFO1);
  956. /* leave interrupt */
  957. rt_interrupt_leave();
  958. }
  959. void CAN2_SCE_IRQHandler(void)
  960. {
  961. uint32_t errtype;
  962. rt_interrupt_enter();
  963. if (CAN_GetIntStatus(drv_can2.CANx, CAN_INT_ERR))
  964. {
  965. errtype = drv_can2.CANx->ESTS;
  966. /* ESTS -> LEC */
  967. switch ((errtype & 0x70) >> 4)
  968. {
  969. case RT_CAN_BUS_BIT_PAD_ERR:
  970. break;
  971. case RT_CAN_BUS_FORMAT_ERR:
  972. drv_can2.device.status.formaterrcnt++;
  973. break;
  974. case RT_CAN_BUS_ACK_ERR:
  975. drv_can2.device.status.ackerrcnt++;
  976. if (!READ_BIT(drv_can2.CANx->TSTS, CAN_TSTS_TXOKM0))
  977. {
  978. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  979. }
  980. else if (!READ_BIT(drv_can2.CANx->TSTS, CAN_TSTS_TXOKM1))
  981. {
  982. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  983. }
  984. else if (!READ_BIT(drv_can2.CANx->TSTS, CAN_TSTS_TXOKM2))
  985. {
  986. rt_hw_can_isr(&drv_can2.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  987. }
  988. break;
  989. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  990. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  991. drv_can2.device.status.biterrcnt++;
  992. break;
  993. case RT_CAN_BUS_CRC_ERR:
  994. drv_can2.device.status.crcerrcnt++;
  995. break;
  996. }
  997. drv_can2.device.status.lasterrtype = errtype & 0x70;
  998. drv_can2.device.status.rcverrcnt = errtype >> 24;
  999. drv_can2.device.status.snderrcnt = (errtype >> 16 & 0xFF);
  1000. drv_can2.device.status.errcode = errtype & 0x07;
  1001. CAN_ClearINTPendingBit(drv_can2.CANx, CAN_INT_ERR);
  1002. }
  1003. rt_interrupt_leave();
  1004. }
  1005. #endif /* BSP_USING_CAN2 */
  1006. #if defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  1007. #ifdef BSP_USING_CAN
  1008. void CAN_TX_IRQHandler(void)
  1009. {
  1010. rt_interrupt_enter();
  1011. if (CAN_GetFlagSTS(drv_can.CANx, CAN_FLAG_RQCPM0))
  1012. {
  1013. CAN_ClearFlag(drv_can.CANx, CAN_FLAG_RQCPM0);
  1014. rt_hw_can_isr(&drv_can.device, RT_CAN_EVENT_TX_DONE | (0x00 << 8));
  1015. }
  1016. if (CAN_GetFlagSTS(drv_can.CANx, CAN_FLAG_RQCPM1))
  1017. {
  1018. CAN_ClearFlag(drv_can.CANx, CAN_FLAG_RQCPM1);
  1019. rt_hw_can_isr(&drv_can.device, RT_CAN_EVENT_TX_DONE | (0x01 << 8));
  1020. }
  1021. if (CAN_GetFlagSTS(drv_can.CANx, CAN_FLAG_RQCPM2))
  1022. {
  1023. CAN_ClearFlag(drv_can.CANx, CAN_FLAG_RQCPM2);
  1024. rt_hw_can_isr(&drv_can.device, RT_CAN_EVENT_TX_DONE | (0x02 << 8));
  1025. }
  1026. rt_interrupt_leave();
  1027. }
  1028. void CAN_RX0_IRQHandler(void)
  1029. {
  1030. /* enter interrupt */
  1031. rt_interrupt_enter();
  1032. can_rx_isr(&drv_can.device, CAN_FIFO0);
  1033. /* leave interrupt */
  1034. rt_interrupt_leave();
  1035. }
  1036. void CAN_RX1_IRQHandler(void)
  1037. {
  1038. /* enter interrupt */
  1039. rt_interrupt_enter();
  1040. can_rx_isr(&drv_can.device, CAN_FIFO1);
  1041. /* leave interrupt */
  1042. rt_interrupt_leave();
  1043. }
  1044. void CAN_SCE_IRQHandler(void)
  1045. {
  1046. uint32_t errtype;
  1047. rt_interrupt_enter();
  1048. if (CAN_GetIntStatus(drv_can.CANx, CAN_INT_ERR))
  1049. {
  1050. errtype = drv_can.CANx->ESTS;
  1051. /* ESTS -> LEC */
  1052. switch ((errtype & 0x70) >> 4)
  1053. {
  1054. case RT_CAN_BUS_BIT_PAD_ERR:
  1055. break;
  1056. case RT_CAN_BUS_FORMAT_ERR:
  1057. drv_can.device.status.formaterrcnt++;
  1058. break;
  1059. case RT_CAN_BUS_ACK_ERR:
  1060. drv_can.device.status.ackerrcnt++;
  1061. if (!READ_BIT(drv_can.CANx->TSTS, CAN_TSTS_TXOKM0))
  1062. {
  1063. rt_hw_can_isr(&drv_can.device, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  1064. }
  1065. else if (!READ_BIT(drv_can.CANx->TSTS, CAN_TSTS_TXOKM1))
  1066. {
  1067. rt_hw_can_isr(&drv_can.device, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  1068. }
  1069. else if (!READ_BIT(drv_can.CANx->TSTS, CAN_TSTS_TXOKM2))
  1070. {
  1071. rt_hw_can_isr(&drv_can.device, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  1072. }
  1073. break;
  1074. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  1075. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  1076. drv_can.device.status.biterrcnt++;
  1077. break;
  1078. case RT_CAN_BUS_CRC_ERR:
  1079. drv_can.device.status.crcerrcnt++;
  1080. break;
  1081. }
  1082. drv_can.device.status.lasterrtype = errtype & 0x70;
  1083. drv_can.device.status.rcverrcnt = errtype >> 24;
  1084. drv_can.device.status.snderrcnt = (errtype >> 16 & 0xFF);
  1085. drv_can.device.status.errcode = errtype & 0x07;
  1086. CAN_ClearINTPendingBit(drv_can.CANx, CAN_INT_ERR);
  1087. }
  1088. rt_interrupt_leave();
  1089. }
  1090. #endif /* BSP_USING_CAN */
  1091. #endif
  1092. int rt_hw_can_init(void)
  1093. {
  1094. struct can_configure config = CANDEFAULTCONFIG;
  1095. config.privmode = RT_CAN_MODE_NOPRIV;
  1096. config.ticks = 50;
  1097. #ifdef RT_CAN_USING_HDR
  1098. config.maxhdr = 14;
  1099. #endif
  1100. #ifdef BSP_USING_CAN1
  1101. /* config default filter */
  1102. drv_can1.FilterConfig.Filter_Num = 0;
  1103. drv_can1.FilterConfig.Filter_Mode = CAN_Filter_IdMaskMode;
  1104. drv_can1.FilterConfig.Filter_Scale = CAN_Filter_32bitScale;
  1105. drv_can1.FilterConfig.Filter_HighId = 0x0000;
  1106. drv_can1.FilterConfig.Filter_LowId = 0x0000;
  1107. drv_can1.FilterConfig.FilterMask_HighId = 0;
  1108. drv_can1.FilterConfig.FilterMask_LowId = 0;
  1109. drv_can1.FilterConfig.Filter_FIFOAssignment = CAN_FIFO0; // CAN_FIFO1 CAN_FIFO0
  1110. drv_can1.FilterConfig.Filter_Act = ENABLE;
  1111. drv_can1.device.config = config;
  1112. /* register CAN1 device */
  1113. rt_hw_can_register(&drv_can1.device, drv_can1.name, &canops, &drv_can1);
  1114. #endif /* BSP_USING_CAN1 */
  1115. #ifdef BSP_USING_CAN2
  1116. /* config default filter */
  1117. drv_can2.FilterConfig.Filter_Num = 0;
  1118. drv_can2.FilterConfig.Filter_Mode = CAN_Filter_IdMaskMode;
  1119. drv_can2.FilterConfig.Filter_Scale = CAN_Filter_32bitScale;
  1120. drv_can2.FilterConfig.Filter_HighId = 0x0000;
  1121. drv_can2.FilterConfig.Filter_LowId = 0x0000;
  1122. drv_can2.FilterConfig.FilterMask_HighId = 0;
  1123. drv_can2.FilterConfig.FilterMask_LowId = 0;
  1124. drv_can2.FilterConfig.Filter_FIFOAssignment = CAN_FIFO0;
  1125. drv_can2.FilterConfig.Filter_Act = ENABLE;
  1126. drv_can2.device.config = config;
  1127. /* register CAN2 device */
  1128. rt_hw_can_register(&drv_can2.device, drv_can2.name, &canops, &drv_can2);
  1129. #endif /* BSP_USING_CAN2 */
  1130. #if defined(SOC_N32L43X) || defined(SOC_N32L40X) || defined(SOC_N32G43X)
  1131. #ifdef BSP_USING_CAN
  1132. /* config default filter */
  1133. drv_can.FilterConfig.Filter_Num = 0;
  1134. drv_can.FilterConfig.Filter_Mode = CAN_Filter_IdMaskMode;
  1135. drv_can.FilterConfig.Filter_Scale = CAN_Filter_32bitScale;
  1136. drv_can.FilterConfig.Filter_HighId = 0x0000;
  1137. drv_can.FilterConfig.Filter_LowId = 0x0000;
  1138. drv_can.FilterConfig.FilterMask_HighId = 0;
  1139. drv_can.FilterConfig.FilterMask_LowId = 0;
  1140. drv_can.FilterConfig.Filter_FIFOAssignment = CAN_FIFO0;
  1141. drv_can.FilterConfig.Filter_Act = ENABLE;
  1142. drv_can.device.config = config;
  1143. /* register CAN2 device */
  1144. rt_hw_can_register(&drv_can.device, drv_can.name, &canops, &drv_can);
  1145. #endif /* BSP_USING_CAN2 */
  1146. #endif
  1147. return 0;
  1148. }
  1149. INIT_BOARD_EXPORT(rt_hw_can_init);
  1150. #endif /* defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2) */
  1151. #endif /*RT_USING_CAN*/