最近工作有点忙,板卡的学习和测试稍有延迟。这次主要来测试该板卡的FDCAN功能。从datasheet上可以看到H503是有一个FDCAN接口的。这个总线通信接口当前用的比较多,所以需要好好学习和测试。现在FDCAN支持8Mbps,以前采购的芯片最高支持到5Mbps。 又把原来测试IC的部分翻出来,按照Power和Rx,Tx将MCU板卡和通讯部分进行连接,如图1所示:7 o" g( {/ i# t' l9 {
* o$ s6 z; T% t% y图1/ ]! S2 b% ]: W( Z5 C0 D
主要用到PB12--CANRx,和PB13--CANTx两个FDCAN1接口,从板图上可以看到接口位置,如图2所示:2 {5 x4 U8 @4 z' a7 A0 Q4 j
; \7 n: C$ k E6 [3 g/ [& |- P图2" P- D7 T8 {7 m- p
' B2 k; D1 |, @% s' W
好了,言归正传。下载的官方资料里并没有这部分的例程,所以测试思路基本还是先用Cubemx生成基本配置,其他接收滤波配置和发送配置再自己添加。H503是支持250MHz主频的。所以FDCAN的时钟也配置位250MHz,如图3所示:8 r2 Z j6 X7 K
9 x' g' L+ T4 b! g& d p图3& W! m! \2 w& V4 a: U
. L! P6 e! v6 _8 N& G+ { FDCAN部分采用正常波特率位1Mbps,数据波特率位2Mbps。其基本配置如图4所示:
# x+ f! ` ?5 @' _2 D# k+ C* x3 ?! L
' D6 j, s: M: [/ J$ A4 U, x图4
# [. V1 W1 R: s' L 正常生成代码后,添加接收部分设置和发送部分设置,参考代码如下所示:
4 x0 {6 c# c6 F0 N/ B, |- FDCAN_FilterTypeDef sFilterConfig;: }2 Z5 I g% G% V
* P0 W6 \3 D% Y4 ] p* n. U9 F- /* Configure Rx filter */7 V5 L. p! k9 O6 p& g$ h2 @3 m
- sFilterConfig.IdType = FDCAN_STANDARD_ID;
6 l: M: E9 e4 ] - sFilterConfig.FilterIndex = 0;0 T( U/ I$ ]/ u' c7 d& C
- sFilterConfig.FilterType = FDCAN_FILTER_MASK;0 @4 d1 \0 K9 ?+ E" S9 a
- sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;0 h, W. x. Z$ l: {# T
- sFilterConfig.FilterID1 = 0x123;//receive ID
U9 I% b& |8 ~3 ]" y7 Z) v# O - sFilterConfig.FilterID2 = 0x7FF;# i6 ?3 ~% `- b c
- if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)8 k/ A% n& _' d8 e
- {$ r1 C3 X5 L/ Q/ I0 F
- Error_Handler();8 c& ^& A) Y/ n( m9 D# H# Z5 \
- }
& f2 J& r: v v% e! [: h' {
; Y- u- `( {4 X0 h9 G# Q/ i) b1 ^1 B- /* Configure global filter:- Y _* k7 g/ |
- Filter all remote frames with STD and EXT ID
2 ] { a4 c) h - Reject non matching frames with STD ID and EXT ID */
6 |, A' S/ g/ v8 |2 U1 Y - if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)) x9 u) m3 k% P9 M9 V
- {
& M4 P5 f q4 M7 q) p/ f h - Error_Handler();; D$ r7 |6 p2 u; Z. A7 ~# }' A
- }
& V4 F/ B+ h, Y. J- q
/ F, U8 i% I9 I. [" o& R- /* Start the FDCAN module */, E: D* y/ M5 e! w
- if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK), z, T& P5 {2 w
- {
* g. l5 P& k3 v3 w, g3 Y! C' H - Error_Handler();# q1 I& _3 S( D) X' L _
- }
: t* b7 P, Z1 \, |& C
! k2 v+ L0 V5 \3 t( u9 W/ C- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)% z! |4 O$ u% U
- {
0 _, Y0 I. J1 W - Error_Handler();
0 H! n- j, Q: J+ n0 j2 u3 O# V5 M/ G$ @) j - }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK), ]/ B! f3 [& e
- {
6 q9 o$ E( I+ t+ u - /* Transmission request Error */
/ }7 Y/ l1 U8 ?1 w- M: X - Error_Handler();
1 R8 |: R+ O1 F# k4 r - }$ u8 C( h: O8 o8 J H I3 _9 S
- HAL_Delay(1000);
复制代码
% h. \5 @3 t2 ?( \3 e! K5 Y( B j
! L, K* k1 i4 O
上位机测试软件正常接收,如图5所示:5 l O+ J, q& |5 k& w3 Q: H) r
" W- |5 Z0 ^& l$ _4 Z/ O1 [" f' u图5. W$ u u* @9 p3 l4 ^
但是接收中断没有执行,故接收callback函数也没有执行到。暂时还没找到事故原因,配置应该都是正常的。找到原因后,再补充这部分。
/ {' \9 q; {( O- ~! L; P* b |
学习一下