bxcan.c 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659
  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. #if (defined (STM32F10X_LD_VL)) || (defined (STM32F10X_MD_VL)) || (defined (STM32F10X_HD_VL))
  19. #undef RT_USING_CAN
  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. #if (defined (STM32F10X_LD)) || (defined (STM32F10X_MD)) || (defined (STM32F10X_HD)) || (defined (STM32F10X_XL))
  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. rt_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. rt_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. rt_uint32_t ID[2];
  823. rt_uint32_t shift;
  824. rt_uint32_t thisid;
  825. rt_uint32_t thismask;
  826. CAN_FilterInitTypeDef CAN_FilterInitStructure;
  827. CAN_FilterRegister_TypeDef *pfilterreg;
  828. fcase = (pitem->mode | (pitem->ide << 1));
  829. hdr = bxcanfindfilter(pbxcan, pitem, fcase, &fbase, &foff);
  830. if (hdr < 0)
  831. {
  832. if (!actived)
  833. {
  834. return RT_EOK;
  835. }
  836. else if (pitem->hdr == -1)
  837. {
  838. res = bxcanallocnewfilter(pbxcan, actived, fcase, &hdr, &fbase, &foff);
  839. if (res != RT_EOK)
  840. {
  841. return res;
  842. }
  843. }
  844. else if (pitem->hdr >= 0)
  845. {
  846. rt_enter_critical();
  847. res = bxcancalcbaseoff(pbxcan, pitem->hdr, &fbase, &foff);
  848. if (res != RT_EOK)
  849. {
  850. return res;
  851. }
  852. hdr = pitem->hdr;
  853. if (actived)
  854. {
  855. pbxcan->alocmask[hdr >> 5] |= 0x01 << (hdr % 0x1F);
  856. }
  857. rt_exit_critical();
  858. }
  859. }
  860. else
  861. {
  862. if (!actived)
  863. {
  864. pitem->hdr = hdr;
  865. }
  866. else if (hdr >= 0 && (pitem->hdr >= 0 || pitem->hdr == -1))
  867. {
  868. pitem->hdr = hdr;
  869. return RT_EBUSY;
  870. }
  871. }
  872. pitem->hdr = hdr;
  873. pfilterreg = &((CAN_FilterRegister_TypeDef *)pbxcan->mfrbase)[fbase];
  874. ID[0] = pfilterreg->FR1;
  875. ID[1] = pfilterreg->FR2;
  876. CAN_FilterInitStructure.CAN_FilterNumber = (pfilterreg - &CAN1->sFilterRegister[0]);
  877. if (pitem->mode)
  878. {
  879. CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  880. }
  881. else
  882. {
  883. CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
  884. }
  885. if (pitem->ide)
  886. {
  887. CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  888. }
  889. else
  890. {
  891. CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
  892. }
  893. switch (fcase)
  894. {
  895. case 0x03:
  896. if (actived)
  897. {
  898. shift = 3;
  899. thisid = (rt_uint32_t)pitem->id << shift;
  900. thismask = (rt_uint32_t)pitem->mask << shift;
  901. if (pitem->ide)
  902. {
  903. thisid |= CAN_ID_EXT;
  904. thismask |= CAN_ID_EXT;
  905. }
  906. if (pitem->rtr)
  907. {
  908. thisid |= CAN_RTR_REMOTE;
  909. thismask |= CAN_RTR_REMOTE;
  910. }
  911. ID[0] = thisid;
  912. ID[1] = thismask;
  913. }
  914. else
  915. {
  916. ID[0] = 0xFFFFFFFF;
  917. ID[1] = 0xFFFFFFFF;
  918. }
  919. break;
  920. case 0x02:
  921. if (actived)
  922. {
  923. shift = 3;
  924. thisid = (rt_uint32_t)pitem->id << shift;
  925. if (pitem->ide)
  926. {
  927. thisid |= CAN_ID_EXT;
  928. }
  929. if (pitem->rtr)
  930. {
  931. thisid |= CAN_RTR_REMOTE;
  932. }
  933. ID[foff] = thisid;
  934. }
  935. else
  936. {
  937. ID[foff] = 0xFFFFFFFF;
  938. }
  939. break;
  940. case 0x01:
  941. if (actived)
  942. {
  943. shift = 5;
  944. thisid = pitem->id << shift;
  945. if (pitem->rtr)
  946. {
  947. thisid |= CAN_RTR_REMOTE << (shift - 2);
  948. }
  949. thismask = pitem->mask << shift;
  950. if (pitem->rtr)
  951. {
  952. thismask |= CAN_RTR_REMOTE << (shift - 2);
  953. }
  954. ID[foff] = (thisid & 0x0000FFFF) | ((thismask & 0x0000FFFF) << 16);
  955. }
  956. else
  957. {
  958. ID[foff] = 0xFFFFFFFF;
  959. }
  960. break;
  961. case 0x00:
  962. if (actived)
  963. {
  964. shift = 5;
  965. thisid = pitem->id << shift;
  966. if (pitem->rtr)
  967. {
  968. thisid |= CAN_RTR_REMOTE << (shift - 2);
  969. }
  970. ((rt_uint16_t *) ID)[foff] = thisid;
  971. }
  972. else
  973. {
  974. ((rt_uint16_t *) ID)[foff] = 0xFFFF;
  975. }
  976. break;
  977. }
  978. if(pitem->ide)
  979. {
  980. CAN_FilterInitStructure.CAN_FilterIdHigh = (ID[0] & 0xFFFF0000) >> 16;
  981. CAN_FilterInitStructure.CAN_FilterIdLow = ID[0] & 0x0000FFFF;
  982. CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (ID[1] & 0xFFFF0000) >> 16;
  983. CAN_FilterInitStructure.CAN_FilterMaskIdLow = ((ID[1]) & 0x0000FFFF);
  984. }
  985. else
  986. {
  987. CAN_FilterInitStructure.CAN_FilterIdHigh = ((ID[1]) & 0x0000FFFF);
  988. CAN_FilterInitStructure.CAN_FilterIdLow = ID[0] & 0x0000FFFF;
  989. CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (ID[1] & 0xFFFF0000) >> 16;
  990. CAN_FilterInitStructure.CAN_FilterMaskIdLow = (ID[0] & 0xFFFF0000) >> 16;
  991. }
  992. if (fbase >= pbxcan->fifo1filteroff)
  993. {
  994. CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 1;
  995. }
  996. else
  997. {
  998. CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
  999. }
  1000. if (ID[0] != 0xFFFFFFFF || ID[1] != 0xFFFFFFFF)
  1001. {
  1002. CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  1003. }
  1004. else
  1005. {
  1006. CAN_FilterInitStructure.CAN_FilterActivation = DISABLE;
  1007. }
  1008. if (!actived)
  1009. {
  1010. rt_enter_critical();
  1011. pbxcan->alocmask[hdr >> 5] &= ~(0x01 << (hdr % 0x1F));
  1012. rt_exit_critical();
  1013. }
  1014. CAN_FilterInit(&CAN_FilterInitStructure);
  1015. return RT_EOK;
  1016. }
  1017. static rt_err_t setfilter(struct stm_bxcan *pbxcan, struct rt_can_filter_config *pconfig)
  1018. {
  1019. struct rt_can_filter_item *pitem = pconfig->items;
  1020. rt_uint32_t count = pconfig->count;
  1021. rt_err_t res;
  1022. while (count)
  1023. {
  1024. res = bxmodifyfilter(pbxcan, pitem, pconfig->actived);
  1025. if (res != RT_EOK)
  1026. {
  1027. return res;
  1028. }
  1029. pitem++;
  1030. count--;
  1031. }
  1032. return RT_EOK;
  1033. }
  1034. static rt_err_t configure(struct rt_can_device *can, struct can_configure *cfg)
  1035. {
  1036. CAN_TypeDef *pbxcan;
  1037. pbxcan = ((struct stm_bxcan *) can->parent.user_data)->reg;
  1038. assert_param(IS_CAN_ALL_PERIPH(pbxcan));
  1039. if (pbxcan == CAN1)
  1040. {
  1041. bxcan1_hw_init();
  1042. bxcan_init(pbxcan, cfg->baud_rate, can->config.mode);
  1043. bxcan1_filter_init(can);
  1044. }
  1045. else
  1046. {
  1047. #ifdef USING_BXCAN2
  1048. bxcan2_hw_init();
  1049. bxcan_init(pbxcan, cfg->baud_rate, can->config.mode);
  1050. bxcan2_filter_init(can);
  1051. #endif
  1052. }
  1053. return RT_EOK;
  1054. }
  1055. static rt_err_t control(struct rt_can_device *can, int cmd, void *arg)
  1056. {
  1057. struct stm_bxcan *pbxcan;
  1058. rt_uint32_t argval;
  1059. NVIC_InitTypeDef NVIC_InitStructure;
  1060. pbxcan = (struct stm_bxcan *) can->parent.user_data;
  1061. assert_param(pbxcan != RT_NULL);
  1062. switch (cmd)
  1063. {
  1064. case RT_DEVICE_CTRL_CLR_INT:
  1065. argval = (rt_uint32_t) arg;
  1066. if (argval == RT_DEVICE_FLAG_INT_RX)
  1067. {
  1068. NVIC_DisableIRQ(pbxcan->rcvirq0);
  1069. NVIC_DisableIRQ(pbxcan->rcvirq1);
  1070. CAN_ITConfig(pbxcan->reg, CAN_IT_FMP0 , DISABLE);
  1071. CAN_ITConfig(pbxcan->reg, CAN_IT_FF0 , DISABLE);
  1072. CAN_ITConfig(pbxcan->reg, CAN_IT_FOV0 , DISABLE);
  1073. CAN_ITConfig(pbxcan->reg, CAN_IT_FMP1 , DISABLE);
  1074. CAN_ITConfig(pbxcan->reg, CAN_IT_FF1 , DISABLE);
  1075. CAN_ITConfig(pbxcan->reg, CAN_IT_FOV1 , DISABLE);
  1076. }
  1077. else if (argval == RT_DEVICE_FLAG_INT_TX)
  1078. {
  1079. NVIC_DisableIRQ(pbxcan->sndirq);
  1080. CAN_ITConfig(pbxcan->reg, CAN_IT_TME, DISABLE);
  1081. }
  1082. else if (argval == RT_DEVICE_CAN_INT_ERR)
  1083. {
  1084. CAN_ITConfig(pbxcan->reg, CAN_IT_BOF , DISABLE);
  1085. CAN_ITConfig(pbxcan->reg, CAN_IT_LEC , DISABLE);
  1086. CAN_ITConfig(pbxcan->reg, CAN_IT_ERR , DISABLE);
  1087. NVIC_DisableIRQ(pbxcan->errirq);
  1088. }
  1089. break;
  1090. case RT_DEVICE_CTRL_SET_INT:
  1091. argval = (rt_uint32_t) arg;
  1092. if (argval == RT_DEVICE_FLAG_INT_RX)
  1093. {
  1094. CAN_ITConfig(pbxcan->reg, CAN_IT_FMP0 , ENABLE);
  1095. CAN_ITConfig(pbxcan->reg, CAN_IT_FF0 , ENABLE);
  1096. CAN_ITConfig(pbxcan->reg, CAN_IT_FOV0 , ENABLE);
  1097. CAN_ITConfig(pbxcan->reg, CAN_IT_FMP1 , ENABLE);
  1098. CAN_ITConfig(pbxcan->reg, CAN_IT_FF1 , ENABLE);
  1099. CAN_ITConfig(pbxcan->reg, CAN_IT_FOV1 , 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->rcvirq0;
  1104. NVIC_Init(&NVIC_InitStructure);
  1105. NVIC_InitStructure.NVIC_IRQChannel = pbxcan->rcvirq1;
  1106. NVIC_Init(&NVIC_InitStructure);
  1107. }
  1108. else if (argval == RT_DEVICE_FLAG_INT_TX)
  1109. {
  1110. CAN_ITConfig(pbxcan->reg, CAN_IT_TME, 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->sndirq;
  1115. NVIC_Init(&NVIC_InitStructure);
  1116. }
  1117. else if (argval == RT_DEVICE_CAN_INT_ERR)
  1118. {
  1119. CAN_ITConfig(pbxcan->reg, CAN_IT_BOF , ENABLE);
  1120. CAN_ITConfig(pbxcan->reg, CAN_IT_LEC , ENABLE);
  1121. CAN_ITConfig(pbxcan->reg, CAN_IT_ERR , ENABLE);
  1122. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  1123. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  1124. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  1125. NVIC_InitStructure.NVIC_IRQChannel = pbxcan->errirq;
  1126. NVIC_Init(&NVIC_InitStructure);
  1127. }
  1128. break;
  1129. case RT_CAN_CMD_SET_FILTER:
  1130. return setfilter(pbxcan, (struct rt_can_filter_config *) arg);
  1131. case RT_CAN_CMD_SET_MODE:
  1132. argval = (rt_uint32_t) arg;
  1133. if (argval != RT_CAN_MODE_NORMAL ||
  1134. argval != RT_CAN_MODE_LISEN ||
  1135. argval != RT_CAN_MODE_LOOPBACK ||
  1136. argval != RT_CAN_MODE_LOOPBACKANLISEN)
  1137. {
  1138. return RT_ERROR;
  1139. }
  1140. if (argval != can->config.mode)
  1141. {
  1142. can->config.mode = argval;
  1143. return bxcan_set_mode(pbxcan->reg, argval);
  1144. }
  1145. break;
  1146. case RT_CAN_CMD_SET_BAUD:
  1147. argval = (rt_uint32_t) arg;
  1148. if (argval != CAN1MBaud &&
  1149. argval != CAN800kBaud &&
  1150. argval != CAN500kBaud &&
  1151. argval != CAN250kBaud &&
  1152. argval != CAN125kBaud &&
  1153. argval != CAN100kBaud &&
  1154. argval != CAN50kBaud &&
  1155. argval != CAN20kBaud &&
  1156. argval != CAN10kBaud)
  1157. {
  1158. return RT_ERROR;
  1159. }
  1160. if (argval != can->config.baud_rate)
  1161. {
  1162. can->config.baud_rate = argval;
  1163. return bxcan_set_baud_rate(pbxcan->reg, argval);
  1164. }
  1165. break;
  1166. case RT_CAN_CMD_SET_PRIV:
  1167. argval = (rt_uint32_t) arg;
  1168. if (argval != RT_CAN_MODE_PRIV ||
  1169. argval != RT_CAN_MODE_NOPRIV)
  1170. {
  1171. return RT_ERROR;
  1172. }
  1173. if (argval != can->config.privmode)
  1174. {
  1175. can->config.privmode = argval;
  1176. return bxcan_set_privmode(pbxcan->reg, argval);
  1177. }
  1178. break;
  1179. case RT_CAN_CMD_GET_STATUS:
  1180. {
  1181. rt_uint32_t errtype;
  1182. errtype = pbxcan->reg->ESR;
  1183. can->status.rcverrcnt = errtype >> 24;
  1184. can->status.snderrcnt = (errtype >> 16 & 0xFF);
  1185. can->status.errcode = errtype & 0x07;
  1186. if (arg != &can->status)
  1187. {
  1188. rt_memcpy(arg, &can->status, sizeof(can->status));
  1189. }
  1190. }
  1191. break;
  1192. }
  1193. return RT_EOK;
  1194. }
  1195. static int sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno)
  1196. {
  1197. CAN_TypeDef *pbxcan;
  1198. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  1199. pbxcan = ((struct stm_bxcan *) can->parent.user_data)->reg;
  1200. assert_param(IS_CAN_ALL_PERIPH(pbxcan));
  1201. pbxcan->sTxMailBox[boxno].TIR &= TMIDxR_TXRQ;
  1202. if (pmsg->ide == RT_CAN_STDID)
  1203. {
  1204. assert_param(IS_CAN_STDID(pmsg->id));
  1205. pbxcan->sTxMailBox[boxno].TIR |= ((pmsg->id << 21) | \
  1206. (pmsg->rtr << 1));
  1207. }
  1208. else
  1209. {
  1210. assert_param(IS_CAN_EXTID(pmsg->id));
  1211. pbxcan->sTxMailBox[boxno].TIR |= ((pmsg->id << 3) | \
  1212. (pmsg->ide << 2) | \
  1213. (pmsg->rtr << 1));
  1214. }
  1215. pmsg->len &= (uint8_t)0x0000000F;
  1216. pbxcan->sTxMailBox[boxno].TDTR &= (uint32_t)0xFFFFFFF0;
  1217. pbxcan->sTxMailBox[boxno].TDTR |= pmsg->len;
  1218. pbxcan->sTxMailBox[boxno].TDLR = (((uint32_t)pmsg->data[3] << 24) |
  1219. ((uint32_t)pmsg->data[2] << 16) |
  1220. ((uint32_t)pmsg->data[1] << 8) |
  1221. ((uint32_t)pmsg->data[0]));
  1222. if (pmsg->len > 4)
  1223. {
  1224. pbxcan->sTxMailBox[boxno].TDHR = (((uint32_t)pmsg->data[7] << 24) |
  1225. ((uint32_t)pmsg->data[6] << 16) |
  1226. ((uint32_t)pmsg->data[5] << 8) |
  1227. ((uint32_t)pmsg->data[4]));
  1228. }
  1229. pbxcan->sTxMailBox[boxno].TIR |= TMIDxR_TXRQ;
  1230. return RT_EOK;
  1231. }
  1232. static int recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno)
  1233. {
  1234. CAN_TypeDef *pbxcan;
  1235. struct rt_can_msg *pmsg = (struct rt_can_msg *) buf;
  1236. pbxcan = ((struct stm_bxcan *) can->parent.user_data)->reg;
  1237. assert_param(IS_CAN_ALL_PERIPH(pbxcan));
  1238. assert_param(IS_CAN_FIFO(boxno));
  1239. pmsg->ide = ((uint8_t)0x04 & pbxcan->sFIFOMailBox[boxno].RIR) >> 2;
  1240. if (pmsg->ide == CAN_Id_Standard)
  1241. {
  1242. pmsg->id = (uint32_t)0x000007FF & (pbxcan->sFIFOMailBox[boxno].RIR >> 21);
  1243. }
  1244. else
  1245. {
  1246. pmsg->id = (uint32_t)0x1FFFFFFF & (pbxcan->sFIFOMailBox[boxno].RIR >> 3);
  1247. }
  1248. pmsg->rtr = (uint8_t)((0x02 & pbxcan->sFIFOMailBox[boxno].RIR) >> 1);
  1249. pmsg->len = (uint8_t)0x0F & pbxcan->sFIFOMailBox[boxno].RDTR;
  1250. pmsg->data[0] = (uint8_t)0xFF & pbxcan->sFIFOMailBox[boxno].RDLR;
  1251. pmsg->data[1] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDLR >> 8);
  1252. pmsg->data[2] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDLR >> 16);
  1253. pmsg->data[3] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDLR >> 24);
  1254. if (pmsg->len > 4)
  1255. {
  1256. pmsg->data[4] = (uint8_t)0xFF & pbxcan->sFIFOMailBox[boxno].RDHR;
  1257. pmsg->data[5] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDHR >> 8);
  1258. pmsg->data[6] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDHR >> 16);
  1259. pmsg->data[7] = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDHR >> 24);
  1260. }
  1261. pmsg->hdr = (uint8_t)0xFF & (pbxcan->sFIFOMailBox[boxno].RDTR >> 8);
  1262. if (boxno) pmsg->hdr += ((struct stm_bxcan *) can->parent.user_data)->fifo1filteroff * 4;
  1263. return RT_EOK;
  1264. }
  1265. static const struct rt_can_ops canops =
  1266. {
  1267. configure,
  1268. control,
  1269. sendmsg,
  1270. recvmsg,
  1271. };
  1272. #ifdef USING_BXCAN1
  1273. static struct stm_bxcan bxcan1data =
  1274. {
  1275. CAN1,
  1276. (void *) &CAN1->sFilterRegister[0],
  1277. CAN1_TX_IRQn,
  1278. CAN1_RX0_IRQn,
  1279. CAN1_RX1_IRQn,
  1280. CAN1_SCE_IRQn,
  1281. {
  1282. 0,
  1283. },
  1284. {0, 0},
  1285. BX_CAN2_FMRSTART,
  1286. 7,
  1287. {
  1288. {
  1289. 0,
  1290. 0,
  1291. 2,
  1292. 24,
  1293. },
  1294. {
  1295. 0,
  1296. 0,
  1297. 2,
  1298. 24,
  1299. },
  1300. },
  1301. };
  1302. struct rt_can_device bxcan1;
  1303. void CAN1_RX0_IRQHandler(void)
  1304. {
  1305. rt_interrupt_enter();
  1306. if (CAN1->RF0R & 0x03)
  1307. {
  1308. if ((CAN1->RF0R & CAN_RF0R_FOVR0) != 0)
  1309. {
  1310. CAN1->RF0R = CAN_RF0R_FOVR0;
  1311. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_RXOF_IND | 0 << 8);
  1312. }
  1313. else
  1314. {
  1315. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_RX_IND | 0 << 8);
  1316. }
  1317. CAN1->RF0R |= CAN_RF0R_RFOM0;
  1318. }
  1319. rt_interrupt_leave();
  1320. }
  1321. void CAN1_RX1_IRQHandler(void)
  1322. {
  1323. rt_interrupt_enter();
  1324. if (CAN1->RF1R & 0x03)
  1325. {
  1326. if ((CAN1->RF1R & CAN_RF1R_FOVR1) != 0)
  1327. {
  1328. CAN1->RF1R = CAN_RF1R_FOVR1;
  1329. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_RXOF_IND | 1 << 8);
  1330. }
  1331. else
  1332. {
  1333. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_RX_IND | 1 << 8);
  1334. }
  1335. CAN1->RF1R |= CAN_RF1R_RFOM1;
  1336. }
  1337. rt_interrupt_leave();
  1338. }
  1339. void CAN1_TX_IRQHandler(void)
  1340. {
  1341. rt_uint32_t state;
  1342. rt_interrupt_enter();
  1343. if (CAN1->TSR & (CAN_TSR_RQCP0))
  1344. {
  1345. state = CAN1->TSR & (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0);
  1346. CAN1->TSR |= CAN_TSR_RQCP0;
  1347. if (state == (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0))
  1348. {
  1349. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_DONE | 0 << 8);
  1350. }
  1351. else
  1352. {
  1353. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  1354. }
  1355. }
  1356. if (CAN1->TSR & (CAN_TSR_RQCP1))
  1357. {
  1358. state = CAN1->TSR & (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1);
  1359. CAN1->TSR |= CAN_TSR_RQCP1;
  1360. if (state == (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1))
  1361. {
  1362. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_DONE | 1 << 8);
  1363. }
  1364. else
  1365. {
  1366. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  1367. }
  1368. }
  1369. if (CAN1->TSR & (CAN_TSR_RQCP2))
  1370. {
  1371. state = CAN1->TSR & (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2);
  1372. CAN1->TSR |= CAN_TSR_RQCP2;
  1373. if (state == (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2))
  1374. {
  1375. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_DONE | 2 << 8);
  1376. }
  1377. else
  1378. {
  1379. rt_hw_can_isr(&bxcan1, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  1380. }
  1381. }
  1382. rt_interrupt_leave();
  1383. }
  1384. void CAN1_SCE_IRQHandler(void)
  1385. {
  1386. rt_uint32_t errtype;
  1387. errtype = CAN1->ESR;
  1388. rt_interrupt_enter();
  1389. if (errtype & 0x70 && bxcan1.status.lasterrtype == (errtype & 0x70))
  1390. {
  1391. switch ((errtype & 0x70) >> 4)
  1392. {
  1393. case RT_CAN_BUS_BIT_PAD_ERR:
  1394. bxcan1.status.bitpaderrcnt++;
  1395. break;
  1396. case RT_CAN_BUS_FORMAT_ERR:
  1397. bxcan1.status.formaterrcnt++;
  1398. break;
  1399. case RT_CAN_BUS_ACK_ERR:
  1400. bxcan1.status.ackerrcnt++;
  1401. break;
  1402. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  1403. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  1404. bxcan1.status.biterrcnt++;
  1405. break;
  1406. case RT_CAN_BUS_CRC_ERR:
  1407. bxcan1.status.crcerrcnt++;
  1408. break;
  1409. }
  1410. bxcan1.status.lasterrtype = errtype & 0x70;
  1411. CAN1->ESR &= ~0x70;
  1412. }
  1413. bxcan1.status.rcverrcnt = errtype >> 24;
  1414. bxcan1.status.snderrcnt = (errtype >> 16 & 0xFF);
  1415. bxcan1.status.errcode = errtype & 0x07;
  1416. CAN1->MSR |= CAN_MSR_ERRI;
  1417. rt_interrupt_leave();
  1418. }
  1419. #endif /*USING_BXCAN1*/
  1420. #ifdef USING_BXCAN2
  1421. static struct stm_bxcan bxcan2data =
  1422. {
  1423. CAN2,
  1424. (void *) &CAN1->sFilterRegister[BX_CAN2_FMRSTART],
  1425. CAN2_TX_IRQn,
  1426. CAN2_RX0_IRQn,
  1427. CAN2_RX1_IRQn,
  1428. CAN2_SCE_IRQn,
  1429. {
  1430. 0,
  1431. }
  1432. {0, 0},
  1433. BX_CAN_FMRNUMBER - BX_CAN2_FMRSTART,
  1434. 7,
  1435. {
  1436. {
  1437. 0,
  1438. 0,
  1439. 2,
  1440. 24,
  1441. },
  1442. {
  1443. 0,
  1444. 0,
  1445. 2,
  1446. 24,
  1447. },
  1448. },
  1449. };
  1450. struct rt_can_device bxcan2;
  1451. void CAN2_RX0_IRQHandler(void)
  1452. {
  1453. rt_interrupt_enter();
  1454. if (CAN2->RF0R & 0x03)
  1455. {
  1456. if ((CAN2->RF0R & CAN_RF0R_FOVR0) != 0)
  1457. {
  1458. CAN2->RF0R = CAN_RF0R_FOVR0;
  1459. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_RXOF_IND | 0 << 8);
  1460. }
  1461. else
  1462. {
  1463. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_RX_IND | 0 << 8);
  1464. }
  1465. CAN2->RF0R |= CAN_RF0R_RFOM0;
  1466. }
  1467. rt_interrupt_leave();
  1468. }
  1469. void CAN2_RX1_IRQHandler(void)
  1470. {
  1471. rt_interrupt_enter();
  1472. if (CAN2->RF1R & 0x03)
  1473. {
  1474. if ((CAN2->RF1R & CAN_RF1R_FOVR1) != 0)
  1475. {
  1476. CAN2->RF1R = CAN_RF1R_FOVR1;
  1477. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_RXOF_IND | 1 << 8);
  1478. }
  1479. else
  1480. {
  1481. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_RX_IND | 1 << 8);
  1482. }
  1483. CAN2->RF1R |= CAN_RF1R_RFOM1;
  1484. }
  1485. rt_interrupt_leave();
  1486. }
  1487. void CAN2_TX_IRQHandler(void)
  1488. {
  1489. rt_uint32_t state;
  1490. rt_interrupt_enter();
  1491. if (CAN2->TSR & (CAN_TSR_RQCP0))
  1492. {
  1493. state = CAN2->TSR & (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0);
  1494. CAN2->TSR |= CAN_TSR_RQCP0;
  1495. if (state == (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0))
  1496. {
  1497. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_DONE | 0 << 8);
  1498. }
  1499. else
  1500. {
  1501. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_FAIL | 0 << 8);
  1502. }
  1503. }
  1504. if (CAN2->TSR & (CAN_TSR_RQCP1))
  1505. {
  1506. state = CAN2->TSR & (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1);
  1507. CAN2->TSR |= CAN_TSR_RQCP1;
  1508. if (state == (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1))
  1509. {
  1510. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_DONE | 1 << 8);
  1511. }
  1512. else
  1513. {
  1514. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_FAIL | 1 << 8);
  1515. }
  1516. }
  1517. if (CAN2->TSR & (CAN_TSR_RQCP2))
  1518. {
  1519. state = CAN2->TSR & (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2);
  1520. CAN2->TSR |= CAN_TSR_RQCP2;
  1521. if (state == (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2))
  1522. {
  1523. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_DONE | 2 << 8);
  1524. }
  1525. else
  1526. {
  1527. rt_hw_can_isr(&bxcan2, RT_CAN_EVENT_TX_FAIL | 2 << 8);
  1528. }
  1529. }
  1530. rt_interrupt_leave();
  1531. }
  1532. void CAN2_SCE_IRQHandler(void)
  1533. {
  1534. rt_uint32_t errtype;
  1535. errtype = CAN2->ESR;
  1536. rt_interrupt_enter();
  1537. if (errtype & 0x70 && bxcan2.status.lasterrtype == (errtype & 0x70))
  1538. {
  1539. switch ((errtype & 0x70) >> 4)
  1540. {
  1541. case RT_CAN_BUS_BIT_PAD_ERR:
  1542. bxcan2.status.bitpaderrcnt++;
  1543. break;
  1544. case RT_CAN_BUS_FORMAT_ERR:
  1545. bxcan2.status.formaterrcnt++;
  1546. break;
  1547. case RT_CAN_BUS_ACK_ERR:
  1548. bxcan2.status.ackerrcnt++;
  1549. break;
  1550. case RT_CAN_BUS_IMPLICIT_BIT_ERR:
  1551. case RT_CAN_BUS_EXPLICIT_BIT_ERR:
  1552. bxcan2.status.biterrcnt++;
  1553. break;
  1554. case RT_CAN_BUS_CRC_ERR:
  1555. bxcan2.status.crcerrcnt++;
  1556. break;
  1557. }
  1558. bxcan2.status.lasterrtype = errtype & 0x70;
  1559. CAN2->ESR &= ~0x70;
  1560. }
  1561. bxcan2.status.rcverrcnt = errtype >> 24;
  1562. bxcan2.status.snderrcnt = (errtype >> 16 & 0xFF);
  1563. bxcan2.status.errcode = errtype & 0x07;
  1564. CAN2->MSR |= CAN_MSR_ERRI;
  1565. rt_interrupt_leave();
  1566. }
  1567. #endif /*USING_BXCAN2*/
  1568. int stm32_bxcan_init(void)
  1569. {
  1570. #ifdef USING_BXCAN1
  1571. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
  1572. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);
  1573. CAN_DeInit(CAN1);
  1574. bxcan1.config.baud_rate = CAN1MBaud;
  1575. bxcan1.config.msgboxsz = 16;
  1576. bxcan1.config.sndboxnumber = 3;
  1577. bxcan1.config.mode = RT_CAN_MODE_NORMAL;
  1578. bxcan1.config.privmode = 0;
  1579. bxcan1.config.ticks = 50;
  1580. #ifdef RT_CAN_USING_HDR
  1581. bxcan1.config.maxhdr = BX_CAN2_FMRSTART * 4;
  1582. #endif
  1583. rt_hw_can_register(&bxcan1, "bxcan1", &canops, &bxcan1data);
  1584. #endif
  1585. #ifdef USING_BXCAN2
  1586. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
  1587. #ifndef USING_BXCAN1
  1588. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);
  1589. #endif
  1590. RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
  1591. CAN_DeInit(CAN2);
  1592. bxcan2.config.baud_rate = CAN1MBaud;
  1593. bxcan2.config.msgboxsz = 16;
  1594. bxcan2.config.sndboxnumber = 3;
  1595. bxcan2.config.mode = RT_CAN_MODE_NORMAL;
  1596. bxcan2.config.privmode = 0;
  1597. bxcan2.config.ticks = 50;
  1598. #ifdef RT_CAN_USING_HDR
  1599. bxcan2.config.maxhdr = (BX_CAN_FMRNUMBER - BX_CAN2_FMRSTART) * 4;
  1600. #endif
  1601. rt_hw_can_register(&bxcan2, "bxcan2", &canops, &bxcan2data);
  1602. #endif
  1603. return RT_EOK;
  1604. }
  1605. INIT_BOARD_EXPORT(stm32_bxcan_init);
  1606. #endif /*RT_USING_CAN*/