bxcan.c 51 KB

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