最近工作有点忙,板卡的学习和测试稍有延迟。这次主要来测试该板卡的FDCAN功能。从datasheet上可以看到H503是有一个FDCAN接口的。这个总线通信接口当前用的比较多,所以需要好好学习和测试。现在FDCAN支持8Mbps,以前采购的芯片最高支持到5Mbps。 又把原来测试IC的部分翻出来,按照Power和Rx,Tx将MCU板卡和通讯部分进行连接,如图1所示:, \- B1 c3 H; _
& l9 P; L3 Q/ Z图11 P |: O% a% l! o @
主要用到PB12--CANRx,和PB13--CANTx两个FDCAN1接口,从板图上可以看到接口位置,如图2所示:
% }7 \" Q3 L/ R$ T
1 t4 c; d6 i' ^图2
, k+ {9 { [# x; P$ S. n6 q v7 C I [1 V( o
好了,言归正传。下载的官方资料里并没有这部分的例程,所以测试思路基本还是先用Cubemx生成基本配置,其他接收滤波配置和发送配置再自己添加。H503是支持250MHz主频的。所以FDCAN的时钟也配置位250MHz,如图3所示:
! l. a3 l4 C/ Z. ?! e
0 J1 z9 `2 {$ Y% Z3 p9 Q图3
5 m+ {* F" `! G! ]* A
: F @8 S# A& x# ` FDCAN部分采用正常波特率位1Mbps,数据波特率位2Mbps。其基本配置如图4所示:8 b6 x! ?) N u9 f( H
7 `- ]1 V9 w& x" Y. [5 @1 x图4
0 k5 J0 m& T: L. h l% F o2 b 正常生成代码后,添加接收部分设置和发送部分设置,参考代码如下所示:
: h# o. z( J& f" a- FDCAN_FilterTypeDef sFilterConfig;4 R2 p) `+ Z, L0 Z u/ Y) D& X
- 1 \& f, X; q8 b: v! c
- /* Configure Rx filter */* n8 V- t4 X8 _2 U6 j, U' Q8 C! Z0 A
- sFilterConfig.IdType = FDCAN_STANDARD_ID;& @8 b% y! k2 _0 ?1 _2 A7 h: V
- sFilterConfig.FilterIndex = 0;1 D" F1 z' f2 J8 h* F; _' o
- sFilterConfig.FilterType = FDCAN_FILTER_MASK;
2 X# h; Y* W8 Q# ^ P - sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
3 M: z- W& d$ m) u" F+ M - sFilterConfig.FilterID1 = 0x123;//receive ID
4 C, |. D& s: p# K$ R - sFilterConfig.FilterID2 = 0x7FF;& v- ~5 H4 ~* D8 B
- if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)" o+ D4 s+ j/ z' ~4 ~: Y0 M* K
- {
: u1 L0 z/ R4 q V5 z - Error_Handler();! {2 J y& x. D. g6 W" [* H
- }* p- a6 h7 D3 y4 V
- 9 g4 b) A+ w( B7 M: @) d5 I# _. i& g
- /* Configure global filter:8 C9 H U% ~5 ?6 u
- Filter all remote frames with STD and EXT ID
. B8 c% r+ Q5 w/ x! o* t - Reject non matching frames with STD ID and EXT ID */
, r/ i3 F+ p& H1 I! y - if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
^3 N6 H& a: }$ N0 S3 \$ V" q - {+ a/ {" T" ]3 J4 G9 G4 a
- Error_Handler();
. Z5 s+ F# q+ i" l, o - }
) u2 k) K5 Q0 u- o3 g5 {& N
) L; z, B) E* \! A3 q- K. v1 A- /* Start the FDCAN module *// A0 e2 b$ T; u ?
- if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)( n( M& h# u6 N4 |
- {
' p' h b) [0 J3 a) P - Error_Handler();' A9 Z7 v" u# B5 O. w `% {( C' k1 m2 S
- }
! E# b5 T9 s1 a' s N - 0 b6 Y" W% f! w3 ^# a
- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
, ]; S9 m$ |/ @7 u( P! ^. H. m% T - {9 W& C* m! e- f3 k4 {' Y
- Error_Handler();
$ n$ y- i" ^! K J& r# j - }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK) t* ]& n$ D$ S3 T' W" Z5 z& }6 ^
- {: |& f( G0 j; U* t5 n
- /* Transmission request Error */9 R1 ?& I, z" k: ]6 f
- Error_Handler();
8 [# n; X% u9 M; R) o2 e - }
+ V) ]0 i* O4 ]0 Y! [, X5 P+ ] - HAL_Delay(1000);
复制代码 I5 @4 j5 D' a3 O. _6 q
# [$ Z5 o3 X( J s* y6 q8 c, a* b
- ~( X4 |/ q8 ?& M+ D* j 上位机测试软件正常接收,如图5所示:& ^. U0 A: _# q8 A2 q6 k6 \
. j! s2 |0 d* N7 w图59 Y& P6 r. `2 A3 g
但是接收中断没有执行,故接收callback函数也没有执行到。暂时还没找到事故原因,配置应该都是正常的。找到原因后,再补充这部分。, m, ^% Y0 C6 e2 o2 @
|
学习一下