收到板卡,已经迫不及待的等待功能测试。板卡上电如图1所示:; J! i0 Q% v: y5 e; {, i7 j/ A
( P2 e1 H9 M) Q0 V0 T+ Z图1
3 M: Z z$ d4 Y9 _$ |0 Y$ ]6 A
$ [7 V1 e" n; M4 @从U3C5的datasheet上可以看出,是支持2路FDCAN的,截图如图2所示:
$ [( ]6 c: C* ^" u& Y z% d8 T
* d' ?& j3 E" M6 Q. u
图2" k: B! k1 g7 Q* s
: x6 \# ?+ G$ p; O- _原理图如图3所示:$ U2 R; i- U* e: X& Q" `
5 M" w" i$ P) `% p% X, m* z
图3
0 ` x3 q# N1 F" E; E
; e! Z" a& m4 T1 i! k了解了其基本性能后,还是从STM32CubeMx 配置开始,首先配置时钟,如图4所示:
/ K8 M, O0 {6 P1 L; j" _- s
8 T- J( f3 T7 y6 F5 H
图4" F; ^4 m F! T8 x" u% q: n
: f B j6 i0 x" t( I0 o配置FDCAN 引脚,如图5所示:; [1 I1 {* J$ t" ^ J
. e* e3 I1 p4 k5 V: O- M图5
B* b7 `& D; g! Z
% b1 p% k: R% L7 C# |配置FDCAN的Mode 和 Configuration,先配置为2Mbps,如图6所示:+ C) g) U3 W" Y! c3 e
6 S0 a8 q& W% v* N6 |" K/ b. c图6
/ a3 R# o) `; m" X
l: m! ~+ Q) U/ H- u! VMCU最大支持96MHz,从时钟配置上可以清晰看到。FDCAN也是96MHz, 按照FDCAN的配置,配置通信速度为4Mbps,数值可以配置为整数。如果配置为5M,只能配置接近,所以通信速度暂时配置为4Mbps,作为测试速度,如图7:! Z( H, T( C5 o# E
6 X5 d4 m* A# Q5 ^ z# G图7
- N7 F8 n, s8 V4 e+ @& E3 F( l% d e/ u: @9 k- X
在VS Code中打开项目,需要增加一个FDCAN configure 函数,如下代码所示:
* I- Q: U! u5 B A$ \5 F0 V- /* Configure global filter:8 D4 H1 ]' i$ o4 D0 n
- Filter all remote frames with STD and EXT ID) a0 _% p# O. s& a3 z% j- y- r( h
- Reject non matching frames with STD ID and EXT ID */
4 F3 O z z1 O7 W3 J* U/ P - if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)* O; o3 Z: p% x8 b# n( m7 K$ j: }7 `
- {
/ ]0 h# J) F% U6 A0 E* Z( a - Error_Handler();
! A* @6 m4 h& r) |0 B - }$ K, {1 c( i, x1 C" f
- 2 _. c% d: j. J I
- /* Start the FDCAN module */
y3 Z3 S P* t. k( y3 c - if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)- C# m/ p, H3 B0 Z$ e
- {
& `* N1 Z9 q+ U - Error_Handler();
8 w0 P; x( J; \) d; g: m0 {" } - }
8 K) s I. F; U* o, w0 W, G
1 t% x% E* W/ q' |9 k/ X- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)2 G0 E! R O/ [/ y* p# `
- {
# }5 Y3 H0 r2 ^( \0 @. M - Error_Handler();
+ G [4 W e& Z' L( B - }: g* L/ J1 R( }. T; f: P/ z6 q
- 9 B" m2 H$ P7 c) l
- /* Prepare Tx Header */3 r$ F. G' P7 v/ _& ~
- TxHeader.Identifier = 0x321;
/ y+ \6 h; Y5 i9 ~! ~/ s9 ` - TxHeader.IdType = FDCAN_STANDARD_ID;. p9 h" y. c3 G" X) M; l/ t
- TxHeader.TxFrameType = FDCAN_DATA_FRAME;
5 }! i( o1 \* ~ p8 ] - TxHeader.DataLength = FDCAN_DLC_BYTES_64;//FDCAN_DLC_BYTES_8;
: f3 A" t/ Q, ?- j5 K! N/ w - TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
! _6 T7 z( Y4 X, m9 h2 J) F: b - TxHeader.BitRateSwitch = FDCAN_BRS_ON;& v, v9 { J4 N- t+ g) g
- TxHeader.FDFormat = FDCAN_FD_CAN;//FDCAN_CLASSIC_CAN;4 h8 G& L: f# s6 e
- TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
5 i9 w# n. Z6 _3 ]$ |- ?# f - TxHeader.MessageMarker = 0;
复制代码
/ H9 ]$ |6 V9 k" z: z需要添加接收Callback 函数,如下代码所示:$ F% `0 n% y5 F! I/ v% ]
- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)* G! E; N% b0 s3 B
- {
6 H i0 z8 X- x# x - if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)$ ^6 _/ R5 z# H% r# R
- {
3 J- ~6 m5 U) Q5 L4 Y s - /* Retrieve Rx messages from RX FIFO0 */6 l2 _. ^+ u& g
- if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)# k/ v1 z. K- u6 [. ~1 L2 X
- {
0 S8 e ^& `- y h* g+ b: b - Error_Handler();
. }& ~- b# r/ p1 o* Y+ U2 Z - }
5 F1 ^3 ~# `& ?0 J; N h- N9 { - }9 t& p u3 f z8 q) z: C2 Q
- }
复制代码 : Y4 Y+ C0 @& }8 f' y2 G
目标是每一秒发送一帧64字节的数据,接收来自于上位机终端发送的64字节数据。. N( D. `, R. A& `/ e
上位机接收到数据如图8所示:3 O6 E* f5 j# F9 M/ i4 `8 ` O7 V
5 |; J& A! N5 l, N$ u% ?0 ]& I1 N- V: Z图8
, J( ]- \' _0 {2 d8 k
) j9 r( ]7 e* }) `' X; n$ C1 w7 `% jMCU接收到RxBuf的数据如图9所示:% V2 l, J; ^; g" g% j9 G! d: ]
& |# U0 M& n( I- q. M图9
/ r0 n# z3 ?+ }' a从当前测试来看,收发数据正常,无数据丢失,满足初期测试要求。
8 V. O' A9 E; ]# A, ~9 M9 X# C5 M: y6 B+ h
|