收到板卡,已经迫不及待的等待功能测试。板卡上电如图1所示:& I* |% h$ W! k) ~* q
7 D9 ?; ?! @# r3 x& v, Q4 y1 l图1/ C: W3 \: x* b% [5 O/ J. Z. v
$ L1 P& {3 ?0 e; w, w2 q& A
从U3C5的datasheet上可以看出,是支持2路FDCAN的,截图如图2所示:
5 o. o" n6 D5 Y: T" t+ S3 L
4 i' F, N" x; q. i6 S
图2
! }# q3 o( B& y7 o7 T
6 M& z1 s4 z, r) q原理图如图3所示:) ?6 n1 A+ P% `* a$ _! {
, Q, A3 ?1 a# Y8 D" h. G+ [图3. p8 R* V+ D4 o: ~! o4 c( h% J
9 }' S/ j s# P% O
了解了其基本性能后,还是从STM32CubeMx 配置开始,首先配置时钟,如图4所示:: C6 F0 I$ ^5 U/ D2 M
* @$ x2 H8 k& g' ]6 `图4
1 x' B& k" R9 t4 i
5 h6 ?- E: p# j- Q$ V配置FDCAN 引脚,如图5所示:
5 a4 t$ Z, s/ `
c3 q7 f( O5 H% k E- n( l: E图5( J8 c6 \1 u: E0 x- {
3 `1 U6 w; |/ a7 y: L9 D3 V
配置FDCAN的Mode 和 Configuration,先配置为2Mbps,如图6所示:
0 O# T% x6 N1 d! G w
8 N+ I, p; X0 @6 B* N图60 I. B3 e; U' @' i4 X
& e" ^9 j4 l- W* ^, r
MCU最大支持96MHz,从时钟配置上可以清晰看到。FDCAN也是96MHz, 按照FDCAN的配置,配置通信速度为4Mbps,数值可以配置为整数。如果配置为5M,只能配置接近,所以通信速度暂时配置为4Mbps,作为测试速度,如图7:
3 @ q& D! Z# f: ^. \. @# A( H0 {
- G5 j) N' a# B# A0 {图7+ z: ?0 h A- e. }: @" ^0 P8 J
- i, N$ |6 ]2 z* C, a在VS Code中打开项目,需要增加一个FDCAN configure 函数,如下代码所示:
# J' k1 a: y3 C% Z) w w2 t. F: s. x3 N- /* Configure global filter:( {# u" m8 X& j( t0 j
- Filter all remote frames with STD and EXT ID& I/ K) `- `* R0 ~7 r. l
- Reject non matching frames with STD ID and EXT ID */- e2 B8 E$ R( k" R' F \
- if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK); ?6 W1 y* E' P8 H4 b
- {5 Z$ ~% \4 z/ c' `% @ ~' I
- Error_Handler();7 J+ d8 P: i4 R4 _; |
- }) g7 [, F% l% M
- L O7 G1 G3 Z1 B- /* Start the FDCAN module */
9 [1 ^% ~ F6 b- }: C - if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
2 w3 \4 {, W+ C' ]. [% o - {
9 d9 ]+ \3 M H% R9 R8 [! J - Error_Handler();% T0 Y) ]5 A$ U& v) f5 g
- }/ e& m8 L; S! Z. B2 ^2 e1 M$ ]
. \$ l' C. X6 b; ]/ E+ m/ J- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK). } }# M6 Q* o; S2 `4 ]
- {' Z a$ t$ r0 i. s" U$ y" g+ M
- Error_Handler();
3 A8 y% J' K* m: m( c% L7 L0 w0 U1 I - }
! O+ s6 |* s& f4 A0 i - / x) k, P. i9 L- K/ I+ }
- /* Prepare Tx Header */& g4 c( ?' _& A5 v( ]% [, @9 E
- TxHeader.Identifier = 0x321;2 G" u/ @1 W9 G! h
- TxHeader.IdType = FDCAN_STANDARD_ID;3 s. w" T; e, A8 Z3 X
- TxHeader.TxFrameType = FDCAN_DATA_FRAME;* U1 O7 g4 w+ h8 Q' z# S
- TxHeader.DataLength = FDCAN_DLC_BYTES_64;//FDCAN_DLC_BYTES_8;
1 k9 {0 L/ v9 G# d! D) s9 x - TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;( g8 M, P8 h, P1 V! Q) h
- TxHeader.BitRateSwitch = FDCAN_BRS_ON;
7 `+ x+ S& {+ E: H; g- l r+ W - TxHeader.FDFormat = FDCAN_FD_CAN;//FDCAN_CLASSIC_CAN;
4 Q" y0 k9 |- I* Z5 m. @# q# Z - TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
3 x+ M L1 f* | - TxHeader.MessageMarker = 0;
复制代码 , h! A. p, r8 ?* `2 h7 h
需要添加接收Callback 函数,如下代码所示:$ ?% A8 _4 x' J
- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs); r# G! x9 I! T) h* ?
- {
' I5 q/ z, @: z: C) q: |8 T - if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)
$ @) l9 D* p3 A s - {
4 R. [) C; v( V/ G9 R - /* Retrieve Rx messages from RX FIFO0 */
$ e0 C4 X- l% E; u& c9 D' D - if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
2 A' d" L# D- N' W2 L - { t2 R' z2 h/ V" s( O+ D) [5 T
- Error_Handler();. |* J: t! j% Y- j7 Q
- }
A1 ]! M! y: D5 ]0 L& k1 r - }& W" h# V1 \0 g3 [# U
- }
复制代码
# b" I# I& q6 t5 s目标是每一秒发送一帧64字节的数据,接收来自于上位机终端发送的64字节数据。
+ t7 a* u) l, W上位机接收到数据如图8所示:
1 s2 s1 L7 H! r, O; w1 x7 ^, V
, s9 L! X4 C% d3 X. B( v& m图8 & i2 |$ d; P; Q2 _$ N* b6 U
$ `5 U; k* Z! h7 o) h, DMCU接收到RxBuf的数据如图9所示:
2 e6 l" J! i* M1 s. K* O
8 Z( j/ H: h5 X: T) P图9. ^' q- u. n, m
从当前测试来看,收发数据正常,无数据丢失,满足初期测试要求。3 T% c# A6 T6 L
8 o- W9 a) d. e
|