bxcan.c 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624
  1. /*
  2. * File : bxcan.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2015, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2015-05-14 aubrcool@qq.com first version
  13. */
  14. #include <rthw.h>
  15. #include <rtdevice.h>
  16. #include <board.h>
  17. #include <bxcan.h>
  18. #ifdef RT_USING_COMPONENTS_INIT
  19. #include <components.h>
  20. #endif
  21. #ifdef RT_USING_CAN
  22. #ifndef STM32F10X_CL
  23. #define BX_CAN_FMRNUMBER 14
  24. #define BX_CAN2_FMRSTART 7
  25. #else
  26. #define BX_CAN_FMRNUMBER 28
  27. #define BX_CAN2_FMRSTART 14
  28. #endif
  29. #ifdef STM32F10X_HD
  30. #undef USING_BXCAN2
  31. #define CAN1_RX0_IRQn USB_LP_CAN1_RX0_IRQn
  32. #define CAN1_TX_IRQn USB_HP_CAN1_TX_IRQn
  33. #endif
  34. #define BX_CAN_MAX_FILTERS (BX_CAN_FMRNUMBER * 4)
  35. #define BX_CAN_MAX_FILTER_MASKS BX_CAN_MAX_FILTERS
  36. #define BX_CAN_FILTER_MAX_ARRAY_SIZE ((BX_CAN_MAX_FILTERS + 32 - 1) / 32)
  37. struct stm_bxcanfiltermap
  38. {
  39. rt_uint32_t id32mask_cnt;
  40. rt_uint32_t id32bit_cnt;
  41. rt_uint32_t id16mask_cnt;
  42. rt_uint32_t id16bit_cnt;
  43. };
  44. struct stm_bxcanfilter_masks
  45. {
  46. rt_uint32_t id32maskm[BX_CAN_FILTER_MAX_ARRAY_SIZE];
  47. rt_uint32_t id32bitm[BX_CAN_FILTER_MAX_ARRAY_SIZE];
  48. rt_uint32_t id16maskm[BX_CAN_FILTER_MAX_ARRAY_SIZE];
  49. rt_uint32_t id16bitm[BX_CAN_FILTER_MAX_ARRAY_SIZE];
  50. rt_uint32_t id32maskshift[2];
  51. rt_uint32_t id32bitshift[2];
  52. rt_uint32_t id16maskshift[2];
  53. rt_uint32_t id16bitshift[2];
  54. };
  55. struct stm_bxcan
  56. {
  57. CAN_TypeDef *reg;
  58. void *mfrbase;
  59. IRQn_Type sndirq;
  60. IRQn_Type rcvirq0;
  61. IRQn_Type rcvirq1;
  62. IRQn_Type errirq;
  63. struct stm_bxcanfilter_masks filtermask;
  64. rt_uint32_t alocmask[BX_CAN_FILTER_MAX_ARRAY_SIZE];
  65. const rt_uint32_t filtercnt;
  66. const rt_uint32_t fifo1filteroff;
  67. const struct stm_bxcanfiltermap filtermap[2];
  68. };
  69. struct stm_baud_rate_tab
  70. {
  71. rt_uint32_t baud_rate;
  72. rt_uint32_t confdata;
  73. };
  74. static void calcfiltermasks(struct stm_bxcan *pbxcan);
  75. static void bxcan1_filter_init(struct rt_can_device *can)
  76. {
  77. rt_uint32_t i;
  78. rt_uint32_t mask;
  79. struct stm_bxcan *pbxcan = (struct stm_bxcan *) can->parent.user_data;
  80. for (i = 0; i < BX_CAN2_FMRSTART; i++)
  81. {
  82. CAN1->FMR |= FMR_FINIT;
  83. mask = 0x01 << (i + 0);
  84. if (i < pbxcan->fifo1filteroff)
  85. {
  86. if (pbxcan->filtermap[0].id32mask_cnt && i < pbxcan->filtermap[0].id32mask_cnt)
  87. {
  88. CAN1->FS1R |= mask;
  89. CAN1->FM1R &= ~mask;
  90. CAN1->FFA1R &= ~mask;
  91. }
  92. else if (pbxcan->filtermap[0].id32bit_cnt &&
  93. i < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt / 2)
  94. {
  95. CAN1->FS1R |= mask;
  96. CAN1->FM1R |= mask;
  97. CAN1->FFA1R &= ~mask;
  98. }
  99. else if (pbxcan->filtermap[0].id16mask_cnt &&
  100. i < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt / 2
  101. + pbxcan->filtermap[0].id16mask_cnt / 2)
  102. {
  103. CAN1->FS1R &= ~mask;
  104. CAN1->FM1R &= ~mask;
  105. CAN1->FFA1R &= ~mask;
  106. }
  107. else if (pbxcan->filtermap[0].id16bit_cnt &&
  108. i < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt / 2
  109. + pbxcan->filtermap[0].id16mask_cnt / 2 + pbxcan->filtermap[0].id16bit_cnt / 4
  110. )
  111. {
  112. CAN1->FS1R &= ~mask;
  113. CAN1->FM1R |= mask;
  114. CAN1->FFA1R &= ~mask;
  115. }
  116. }
  117. else
  118. {
  119. if (pbxcan->filtermap[1].id32mask_cnt &&
  120. i < pbxcan->filtermap[1].id32mask_cnt + pbxcan->fifo1filteroff)
  121. {
  122. CAN1->FS1R |= mask;
  123. CAN1->FM1R &= ~mask;
  124. CAN1->FFA1R |= mask;
  125. }
  126. else if (pbxcan->filtermap[1].id32bit_cnt &&
  127. i < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt / 2
  128. + pbxcan->fifo1filteroff)
  129. {
  130. CAN1->FS1R |= mask;
  131. CAN1->FM1R |= mask;
  132. CAN1->FFA1R |= mask;
  133. }
  134. else if (pbxcan->filtermap[1].id16mask_cnt &&
  135. i < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt / 2
  136. + pbxcan->filtermap[1].id16mask_cnt / 2 + pbxcan->fifo1filteroff)
  137. {
  138. CAN1->FS1R &= ~mask;
  139. CAN1->FM1R &= ~mask;
  140. CAN1->FFA1R |= mask;
  141. }
  142. else if (pbxcan->filtermap[1].id16bit_cnt &&
  143. i < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt / 2
  144. + pbxcan->filtermap[1].id16mask_cnt / 2 + pbxcan->filtermap[1].id16bit_cnt / 4
  145. + pbxcan->fifo1filteroff)
  146. {
  147. CAN1->FS1R &= ~mask;
  148. CAN1->FM1R |= mask;
  149. CAN1->FFA1R |= mask;
  150. }
  151. }
  152. CAN1->sFilterRegister[i].FR1 = 0xFFFFFFFF;
  153. CAN1->sFilterRegister[i].FR2 = 0xFFFFFFFF;
  154. CAN1->FMR &= ~FMR_FINIT;
  155. }
  156. calcfiltermasks(pbxcan);
  157. }
  158. #ifdef USING_BXCAN2
  159. static void bxcan2_filter_init(struct rt_can_device *can)
  160. {
  161. rt_uint32_t i;
  162. rt_uint32_t off;
  163. rt_uint32_t mask;
  164. CAN_SlaveStartBank(BX_CAN2_FMRSTART);
  165. struct stm_bxcan *pbxcan = (struct stm_bxcan *) can->parent.user_data;
  166. for (i = BX_CAN2_FMRSTART; i < BX_CAN_FMRNUMBER; i++)
  167. {
  168. CAN1->FMR |= FMR_FINIT;
  169. mask = 0x01 << (i + 0);
  170. off = i - BX_CAN2_FMRSTART;
  171. if (off < pbxcan->fifo1filteroff)
  172. {
  173. if (pbxcan->filtermap[0].id32mask_cnt && off < pbxcan->filtermap[0].id32mask_cnt)
  174. {
  175. CAN1->FS1R |= mask;
  176. CAN1->FM1R &= ~mask;
  177. CAN1->FFA1R &= ~mask;
  178. }
  179. else if (pbxcan->filtermap[0].id32bit_cnt &&
  180. off < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt / 2)
  181. {
  182. CAN1->FS1R |= mask;
  183. CAN1->FM1R |= mask;
  184. CAN1->FFA1R &= ~mask;
  185. }
  186. else if (pbxcan->filtermap[0].id16mask_cnt &&
  187. off < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt / 2
  188. + pbxcan->filtermap[0].id16mask_cnt / 2)
  189. {
  190. CAN1->FS1R &= ~mask;
  191. CAN1->FM1R &= ~mask;
  192. CAN1->FFA1R &= ~mask;
  193. }
  194. else if (pbxcan->filtermap[0].id16bit_cnt &&
  195. off < pbxcan->filtermap[0].id32mask_cnt + pbxcan->filtermap[0].id32bit_cnt / 2
  196. + pbxcan->filtermap[0].id16mask_cnt / 2 + pbxcan->filtermap[0].id16bit_cnt / 4
  197. )
  198. {
  199. CAN1->FS1R &= ~mask;
  200. CAN1->FM1R |= mask;
  201. CAN1->FFA1R &= ~mask;
  202. }
  203. }
  204. else
  205. {
  206. if (pbxcan->filtermap[1].id32mask_cnt &&
  207. off < pbxcan->filtermap[1].id32mask_cnt + pbxcan->fifo1filteroff)
  208. {
  209. CAN1->FS1R |= mask;
  210. CAN1->FM1R &= ~mask;
  211. CAN1->FFA1R |= mask;
  212. }
  213. else if (pbxcan->filtermap[1].id32bit_cnt &&
  214. off < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt / 2
  215. + pbxcan->fifo1filteroff)
  216. {
  217. CAN1->FS1R |= mask;
  218. CAN1->FM1R |= mask;
  219. CAN1->FFA1R |= mask;
  220. }
  221. else if (pbxcan->filtermap[1].id16mask_cnt &&
  222. off < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt / 2
  223. + pbxcan->filtermap[1].id16mask_cnt / 2 + pbxcan->fifo1filteroff)
  224. {
  225. CAN1->FS1R &= ~mask;
  226. CAN1->FM1R &= ~mask;
  227. CAN1->FFA1R |= mask;
  228. }
  229. else if (pbxcan->filtermap[1].id16bit_cnt &&
  230. off < pbxcan->filtermap[1].id32mask_cnt + pbxcan->filtermap[1].id32bit_cnt / 2
  231. + pbxcan->filtermap[1].id16mask_cnt / 2 + pbxcan->filtermap[1].id16bit_cnt / 4
  232. + pbxcan->fifo1filteroff)
  233. {
  234. CAN1->FS1R &= ~mask;
  235. CAN1->FM1R |= mask;
  236. CAN1->FFA1R |= mask;
  237. }
  238. }
  239. CAN1->sFilterRegister[i].FR1 = 0xFFFFFFFF;
  240. CAN1->sFilterRegister[i].FR2 = 0xFFFFFFFF;
  241. CAN1->FMR &= ~FMR_FINIT;
  242. }
  243. calcfiltermasks(pbxcan);
  244. }
  245. #endif
  246. #define BS1SHIFT 16
  247. #define BS2SHIFT 20
  248. #define RRESCLSHIFT 0
  249. #define SJWSHIFT 24
  250. #define BS1MASK ( (0x0F) << BS1SHIFT )
  251. #define BS2MASK ( (0x07) << BS2SHIFT )
  252. #define RRESCLMASK ( 0x3FF << RRESCLSHIFT )
  253. #define SJWMASK ( 0x3 << SJWSHIFT )
  254. #define MK_BKCAN_BAUD(SJW,BS1,BS2,PRES) \
  255. ((SJW << SJWSHIFT) | (BS1 << BS1SHIFT) | (BS2 << BS2SHIFT) | (PRES << RRESCLSHIFT))
  256. static const struct stm_baud_rate_tab bxcan_baud_rate_tab[] =
  257. {
  258. #ifdef STM32F10X_CL
  259. // 48 M
  260. {1000UL * 1000, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 3)},
  261. {1000UL * 800, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_6tq, CAN_BS2_3tq, 6)},
  262. {1000UL * 500, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 5)},
  263. {1000UL * 250, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 11)},//1
  264. {1000UL * 125, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 23)},
  265. {1000UL * 100, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 29)},
  266. {1000UL * 50, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 59)},
  267. {1000UL * 20, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_14tq, CAN_BS2_3tq, 149)},
  268. {1000UL * 10, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_16tq, CAN_BS2_8tq, 199)}
  269. #else
  270. // 36 M
  271. {1000UL * 1000, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_8tq, CAN_BS2_3tq, 3)},
  272. {1000UL * 800, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_11tq, CAN_BS2_3tq, 3)},
  273. {1000UL * 500, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_2tq, 6)},
  274. {1000UL * 250, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_13tq, CAN_BS2_2tq, 9)},//1
  275. {1000UL * 125, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_13tq, CAN_BS2_2tq, 18)},
  276. {1000UL * 100, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_2tq, 30)},
  277. {1000UL * 50, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_13tq, CAN_BS2_2tq, 45)},
  278. {1000UL * 20, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_14tq, CAN_BS2_3tq, 100)},
  279. {1000UL * 10, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_14tq, CAN_BS2_3tq, 200)}
  280. #endif
  281. };
  282. #define BAUD_DATA(TYPE,NO) \
  283. ((bxcan_baud_rate_tab[NO].confdata & TYPE##MASK) >> TYPE##SHIFT)
  284. static rt_uint32_t bxcan_get_baud_index(rt_uint32_t baud)
  285. {
  286. rt_uint32_t len, index, default_index;
  287. len = sizeof(bxcan_baud_rate_tab)/sizeof(bxcan_baud_rate_tab[0]);
  288. default_index = len;
  289. for(index = 0; index < len; index++)
  290. {
  291. if(bxcan_baud_rate_tab[index].baud_rate == baud)
  292. return index;
  293. if(bxcan_baud_rate_tab[index].baud_rate == 1000UL * 250)
  294. default_index = index;
  295. }
  296. if(default_index != len)
  297. return default_index;
  298. return 0;
  299. }
  300. static void bxcan_init(CAN_TypeDef *pcan, rt_uint32_t baud, rt_uint32_t mode)
  301. {
  302. CAN_InitTypeDef CAN_InitStructure;
  303. rt_uint32_t baud_index = bxcan_get_baud_index(baud);
  304. CAN_InitStructure.CAN_TTCM = DISABLE;
  305. CAN_InitStructure.CAN_ABOM = ENABLE;
  306. CAN_InitStructure.CAN_AWUM = DISABLE;
  307. CAN_InitStructure.CAN_NART = DISABLE;
  308. CAN_InitStructure.CAN_RFLM = DISABLE;
  309. CAN_InitStructure.CAN_TXFP = ENABLE;
  310. switch (mode)
  311. {
  312. case RT_CAN_MODE_NORMAL:
  313. CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  314. break;
  315. case RT_CAN_MODE_LISEN:
  316. CAN_InitStructure.CAN_Mode = CAN_Mode_Silent;
  317. break;
  318. case RT_CAN_MODE_LOOPBACK:
  319. CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
  320. break;
  321. case RT_CAN_MODE_LOOPBACKANLISEN:
  322. CAN_InitStructure.CAN_Mode = CAN_Mode_Silent_LoopBack;
  323. break;
  324. }
  325. CAN_InitStructure.CAN_SJW = BAUD_DATA(SJW, baud_index);
  326. CAN_InitStructure.CAN_BS1 = BAUD_DATA(BS1, baud_index);
  327. CAN_InitStructure.CAN_BS2 = BAUD_DATA(BS2, baud_index);
  328. CAN_InitStructure.CAN_Prescaler = BAUD_DATA(RRESCL, baud_index);
  329. CAN_Init(pcan, &CAN_InitStructure);
  330. }
  331. static void bxcan1_hw_init(void)
  332. {
  333. GPIO_InitTypeDef GPIO_InitStructure;
  334. NVIC_InitTypeDef NVIC_InitStructure;
  335. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  336. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  337. GPIO_Init(GPIOA, &GPIO_InitStructure);
  338. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  339. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  340. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  341. GPIO_Init(GPIOA, &GPIO_InitStructure);
  342. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  343. NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
  344. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  345. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  346. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  347. NVIC_Init(&NVIC_InitStructure);
  348. NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;
  349. NVIC_Init(&NVIC_InitStructure);
  350. NVIC_InitStructure.NVIC_IRQChannel = CAN1_TX_IRQn;
  351. NVIC_Init(&NVIC_InitStructure);
  352. }
  353. #ifdef USING_BXCAN2
  354. static void bxcan2_hw_init(void)
  355. {
  356. GPIO_InitTypeDef GPIO_InitStructure;
  357. NVIC_InitTypeDef NVIC_InitStructure;
  358. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  359. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  360. GPIO_Init(GPIOB, &GPIO_InitStructure);
  361. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  362. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  363. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  364. GPIO_Init(GPIOB, &GPIO_InitStructure);
  365. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  366. NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
  367. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  368. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  369. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  370. NVIC_Init(&NVIC_InitStructure);
  371. NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX1_IRQn;
  372. NVIC_Init(&NVIC_InitStructure);
  373. NVIC_InitStructure.NVIC_IRQChannel = CAN2_TX_IRQn;
  374. NVIC_Init(&NVIC_InitStructure);
  375. }
  376. #endif
  377. static inline rt_err_t bxcan_enter_init(CAN_TypeDef *pcan)
  378. {
  379. uint32_t wait_ack = 0x00000000;
  380. pcan->MCR |= CAN_MCR_INRQ ;
  381. while (((pcan->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))
  382. {
  383. wait_ack++;
  384. }
  385. if ((pcan->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)
  386. {
  387. return RT_ERROR;
  388. }
  389. return RT_EOK;
  390. }
  391. static inline rt_err_t bxcan_exit_init(CAN_TypeDef *pcan)
  392. {
  393. uint32_t wait_ack = 0x00000000;
  394. pcan->MCR &= ~(uint32_t)CAN_MCR_INRQ;
  395. while (((pcan->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))
  396. {
  397. wait_ack++;
  398. }
  399. if ((pcan->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)
  400. {
  401. return RT_ERROR;
  402. }
  403. return RT_EOK;
  404. }
  405. static rt_err_t bxcan_set_mode(CAN_TypeDef *pcan, rt_uint32_t mode)
  406. {
  407. if (bxcan_enter_init(pcan) != RT_EOK)
  408. {
  409. return RT_ERROR;
  410. }
  411. pcan->BTR &= ~(uint32_t)((uint32_t)0x03 << 30);
  412. switch (mode)
  413. {
  414. case RT_CAN_MODE_NORMAL:
  415. mode = CAN_Mode_Normal;
  416. break;
  417. case RT_CAN_MODE_LISEN:
  418. mode = CAN_Mode_Silent;
  419. break;
  420. case RT_CAN_MODE_LOOPBACK:
  421. mode = CAN_Mode_LoopBack;
  422. break;
  423. case RT_CAN_MODE_LOOPBACKANLISEN:
  424. mode = CAN_Mode_Silent_LoopBack;
  425. break;
  426. }
  427. pcan->BTR |= ~(uint32_t)(mode << 30);
  428. if (bxcan_exit_init(pcan) != RT_EOK)
  429. {
  430. return RT_ERROR;
  431. }
  432. return RT_EOK;
  433. }
  434. static rt_err_t bxcan_set_privmode(CAN_TypeDef *pcan, rt_uint32_t mode)
  435. {
  436. if (bxcan_enter_init(pcan) != RT_EOK)
  437. {
  438. return RT_ERROR;
  439. }
  440. if (mode == ENABLE)
  441. {
  442. pcan->MCR |= CAN_MCR_TXFP;
  443. }
  444. else
  445. {
  446. pcan->MCR &= ~(uint32_t)CAN_MCR_TXFP;
  447. }
  448. if (bxcan_exit_init(pcan) != RT_EOK)
  449. {
  450. return RT_ERROR;
  451. }
  452. return RT_EOK;
  453. }
  454. static rt_err_t bxcan_set_baud_rate(CAN_TypeDef *pcan, rt_uint32_t baud)
  455. {
  456. rt_uint32_t mode;
  457. rt_uint32_t baud_index = bxcan_get_baud_index(baud);
  458. if (bxcan_enter_init(pcan) != RT_EOK)
  459. {
  460. return RT_ERROR;
  461. }
  462. pcan->BTR = 0;
  463. mode = pcan->BTR & ((rt_uint32_t)0x03 << 30);
  464. pcan->BTR = (mode | \
  465. ((BAUD_DATA(SJW, baud_index)) << 24) | \
  466. ((BAUD_DATA(BS1, baud_index)) << 16) | \
  467. ((BAUD_DATA(BS2, baud_index)) << 20) | \
  468. (BAUD_DATA(RRESCL, baud_index)));
  469. if (bxcan_exit_init(pcan) != RT_EOK)
  470. {
  471. return RT_ERROR;
  472. }
  473. return RT_EOK;
  474. }
  475. static rt_err_t bxcancalcbaseoff(struct stm_bxcan *pbxcan, rt_int32_t hdr,
  476. rt_int32_t *pbase, rt_int32_t *poff)
  477. {
  478. rt_uint32_t fifo0start, fifo0end;
  479. rt_uint32_t fifo1start, fifo1end;
  480. rt_uint32_t ptr;
  481. fifo0start = 0;
  482. fifo0end = pbxcan->filtermap[0].id32mask_cnt
  483. + pbxcan->filtermap[0].id32bit_cnt
  484. + pbxcan->filtermap[0].id16mask_cnt
  485. + pbxcan->filtermap[0].id16bit_cnt ;
  486. fifo1start = pbxcan->fifo1filteroff * 4;
  487. fifo1end = pbxcan->filtermap[1].id32mask_cnt
  488. + pbxcan->filtermap[1].id32bit_cnt
  489. + pbxcan->filtermap[1].id16mask_cnt
  490. + pbxcan->filtermap[1].id16bit_cnt ;
  491. if (hdr >= fifo0start && hdr < fifo0end)
  492. {
  493. *pbase = 0;
  494. ptr = 0;
  495. }
  496. else if (hdr >= fifo1start && hdr < fifo1end)
  497. {
  498. *pbase = pbxcan->fifo1filteroff;
  499. ptr = 1;
  500. }
  501. else
  502. {
  503. return RT_ERROR;
  504. }
  505. ptr = 0;
  506. if (hdr > pbxcan->filtermap[ptr].id32mask_cnt)
  507. {
  508. hdr -= pbxcan->filtermap[ptr].id32mask_cnt;
  509. *pbase += pbxcan->filtermap[ptr].id32mask_cnt;
  510. }
  511. else
  512. {
  513. *pbase += hdr;
  514. *poff = 0;
  515. return RT_EOK;
  516. }
  517. if (hdr > pbxcan->filtermap[ptr].id32bit_cnt)
  518. {
  519. hdr -= pbxcan->filtermap[ptr].id32bit_cnt;
  520. *pbase += pbxcan->filtermap[ptr].id32bit_cnt / 2;
  521. }
  522. else
  523. {
  524. *pbase += hdr / 2;
  525. *poff = hdr % 2;
  526. return RT_EOK;
  527. }
  528. if (hdr > pbxcan->filtermap[ptr].id16mask_cnt)
  529. {
  530. hdr -= pbxcan->filtermap[ptr].id16mask_cnt;
  531. *pbase += pbxcan->filtermap[ptr].id16mask_cnt / 2;
  532. }
  533. else
  534. {
  535. *pbase += hdr / 2;
  536. *poff = hdr % 2;
  537. return RT_EOK;
  538. }
  539. if (hdr > pbxcan->filtermap[ptr].id16bit_cnt)
  540. {
  541. return RT_ERROR;
  542. }
  543. else
  544. {
  545. *pbase += hdr / 4;
  546. *poff = hdr % 4;
  547. return RT_EOK;
  548. }
  549. }
  550. static void calcandormask(rt_uint32_t *pmask, rt_uint32_t shift, rt_int32_t count)
  551. {
  552. rt_uint32_t tmpmask;
  553. rt_uint32_t tmpmaskarray[BX_CAN_FILTER_MAX_ARRAY_SIZE] = {0,};
  554. rt_int32_t i;
  555. i = 0;
  556. while (count > 0)
  557. {
  558. if (i >= 32)
  559. {
  560. tmpmaskarray[i] = 0xFFFFFFFF;
  561. }
  562. else
  563. {
  564. tmpmaskarray[i] = (0x01 << count) - 1;
  565. }
  566. count -= 32;
  567. i++;
  568. };
  569. count = i;
  570. for (i = 0; i < count && i < BX_CAN_FILTER_MAX_ARRAY_SIZE; i++)
  571. {
  572. tmpmask = tmpmaskarray[i];
  573. pmask[i] |= (rt_uint32_t)(tmpmask << shift);
  574. if (i < BX_CAN_FILTER_MAX_ARRAY_SIZE - 1)
  575. {
  576. pmask[i + 1] |= (rt_uint32_t)(tmpmask >> (32 - shift));
  577. }
  578. }
  579. }
  580. static void calcfiltermasks(struct stm_bxcan *pbxcan)
  581. {
  582. rt_memset(&pbxcan->filtermask, 0, sizeof(pbxcan->filtermask));
  583. pbxcan->filtermask.id32maskshift[0] = 0;
  584. if (pbxcan->filtermap[0].id32mask_cnt)
  585. {
  586. calcandormask(pbxcan->filtermask.id32maskm, pbxcan->filtermask.id32maskshift[0],
  587. pbxcan->filtermap[0].id32mask_cnt);
  588. }
  589. pbxcan->filtermask.id32maskshift[1] = pbxcan->fifo1filteroff * 4;
  590. if (pbxcan->filtermap[1].id32mask_cnt)
  591. {
  592. calcandormask(pbxcan->filtermask.id32maskm, pbxcan->filtermask.id32maskshift[1],
  593. pbxcan->filtermap[1].id32mask_cnt);
  594. }
  595. pbxcan->filtermask.id32bitshift[0] = pbxcan->filtermask.id32maskshift[0] +
  596. pbxcan->filtermap[0].id32mask_cnt;
  597. if (pbxcan->filtermap[0].id32bit_cnt)
  598. {
  599. calcandormask(pbxcan->filtermask.id32bitm, pbxcan->filtermask.id32bitshift[0],
  600. pbxcan->filtermap[0].id32bit_cnt);
  601. }
  602. pbxcan->filtermask.id32bitshift[1] = pbxcan->filtermask.id32maskshift[1] +
  603. pbxcan->filtermap[1].id32mask_cnt;
  604. if (pbxcan->filtermap[1].id32bit_cnt)
  605. {
  606. calcandormask(pbxcan->filtermask.id32bitm, pbxcan->filtermask.id32bitshift[1],
  607. pbxcan->filtermap[1].id32bit_cnt);
  608. }
  609. pbxcan->filtermask.id16maskshift[0] = pbxcan->filtermask.id32bitshift[0] +
  610. pbxcan->filtermap[0].id32bit_cnt;
  611. if (pbxcan->filtermap[0].id16mask_cnt)
  612. {
  613. calcandormask(pbxcan->filtermask.id16maskm, pbxcan->filtermask.id16maskshift[0],
  614. pbxcan->filtermap[0].id16mask_cnt);
  615. }
  616. pbxcan->filtermask.id16maskshift[1] = pbxcan->filtermask.id32bitshift[1] +
  617. pbxcan->filtermap[1].id32bit_cnt;
  618. if (pbxcan->filtermap[1].id16mask_cnt)
  619. {
  620. calcandormask(pbxcan->filtermask.id16maskm, pbxcan->filtermask.id16maskshift[1],
  621. pbxcan->filtermap[1].id16mask_cnt);
  622. }
  623. pbxcan->filtermask.id16bitshift[0] = pbxcan->filtermask.id16maskshift[0] +
  624. pbxcan->filtermap[0].id16mask_cnt;
  625. if (pbxcan->filtermap[0].id16bit_cnt)
  626. {
  627. calcandormask(pbxcan->filtermask.id16bitm, pbxcan->filtermask.id16bitshift[0],
  628. pbxcan->filtermap[0].id16bit_cnt);
  629. }
  630. pbxcan->filtermask.id16bitshift[1] = pbxcan->filtermask.id16maskshift[1] +
  631. pbxcan->filtermap[1].id16mask_cnt;
  632. if (pbxcan->filtermap[1].id16bit_cnt)
  633. {
  634. calcandormask(pbxcan->filtermask.id16bitm, pbxcan->filtermask.id16bitshift[1],
  635. pbxcan->filtermap[1].id16bit_cnt);
  636. }
  637. }
  638. static rt_int32_t bxcanfindfilter(struct stm_bxcan *pbxcan, struct rt_can_filter_item *pitem,
  639. rt_int32_t type, rt_int32_t *base, rt_int32_t *off)
  640. {
  641. rt_int32_t i;
  642. rt_uint32_t bits, thisid, thismask, shift, found;
  643. CAN_FilterRegister_TypeDef *pfilterreg;
  644. found = 0;
  645. switch (type)
  646. {
  647. case 3:
  648. shift = 3;
  649. for (i = 0; i < BX_CAN_MAX_FILTERS; i++)
  650. {
  651. bits = 0x01 << (i & 0x1F);
  652. if (bits & (pbxcan->filtermask.id32maskm[i >> 5] & pbxcan->alocmask[i >> 5]))
  653. {
  654. bxcancalcbaseoff(pbxcan, i, base, off);
  655. pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[*base];
  656. thisid = (rt_uint32_t)pitem->id << shift;
  657. thismask = (rt_uint32_t)pitem->mask << shift;
  658. if (pitem->ide)
  659. {
  660. thisid |= CAN_ID_EXT;
  661. thismask |= CAN_ID_EXT;
  662. }
  663. if (pitem->rtr)
  664. {
  665. thisid |= CAN_RTR_REMOTE;
  666. thismask |= CAN_RTR_REMOTE;
  667. }
  668. if (pfilterreg->FR1 == thisid && pfilterreg->FR2 == thismask)
  669. {
  670. found = 1;
  671. break;
  672. }
  673. }
  674. }
  675. break;
  676. case 2:
  677. shift = 3;
  678. for (i = 0; i < BX_CAN_MAX_FILTERS; i++)
  679. {
  680. bits = 0x01 << (i % 32);
  681. if (bits & (pbxcan->filtermask.id32bitm[i >> 5] & pbxcan->alocmask[i >> 5]))
  682. {
  683. bxcancalcbaseoff(pbxcan, i, base, off);
  684. pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[*base];
  685. thisid = (rt_uint32_t)pitem->id << shift;
  686. if (pitem->ide)
  687. {
  688. thisid |= CAN_ID_EXT;
  689. }
  690. if (pitem->rtr)
  691. {
  692. thisid |= CAN_RTR_REMOTE;
  693. }
  694. if ((*off == 0 && pfilterreg->FR1 == thisid) ||
  695. (*off == 1 && pfilterreg->FR2 == thisid)
  696. )
  697. {
  698. found = 1;
  699. break;
  700. }
  701. }
  702. }
  703. break;
  704. case 1:
  705. shift = 5;
  706. for (i = 0; i < BX_CAN_MAX_FILTERS; i++)
  707. {
  708. bits = 0x01 << (i % 32);
  709. if (bits & (pbxcan->filtermask.id16maskm[i >> 5] & pbxcan->alocmask[i >> 5]))
  710. {
  711. bxcancalcbaseoff(pbxcan, i, base, off);
  712. pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[*base];
  713. thisid = pitem->id << shift;
  714. if (pitem->rtr)
  715. {
  716. thisid |= CAN_RTR_REMOTE << (shift - 2);
  717. }
  718. thismask = pitem->mask << shift;
  719. if (pitem->rtr)
  720. {
  721. thismask |= CAN_RTR_REMOTE << (shift - 2);
  722. }
  723. if (*off == 0 && pfilterreg->FR1 == ((thisid & 0x0000FFFF) | ((thismask & 0x0000FFFF) << 16)) ||
  724. *off == 1 && pfilterreg->FR2 == ((thisid & 0x0000FFFF) | ((thismask & 0x0000FFFF) << 16))
  725. )
  726. {
  727. found = 1;
  728. break;
  729. }
  730. }
  731. }
  732. break;
  733. case 0:
  734. shift = 5;
  735. for (i = 0; i < BX_CAN_MAX_FILTERS; i++)
  736. {
  737. bits = 0x01 << (i % 32);
  738. if (bits & (pbxcan->filtermask.id16bitm[i >> 5] & pbxcan->alocmask[i >> 5]))
  739. {
  740. bxcancalcbaseoff(pbxcan, i, base, off);
  741. pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[*base];
  742. thisid = pitem->id << shift;
  743. if (pitem->rtr)
  744. {
  745. thisid |= CAN_RTR_REMOTE << (shift - 2);
  746. }
  747. if (*off < 2 && ((rt_uint16_t *)&pfilterreg->FR1)[*off & 0x01] == thisid ||
  748. *off >= 2 && ((rt_uint16_t *)&pfilterreg->FR2)[*off & 0x01] == thisid)
  749. {
  750. found = 1;
  751. break;
  752. }
  753. }
  754. }
  755. break;
  756. }
  757. if (found)
  758. {
  759. return i;
  760. }
  761. return -1;
  762. }
  763. extern int __rt_ffs(int value);
  764. static rt_err_t bxcanallocfilter(rt_uint32_t *pmask, rt_uint32_t *palocmask,
  765. rt_uint32_t count, rt_int32_t *hdr)
  766. {
  767. rt_int32_t i;
  768. for (i = 0; i < count; i++)
  769. {
  770. rt_enter_critical();
  771. if ((pmask[i] & ~palocmask[i]) != 0)
  772. {
  773. *hdr = __rt_ffs(pmask[i] & ~palocmask[i]) - 1 + i * 32;
  774. palocmask[i] |= 0x01 << (*hdr % 0x1F);
  775. rt_exit_critical();
  776. return RT_EOK;
  777. }
  778. rt_exit_critical();
  779. }
  780. if (i >= count)
  781. {
  782. return RT_ENOMEM;
  783. }
  784. return RT_EOK;
  785. }
  786. static rt_err_t bxcanallocnewfilter(struct stm_bxcan *pbxcan, rt_int32_t actived,
  787. rt_int32_t type, rt_int32_t *hdr, rt_int32_t *base, rt_int32_t *off)
  788. {
  789. rt_err_t res;
  790. *hdr = -1;
  791. switch (type)
  792. {
  793. case 0x03:
  794. res = bxcanallocfilter(pbxcan->filtermask.id32maskm, pbxcan->alocmask,
  795. BX_CAN_FILTER_MAX_ARRAY_SIZE, hdr);
  796. break;
  797. case 0x02:
  798. res = bxcanallocfilter(pbxcan->filtermask.id32bitm, pbxcan->alocmask,
  799. BX_CAN_FILTER_MAX_ARRAY_SIZE, hdr);
  800. break;
  801. case 0x01:
  802. res = bxcanallocfilter(pbxcan->filtermask.id16maskm, pbxcan->alocmask,
  803. BX_CAN_FILTER_MAX_ARRAY_SIZE, hdr);
  804. break;
  805. case 0x00:
  806. res = bxcanallocfilter(pbxcan->filtermask.id16bitm, pbxcan->alocmask,
  807. BX_CAN_FILTER_MAX_ARRAY_SIZE, hdr);
  808. break;
  809. }
  810. if (res != RT_EOK || *hdr < 0)
  811. {
  812. return RT_ENOMEM;
  813. }
  814. bxcancalcbaseoff(pbxcan, *hdr, base, off);
  815. return RT_EOK;
  816. }
  817. static rt_err_t bxmodifyfilter(struct stm_bxcan *pbxcan, struct rt_can_filter_item *pitem, rt_uint32_t actived)
  818. {
  819. rt_int32_t fcase;
  820. rt_err_t res;
  821. rt_int32_t hdr, fbase, foff;
  822. fcase = (pitem->mode | (pitem->ide << 1));
  823. hdr = bxcanfindfilter(pbxcan, pitem, fcase, &fbase, &foff);
  824. if (hdr < 0)
  825. {
  826. if (!actived)
  827. {
  828. return RT_EOK;
  829. }
  830. else if (pitem->hdr == -1)
  831. {
  832. res = bxcanallocnewfilter(pbxcan, actived, fcase, &hdr, &fbase, &foff);
  833. if (res != RT_EOK)
  834. {
  835. return res;
  836. }
  837. }
  838. else if (pitem->hdr >= 0)
  839. {
  840. rt_enter_critical();
  841. res = bxcancalcbaseoff(pbxcan, pitem->hdr, &fbase, &foff);
  842. if (res != RT_EOK)
  843. {
  844. return res;
  845. }
  846. hdr = pitem->hdr;
  847. if (actived)
  848. {
  849. pbxcan->alocmask[hdr >> 5] |= 0x01 << (hdr % 0x1F);
  850. }
  851. rt_exit_critical();
  852. }
  853. }
  854. else
  855. {
  856. if (!actived)
  857. {
  858. pitem->hdr = hdr;
  859. }
  860. else if (hdr >= 0 && (pitem->hdr >= 0 || pitem->hdr == -1))
  861. {
  862. pitem->hdr = hdr;
  863. return RT_EBUSY;
  864. }
  865. }
  866. rt_uint32_t ID[2];
  867. rt_uint32_t shift;
  868. rt_uint32_t thisid;
  869. rt_uint32_t thismask;
  870. CAN_FilterInitTypeDef CAN_FilterInitStructure;
  871. pitem->hdr = hdr;
  872. CAN_FilterRegister_TypeDef *pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[fbase];
  873. ID[0] = pfilterreg->FR1;
  874. ID[1] = pfilterreg->FR2;
  875. CAN_FilterInitStructure.CAN_FilterNumber = (pfilterreg - &CAN1->sFilterRegister[0]);
  876. if (pitem->mode)
  877. {
  878. CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  879. }
  880. else
  881. {
  882. CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
  883. }
  884. if (pitem->ide)
  885. {
  886. CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  887. }
  888. else
  889. {
  890. CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
  891. }
  892. switch (fcase)
  893. {
  894. case 0x03:
  895. if (actived)
  896. {
  897. shift = 3;
  898. thisid = (rt_uint32_t)pitem->id << shift;
  899. thismask = (rt_uint32_t)pitem->mask << shift;
  900. if (pitem->ide)
  901. {
  902. thisid |= CAN_ID_EXT;
  903. thismask |= CAN_ID_EXT;
  904. }
  905. if (pitem->rtr)
  906. {
  907. thisid |= CAN_RTR_REMOTE;
  908. thismask |= CAN_RTR_REMOTE;
  909. }
  910. ID[0] = thisid;
  911. ID[1] = thismask;
  912. }
  913. else
  914. {
  915. ID[0] = 0xFFFFFFFF;
  916. ID[1] = 0xFFFFFFFF;
  917. }
  918. break;
  919. case 0x02:
  920. if (actived)
  921. {
  922. shift = 3;
  923. thisid = (rt_uint32_t)pitem->id << shift;
  924. if (pitem->ide)
  925. {
  926. thisid |= CAN_ID_EXT;
  927. }
  928. if (pitem->rtr)
  929. {
  930. thisid |= CAN_RTR_REMOTE;
  931. }
  932. ID[foff] = thisid;
  933. }
  934. else
  935. {
  936. ID[foff] = 0xFFFFFFFF;
  937. }
  938. break;
  939. case 0x01:
  940. if (actived)
  941. {
  942. shift = 5;
  943. thisid = pitem->id << shift;
  944. if (pitem->rtr)
  945. {
  946. thisid |= CAN_RTR_REMOTE << (shift - 2);
  947. }
  948. thismask = pitem->mask << shift;
  949. if (pitem->rtr)
  950. {
  951. thismask |= CAN_RTR_REMOTE << (shift - 2);
  952. }
  953. ID[foff] = (thisid & 0x0000FFFF) | ((thismask & 0x0000FFFF) << 16);
  954. }
  955. else
  956. {
  957. ID[foff] = 0xFFFFFFFF;
  958. }
  959. break;
  960. case 0x00:
  961. if (actived)
  962. {
  963. shift = 5;
  964. thisid = pitem->id << shift;
  965. if (pitem->rtr)
  966. {
  967. thisid |= CAN_RTR_REMOTE << (shift - 2);
  968. }
  969. ((rt_uint16_t *) ID)[foff] = thisid;
  970. }
  971. else
  972. {
  973. ((rt_uint16_t *) ID)[foff] = 0xFFFF;
  974. }
  975. break;
  976. }
  977. CAN_FilterInitStructure.CAN_FilterIdHigh = ((ID[1]) & 0x0000FFFF);
  978. CAN_FilterInitStructure.CAN_FilterIdLow = ID[0] & 0x0000FFFF;
  979. CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (ID[1] & 0xFFFF0000) >> 16;
  980. CAN_FilterInitStructure.CAN_FilterMaskIdLow = (ID[0] & 0xFFFF0000) >> 16;
  981. if (fbase >= pbxcan->fifo1filteroff)
  982. {
  983. CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 1;
  984. }
  985. else
  986. {
  987. CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
  988. }
  989. if (ID[0] != 0xFFFFFFFF || ID[1] != 0xFFFFFFFF)
  990. {
  991. CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  992. }
  993. else
  994. {
  995. CAN_FilterInitStructure.CAN_FilterActivation = DISABLE;
  996. }
  997. if (!actived)
  998. {
  999. rt_enter_critical();
  1000. pbxcan->alocmask[hdr >> 5] &= ~(0x01 << (hdr % 0x1F));
  1001. rt_exit_critical();
  1002. }
  1003. CAN_FilterInit(&CAN_FilterInitStructure);
  1004. return RT_EOK;
  1005. }
  1006. static rt_err_t setfilter(struct stm_bxcan *pbxcan, struct rt_can_filter_config *pconfig)
  1007. {
  1008. struct rt_can_filter_item *pitem = pconfig->items;
  1009. rt_uint32_t count = pconfig->count;
  1010. rt_err_t res;
  1011. while (count)
  1012. {
  1013. res = bxmodifyfilter(pbxcan, pitem, pconfig->actived);
  1014. if (res != RT_EOK)
  1015. {
  1016. return res;
  1017. }
  1018. pitem++;
  1019. count--;
  1020. }
  1021. return RT_EOK;
  1022. }
  1023. static rt_err_t configure(struct rt_can_device *can, struct can_configure *cfg)
  1024. {
  1025. CAN_TypeDef *pbxcan;
  1026. pbxcan = ((struct stm_bxcan *) can->parent.user_data)->reg;
  1027. assert_param(IS_CAN_ALL_PERIPH(pbxcan));
  1028. if (pbxcan == CAN1)
  1029. {
  1030. bxcan1_hw_init();
  1031. bxcan_init(pbxcan, cfg->baud_rate, can->config.mode);
  1032. bxcan1_filter_init(can);
  1033. }
  1034. else
  1035. {
  1036. #ifdef USING_BXCAN2
  1037. bxcan2_hw_init();
  1038. bxcan_init(pbxcan, cfg->baud_rate, can->config.mode);
  1039. bxcan2_filter_init(can);
  1040. #endif
  1041. }
  1042. return RT_EOK;
  1043. }
  1044. static rt_err_t control(struct rt_can_device *can, int cmd, void *arg)
  1045. {
  1046. struct stm_bxcan *pbxcan;
  1047. rt_uint32_t argval;
  1048. NVIC_InitTypeDef NVIC_InitStructure;
  1049. pbxcan = (struct stm_bxcan *) can->parent.user_data;
  1050. assert_param(pbxcan != RT_NULL);
  1051. switch (cmd)
  1052. {
  1053. case RT_DEVICE_CTRL_CLR_INT:
  1054. argval = (rt_uint32_t) arg;
  1055. if (argval == RT_DEVICE_FLAG_INT_RX)
  1056. {
  1057. NVIC_DisableIRQ(pbxcan->rcvirq0);
  1058. NVIC_DisableIRQ(pbxcan->rcvirq1);
  1059. CAN_ITConfig(pbxcan->reg, CAN_IT_FMP0 , DISABLE);
  1060. CAN_ITConfig(pbxcan->reg, CAN_IT_FF0 , DISABLE);
  1061. CAN_ITConfig(pbxcan->reg, CAN_IT_FOV0 , DISABLE);
  1062. CAN_ITConfig(pbxcan->reg, CAN_IT_FMP1 , DISABLE);
  1063. CAN_ITConfig(pbxcan->reg, CAN_IT_FF1 , DISABLE);
  1064. CAN_ITConfig(pbxcan->reg, CAN_IT_FOV1 , DISABLE);
  1065. }
  1066. else if (argval == RT_DEVICE_FLAG_INT_TX)
  1067. {
  1068. NVIC_DisableIRQ(pbxcan->sndirq);
  1069. CAN_ITConfig(pbxcan->reg, CAN_IT_TME, DISABLE);
  1070. }
  1071. else if (argval == RT_DEVICE_CAN_INT_ERR)
  1072. {
  1073. CAN_ITConfig(pbxcan->reg, CAN_IT_BOF , DISABLE);
  1074. CAN_ITConfig(pbxcan->reg, CAN_IT_LEC , DISABLE);
  1075. CAN_ITConfig(pbxcan->reg, CAN_IT_ERR , DISABLE);
  1076. NVIC_DisableIRQ(pbxcan->errirq);
  1077. }
  1078. break;
  1079. case RT_DEVICE_CTRL_SET_INT:
  1080. argval = (rt_uint32_t) arg;
  1081. if (argval == RT_DEVICE_FLAG_INT_RX)
  1082. {
  1083. CAN_ITConfig(pbxcan->reg, CAN_IT_FMP0 , ENABLE);
  1084. CAN_ITConfig(pbxcan->reg, CAN_IT_FF0 , ENABLE);
  1085. CAN_ITConfig(pbxcan->reg, CAN_IT_FOV0 , ENABLE);
  1086. CAN_ITConfig(pbxcan->reg, CAN_IT_FMP1 , ENABLE);
  1087. CAN_ITConfig(pbxcan->reg, CAN_IT_FF1 , ENABLE);
  1088. CAN_ITConfig(pbxcan->reg, CAN_IT_FOV1 , ENABLE);
  1089. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  1090. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  1091. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  1092. NVIC_InitStructure.NVIC_IRQChannel = pbxcan->rcvirq0;
  1093. NVIC_Init(&NVIC_InitStructure);
  1094. NVIC_InitStructure.NVIC_IRQChannel = pbxcan->rcvirq1;
  1095. NVIC_Init(&NVIC_InitStructure);
  1096. }
  1097. else if (argval == RT_DEVICE_FLAG_INT_TX)
  1098. {
  1099. CAN_ITConfig(pbxcan->reg, CAN_IT_TME, ENABLE);
  1100. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  1101. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  1102. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  1103. NVIC_InitStructure.NVIC_IRQChannel = pbxcan->sndirq;
  1104. NVIC_Init(&NVIC_InitStructure);
  1105. }
  1106. else if (argval == RT_DEVICE_CAN_INT_ERR)
  1107. {
  1108. CAN_ITConfig(pbxcan->reg, CAN_IT_BOF , ENABLE);
  1109. CAN_ITConfig(pbxcan->reg, CAN_IT_LEC , ENABLE);
  1110. CAN_ITConfig(pbxcan->reg, CAN_IT_ERR , ENABLE);
  1111. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  1112. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  1113. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  1114. NVIC_InitStructure.NVIC_IRQChannel = pbxcan->errirq;
  1115. NVIC_Init(&NVIC_InitStructure);
  1116. }
  1117. break;
  1118. case RT_CAN_CMD_SET_FILTER:
  1119. return setfilter(pbxcan, (struct rt_can_filter_config *) arg);
  1120. break;
  1121. case RT_CAN_CMD_SET_MODE:
  1122. argval = (rt_uint32_t) arg;
  1123. if (argval != RT_CAN_MODE_NORMAL ||
  1124. argval != RT_CAN_MODE_LISEN ||
  1125. argval != RT_CAN_MODE_LOOPBACK ||
  1126. argval != RT_CAN_MODE_LOOPBACKANLISEN)
  1127. {
  1128. return RT_ERROR;
  1129. }
  1130. if (argval != can->config.mode)
  1131. {
  1132. can->config.mode = argval;
  1133. return bxcan_set_mode(pbxcan->reg, argval);
  1134. }
  1135. break;
  1136. case RT_CAN_CMD_SET_BAUD:
  1137. argval = (rt_uint32_t) arg;
  1138. if (argval != CAN1MBaud &&
  1139. argval != CAN800kBaud &&
  1140. argval != CAN500kBaud &&
  1141. argval != CAN250kBaud &&
  1142. argval != CAN125kBaud &&
  1143. argval != CAN100kBaud &&
  1144. argval != CAN50kBaud &&
  1145. argval != CAN20kBaud &&
  1146. argval != CAN10kBaud)
  1147. {
  1148. return RT_ERROR;
  1149. }
  1150. if (argval != can->config.baud_rate)
  1151. {
  1152. can->config.baud_rate = argval;
  1153. return bxcan_set_baud_rate(pbxcan->reg, argval);
  1154. }
  1155. break;
  1156. case RT_CAN_CMD_SET_PRIV:
  1157. argval = (rt_uint32_t) arg;
  1158. if (argval != RT_CAN_MODE_PRIV ||
  1159. argval != RT_CAN_MODE_NOPRIV)
  1160. {
  1161. return RT_ERROR;
  1162. }
  1163. if (argval != can->config.privmode)
  1164. {
  1165. can->config.privmode = argval;
  1166. return bxcan_set_privmode(pbxcan->reg, argval);
  1167. }
  1168. break;
  1169. case RT_CAN_CMD_GET_STATUS:
  1170. {
  1171. rt_uint32_t errtype;
  1172. errtype = pbxcan->reg->ESR;
  1173. can->status.rcverrcnt = errtype >> 24;
  1174. can->status.snderrcnt = (errtype >> 16 & 0xFF);
  1175. can->status.errcode = errtype & 0x07;
  1176. if (arg != &can->status)
  1177. {
  1178. rt_memcpy(arg, &can->status, sizeof(can->status));
  1179. }
  1180. }
  1181. break;
  1182. }
  1183. return RT_EOK;
  1184. }
  1185. static int sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno)
  1186. {
  1187. CAN_TypeDef *pbxcan;
  1188. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  1189. pbxcan = ((struct stm_bxcan *) can->parent.user_data)->reg;
  1190. assert_param(IS_CAN_ALL_PERIPH(pbxcan));
  1191. pbxcan->sTxMailBox[boxno].TIR &= TMIDxR_TXRQ;
  1192. if (pmsg->ide == RT_CAN_STDID)
  1193. {
  1194. assert_param(IS_CAN_STDID(pmsg->id));
  1195. pbxcan->sTxMailBox[boxno].TIR |= ((pmsg->id << 21) | \
  1196. (pmsg->rtr << 1));
  1197. }
  1198. else
  1199. {
  1200. assert_param(IS_CAN_EXTID(pmsg->id));
  1201. pbxcan->sTxMailBox[boxno].TIR |= ((pmsg->id << 3) | \
  1202. (pmsg->ide << 2) | \
  1203. (pmsg->rtr << 1));
  1204. }
  1205. pmsg->len &= (uint8_t)0x0000000F;
  1206. pbxcan->sTxMailBox[boxno].TDTR &= (uint32_t)0xFFFFFFF0;
  1207. pbxcan->sTxMailBox[boxno].TDTR |= pmsg->len;
  1208. pbxcan->sTxMailBox[boxno].TDLR = (((uint32_t)pmsg->data[3] << 24) |
  1209. ((uint32_t)pmsg->data[2] << 16) |
  1210. ((uint32_t)pmsg->data[1] << 8) |
  1211. ((uint32_t)pmsg->data[0]));
  1212. if (pmsg->len > 4)
  1213. {
  1214. pbxcan->sTxMailBox[boxno].TDHR = (((uint32_t)pmsg->data[7] << 24) |
  1215. ((uint32_t)pmsg->data[6] << 16) |
  1216. ((uint32_t)pmsg->data[5] << 8) |
  1217. ((uint32_t)pmsg->data[4]));
  1218. }
  1219. pbxcan->sTxMailBox[boxno].TIR |= TMIDxR_TXRQ;
  1220. return RT_EOK;
  1221. }
  1222. static int recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno)
  1223. {
  1224. CAN_TypeDef *pbxcan;
  1225. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  1226. pbxcan = ((struct stm_bxcan *) can->parent.user_data)->reg;
  1227. assert_param(IS_CAN_ALL_PERIPH(pbxcan));
  1228. assert_param(IS_CAN_FIFO(boxno));
  1229. pmsg->ide = ((uint8_t)0x04 & pbxcan->sFIFOMailBox[boxno].RIR) >> 2;
  1230. if (pmsg->ide == CAN_Id_Standard)
  1231. {
  1232. pmsg->id = (uint32_t)0x000007FF & (pbxcan->sFIFOMailBox[boxno].RIR >> 21);
  1233. }
  1234. else
  1235. {
  1236. pmsg->id = (uint32_t)0x1FFFFFFF & (pbxcan->sFIFOMailBox[boxno].RIR >> 3);
  1237. }
  1238. pmsg->rtr = (uint8_t)((0x02 & pbxcan->sFIFOMailBox[boxno].RIR) >> 1);
  1239. pmsg->len = (uint8_t)0x0F & pbxcan->sFIFOMailBox[boxno].RDTR;
  1240. pmsg->data[0] = (uint8_t)0xFF & pbxcan->sFIFOMailBox[boxno].RDLR;
  1241. pmsg->data[1] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDLR >> 8);
  1242. pmsg->data[2] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDLR >> 16);
  1243. pmsg->data[3] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDLR >> 24);
  1244. if (pmsg->len > 4)
  1245. {
  1246. pmsg->data[4] = (uint8_t)0xFF & pbxcan->sFIFOMailBox[boxno].RDHR;
  1247. pmsg->data[5] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDHR >> 8);
  1248. pmsg->data[6] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDHR >> 16);
  1249. pmsg->data[7] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDHR >> 24);
  1250. }
  1251. pmsg->hdr = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDTR >> 8);
  1252. if (boxno) pmsg->hdr += ((struct stm_bxcan *) can->parent.user_data)->fifo1filteroff * 4;
  1253. return RT_EOK;
  1254. }
  1255. static const struct rt_can_ops canops =
  1256. {
  1257. configure,
  1258. control,
  1259. sendmsg,
  1260. recvmsg,
  1261. };
  1262. #ifdef USING_BXCAN1
  1263. static struct stm_bxcan bxcan1data =
  1264. {
  1265. .reg = CAN1,
  1266. .mfrbase = (void *) &CAN1->sFilterRegister[0],
  1267. .sndirq = CAN1_TX_IRQn,
  1268. .rcvirq0 = CAN1_RX0_IRQn,
  1269. .rcvirq1 = CAN1_RX1_IRQn,
  1270. .errirq = CAN1_SCE_IRQn,
  1271. .alocmask = {0, 0},
  1272. .filtercnt = BX_CAN2_FMRSTART,
  1273. .fifo1filteroff = 7,
  1274. .filtermap = {
  1275. [0] = {
  1276. .id32mask_cnt = 0,
  1277. .id32bit_cnt = 0,
  1278. .id16mask_cnt = 2,
  1279. .id16bit_cnt = 24,
  1280. },
  1281. [1] = {
  1282. .id32mask_cnt = 0,
  1283. .id32bit_cnt = 0,
  1284. .id16mask_cnt = 2,
  1285. .id16bit_cnt = 24,
  1286. },
  1287. },
  1288. };
  1289. struct rt_can_device bxcan1;
  1290. void CAN1_RX0_IRQHandler(void)
  1291. {
  1292. if (CAN1->RF0R & 0x03)
  1293. {
  1294. if ((CAN1->RF0R & CAN_RF0R_FOVR0) != 0)
  1295. {
  1296. CAN1->RF0R = CAN_RF0R_FOVR0;
  1297. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_RXOF_IND | 0 << 8);
  1298. }
  1299. else
  1300. {
  1301. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_RX_IND | 0 << 8);
  1302. }
  1303. CAN1->RF0R |= CAN_RF0R_RFOM0;
  1304. }
  1305. }
  1306. void CAN1_RX1_IRQHandler(void)
  1307. {
  1308. if (CAN1->RF1R & 0x03)
  1309. {
  1310. if ((CAN1->RF1R & CAN_RF1R_FOVR1) != 0)
  1311. {
  1312. CAN1->RF1R = CAN_RF1R_FOVR1;
  1313. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_RXOF_IND | 1 << 8);
  1314. }
  1315. else
  1316. {
  1317. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_RX_IND | 1 << 8);
  1318. }
  1319. CAN1->RF1R |= CAN_RF1R_RFOM1;
  1320. }
  1321. }
  1322. void CAN1_TX_IRQHandler(void)
  1323. {
  1324. rt_uint32_t state;
  1325. if (CAN1->TSR & (CAN_TSR_RQCP0))
  1326. {
  1327. state = CAN1->TSR & (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0);
  1328. CAN1->TSR |= CAN_TSR_RQCP0;
  1329. if (state == (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0))
  1330. {
  1331. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_DONE | 0 << 8);
  1332. }
  1333. else
  1334. {
  1335. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  1336. }
  1337. }
  1338. if (CAN1->TSR & (CAN_TSR_RQCP1))
  1339. {
  1340. state = CAN1->TSR & (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1);
  1341. CAN1->TSR |= CAN_TSR_RQCP1;
  1342. if (state == (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1))
  1343. {
  1344. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_DONE | 1 << 8);
  1345. }
  1346. else
  1347. {
  1348. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  1349. }
  1350. }
  1351. if (CAN1->TSR & (CAN_TSR_RQCP2))
  1352. {
  1353. state = CAN1->TSR & (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2);
  1354. CAN1->TSR |= CAN_TSR_RQCP2;
  1355. if (state == (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2))
  1356. {
  1357. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_DONE | 2 << 8);
  1358. }
  1359. else
  1360. {
  1361. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  1362. }
  1363. }
  1364. }
  1365. void CAN1_SCE_IRQHandler(void)
  1366. {
  1367. rt_uint32_t errtype;
  1368. errtype = CAN1->ESR;
  1369. if (errtype & 0x70 && bxcan1.status.lasterrtype == (errtype & 0x70))
  1370. {
  1371. switch ((errtype & 0x70) >> 4)
  1372. {
  1373. case RT_CAN_BUS_BIT_PAD_ERR:
  1374. bxcan1.status.bitpaderrcnt++;
  1375. break;
  1376. case RT_CAN_BUS_FORMAT_ERR:
  1377. bxcan1.status.formaterrcnt++;
  1378. break;
  1379. case RT_CAN_BUS_ACK_ERR:
  1380. bxcan1.status.ackerrcnt++;
  1381. break;
  1382. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  1383. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  1384. bxcan1.status.biterrcnt++;
  1385. break;
  1386. case RT_CAN_BUS_CRC_ERR:
  1387. bxcan1.status.crcerrcnt++;
  1388. break;
  1389. }
  1390. bxcan1.status.lasterrtype = errtype & 0x70;
  1391. CAN1->ESR &= ~0x70;
  1392. }
  1393. bxcan1.status.rcverrcnt = errtype >> 24;
  1394. bxcan1.status.snderrcnt = (errtype >> 16 & 0xFF);
  1395. bxcan1.status.errcode = errtype & 0x07;
  1396. CAN1->MSR |= CAN_MSR_ERRI;
  1397. }
  1398. #endif /*USING_BXCAN1*/
  1399. #ifdef USING_BXCAN2
  1400. static struct stm_bxcan bxcan2data =
  1401. {
  1402. .reg = CAN2,
  1403. .mfrbase = (void *) &CAN1->sFilterRegister[BX_CAN2_FMRSTART],
  1404. .sndirq = CAN2_TX_IRQn,
  1405. .rcvirq0 = CAN2_RX0_IRQn,
  1406. .rcvirq1 = CAN2_RX1_IRQn,
  1407. .errirq = CAN2_SCE_IRQn,
  1408. .alocmask = {0, 0},
  1409. .filtercnt = BX_CAN_FMRNUMBER - BX_CAN2_FMRSTART,
  1410. .fifo1filteroff = 7,
  1411. .filtermap = {
  1412. [0] = {
  1413. .id32mask_cnt = 0,
  1414. .id32bit_cnt = 0,
  1415. .id16mask_cnt = 2,
  1416. .id16bit_cnt = 24,
  1417. },
  1418. [1] = {
  1419. .id32mask_cnt = 0,
  1420. .id32bit_cnt = 0,
  1421. .id16mask_cnt = 2,
  1422. .id16bit_cnt = 24,
  1423. },
  1424. },
  1425. };
  1426. struct rt_can_device bxcan2;
  1427. void CAN2_RX0_IRQHandler(void)
  1428. {
  1429. if (CAN2->RF0R & 0x03)
  1430. {
  1431. if ((CAN2->RF0R & CAN_RF0R_FOVR0) != 0)
  1432. {
  1433. CAN2->RF0R = CAN_RF0R_FOVR0;
  1434. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_RXOF_IND | 0 << 8);
  1435. }
  1436. else
  1437. {
  1438. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_RX_IND | 0 << 8);
  1439. }
  1440. CAN2->RF0R |= CAN_RF0R_RFOM0;
  1441. }
  1442. }
  1443. void CAN2_RX1_IRQHandler(void)
  1444. {
  1445. if (CAN2->RF1R & 0x03)
  1446. {
  1447. if ((CAN2->RF1R & CAN_RF1R_FOVR1) != 0)
  1448. {
  1449. CAN2->RF1R = CAN_RF1R_FOVR1;
  1450. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_RXOF_IND | 1 << 8);
  1451. }
  1452. else
  1453. {
  1454. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_RX_IND | 1 << 8);
  1455. }
  1456. CAN2->RF1R |= CAN_RF1R_RFOM1;
  1457. }
  1458. }
  1459. void CAN2_TX_IRQHandler(void)
  1460. {
  1461. rt_uint32_t state;
  1462. if (CAN2->TSR & (CAN_TSR_RQCP0))
  1463. {
  1464. state = CAN2->TSR & (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0);
  1465. CAN2->TSR |= CAN_TSR_RQCP0;
  1466. if (state == (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0))
  1467. {
  1468. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_DONE | 0 << 8);
  1469. }
  1470. else
  1471. {
  1472. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  1473. }
  1474. }
  1475. if (CAN2->TSR & (CAN_TSR_RQCP1))
  1476. {
  1477. state = CAN2->TSR & (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1);
  1478. CAN2->TSR |= CAN_TSR_RQCP1;
  1479. if (state == (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1))
  1480. {
  1481. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_DONE | 1 << 8);
  1482. }
  1483. else
  1484. {
  1485. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  1486. }
  1487. }
  1488. if (CAN2->TSR & (CAN_TSR_RQCP2))
  1489. {
  1490. state = CAN2->TSR & (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2);
  1491. CAN2->TSR |= CAN_TSR_RQCP2;
  1492. if (state == (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2))
  1493. {
  1494. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_DONE | 2 << 8);
  1495. }
  1496. else
  1497. {
  1498. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  1499. }
  1500. }
  1501. }
  1502. void CAN2_SCE_IRQHandler(void)
  1503. {
  1504. rt_uint32_t errtype;
  1505. errtype = CAN2->ESR;
  1506. if (errtype & 0x70 && bxcan2.status.lasterrtype == (errtype & 0x70))
  1507. {
  1508. switch ((errtype & 0x70) >> 4)
  1509. {
  1510. case RT_CAN_BUS_BIT_PAD_ERR:
  1511. bxcan2.status.bitpaderrcnt++;
  1512. break;
  1513. case RT_CAN_BUS_FORMAT_ERR:
  1514. bxcan2.status.formaterrcnt++;
  1515. break;
  1516. case RT_CAN_BUS_ACK_ERR:
  1517. bxcan2.status.ackerrcnt++;
  1518. break;
  1519. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  1520. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  1521. bxcan2.status.biterrcnt++;
  1522. break;
  1523. case RT_CAN_BUS_CRC_ERR:
  1524. bxcan2.status.crcerrcnt++;
  1525. break;
  1526. }
  1527. bxcan2.status.lasterrtype = errtype & 0x70;
  1528. CAN2->ESR &= ~0x70;
  1529. }
  1530. bxcan2.status.rcverrcnt = errtype >> 24;
  1531. bxcan2.status.snderrcnt = (errtype >> 16 & 0xFF);
  1532. bxcan2.status.errcode = errtype & 0x07;
  1533. CAN2->MSR |= CAN_MSR_ERRI;
  1534. }
  1535. #endif /*USING_BXCAN2*/
  1536. int stm32_bxcan_init(void)
  1537. {
  1538. #ifdef USING_BXCAN1
  1539. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
  1540. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);
  1541. CAN_DeInit(CAN1);
  1542. bxcan1.config.baud_rate = CAN1MBaud;
  1543. bxcan1.config.msgboxsz = 16;
  1544. bxcan1.config.sndboxnumber = 3;
  1545. bxcan1.config.mode = RT_CAN_MODE_NORMAL;
  1546. bxcan1.config.privmode = 0;
  1547. bxcan1.config.ticks = 50;
  1548. #ifdef RT_CAN_USING_HDR
  1549. bxcan1.config.maxhdr = BX_CAN2_FMRSTART * 4;
  1550. #endif
  1551. rt_hw_can_register(&bxcan1, "bxcan1", &canops, &bxcan1data);
  1552. #endif
  1553. #ifdef USING_BXCAN2
  1554. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
  1555. #ifndef USING_BXCAN1
  1556. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);
  1557. #endif
  1558. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
  1559. CAN_DeInit(CAN2);
  1560. bxcan2.config.baud_rate = CAN1MBaud;
  1561. bxcan2.config.msgboxsz = 16;
  1562. bxcan2.config.sndboxnumber = 3;
  1563. bxcan2.config.mode = RT_CAN_MODE_NORMAL;
  1564. bxcan2.config.privmode = 0;
  1565. bxcan2.config.ticks = 50;
  1566. #ifdef RT_CAN_USING_HDR
  1567. bxcan2.config.maxhdr = (BX_CAN_FMRNUMBER - BX_CAN2_FMRSTART) * 4;
  1568. #endif
  1569. rt_hw_can_register(&bxcan2, "bxcan2", &canops, &bxcan2data);
  1570. #endif
  1571. return RT_EOK;
  1572. }
  1573. INIT_BOARD_EXPORT(stm32_bxcan_init);
  1574. #endif /*RT_USING_CAN*/