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