收到板卡,已经迫不及待的等待功能测试。板卡上电如图1所示:, B1 c: e2 l& m7 ?- ]+ T
4 {( t4 D$ r/ ]; I" Y图1
; ?8 R `/ ~5 w" T y8 l* W& c
- c, Q- p+ A$ G1 z% w6 r从U3C5的datasheet上可以看出,是支持2路FDCAN的,截图如图2所示:
I/ }5 H! h# j# s) r1 q; U6 m
# Z- X. h- F8 @6 y [3 `
图2, x; q$ u- e) k- v: ~
3 h6 H" n- p0 E) w% m1 }8 Y原理图如图3所示:( o/ u3 P1 r, O, c; }4 b
' O& W% M2 Q. Z$ R; v6 k# ~ t
图3
, c' R3 \$ H& A1 z
7 `! [2 j! @; c$ f了解了其基本性能后,还是从STM32CubeMx 配置开始,首先配置时钟,如图4所示:' W. B+ N' ]: \7 T: x- a U
$ D: y$ p! q0 V7 g9 s* H/ S3 E% D; T图4
2 ~" w( Q9 D( ~2 Y& L4 z4 W/ G( W
配置FDCAN 引脚,如图5所示:
v1 |; ], \; w4 G% [; u
1 Q3 \1 t2 [ ?% D7 p" T8 x图5+ D: A- V; y/ G+ p0 S. G% ~ b
( b; @ R X+ f& x/ L
配置FDCAN的Mode 和 Configuration,先配置为2Mbps,如图6所示:
) L* q1 H9 s0 @
( F4 ^) V4 j9 [3 i$ c* h/ N图6$ j0 Q2 _3 U3 S
2 a" i8 y6 s8 y6 t$ j' _! P2 V& L
MCU最大支持96MHz,从时钟配置上可以清晰看到。FDCAN也是96MHz, 按照FDCAN的配置,配置通信速度为4Mbps,数值可以配置为整数。如果配置为5M,只能配置接近,所以通信速度暂时配置为4Mbps,作为测试速度,如图7:3 D" G+ j7 c* k! P" r" R5 K) x1 ?
+ o1 Z- U" I" @$ I6 h+ p图75 l9 L/ C) x5 h! [% T2 P
. A/ `4 f" m5 Q7 D' Q J在VS Code中打开项目,需要增加一个FDCAN configure 函数,如下代码所示:
' E' i- R3 r V- /* Configure global filter:
; t) M4 P/ E: v9 ]2 | i - Filter all remote frames with STD and EXT ID
# P% S- Y+ q5 \0 [2 ^( {* D8 h - Reject non matching frames with STD ID and EXT ID */
4 ? V0 w7 U& j% }$ D7 H7 R- k% d - if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
* `& P+ Z1 X& ?, U; Q - {2 W& y6 X8 d. I: r
- Error_Handler();" B2 `7 G: U' z* p, \6 H! r
- }0 s/ C# K7 f; h6 v% P
4 P3 Z( j8 R$ T# `) |- /* Start the FDCAN module */
# i* ^; M6 {. v! Y' @0 y& f* O - if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)2 b* F( ]! @" D' h8 a( [" J
- {4 L) M; w/ _ N: }) c, B/ w4 @! ^
- Error_Handler();
: o/ O% O& {) m) f! J - }8 s9 S* u" e! A& f- p
- * J3 S* B& l f1 V
- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
. A- P: y5 z1 c! L; W5 p - {
?. w- g7 ^% V+ o% t - Error_Handler();
- N6 h( S- g8 Q - }1 K0 v" t. j( Z! u
/ m0 V' r" ?3 z" Z- H0 Z- /* Prepare Tx Header *// p& D3 T% b# r6 A, k
- TxHeader.Identifier = 0x321;; a" |% v( N9 \4 }1 l
- TxHeader.IdType = FDCAN_STANDARD_ID;
t+ o% b$ [$ k. B0 }, {4 b7 V0 Q - TxHeader.TxFrameType = FDCAN_DATA_FRAME;
8 ~9 ]4 n' b* q1 R- i - TxHeader.DataLength = FDCAN_DLC_BYTES_64;//FDCAN_DLC_BYTES_8;3 |8 B9 `' n$ }6 g/ H$ X
- TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;+ [. ]: p; j' T
- TxHeader.BitRateSwitch = FDCAN_BRS_ON;/ J; x8 a! ~* m* A# x4 F3 i4 G
- TxHeader.FDFormat = FDCAN_FD_CAN;//FDCAN_CLASSIC_CAN;7 F2 I- y+ F# @
- TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;7 O1 c' S d* F1 j
- TxHeader.MessageMarker = 0;
复制代码 - W2 q* ]! {9 P( ~3 v* Q) H8 h
需要添加接收Callback 函数,如下代码所示:8 c& r' ]1 R! k( m/ |& {1 Q
- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
! D3 U. r9 _! q; f | - {& ?: v. f6 T: q1 q3 \9 t" H: Y( {! C
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U) e7 X7 k0 ]' L
- {, t/ s+ ^( [4 c) q1 ]
- /* Retrieve Rx messages from RX FIFO0 */4 t0 n ]6 |; \
- if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
' t; P" z+ y6 ` - {
6 F# p! l5 i2 e* b+ S( p - Error_Handler();9 l; a3 O$ _& S; G G& A
- }; e& P7 ]+ S6 U3 ]9 s5 T$ L! D5 k
- }; |) k! P; z- z2 b" k9 G
- }
复制代码
; }: C, w7 b0 i% o3 `$ N% }' ^目标是每一秒发送一帧64字节的数据,接收来自于上位机终端发送的64字节数据。5 E; m+ D) P3 ?. t% N& Z
上位机接收到数据如图8所示:- y; X# z! ^$ u
" k* L" X& W' U- z0 d
图8
+ L- A) V+ E! m9 G
/ k! ^. v- j+ k$ W0 A4 bMCU接收到RxBuf的数据如图9所示:# P2 Q# e' p$ E1 ]
2 r7 N; r1 ]4 O% R
图9+ h& ]: g/ I( q1 T+ |1 X
从当前测试来看,收发数据正常,无数据丢失,满足初期测试要求。
) [$ G/ u( T) A3 t" Z
# ^5 \( l/ X' X6 _8 X |