收到板卡,已经迫不及待的等待功能测试。板卡上电如图1所示:
1 b* b) E4 P( L [8 Z3 e4 E
9 Y1 ?9 i# J% M1 V6 r" E
图17 I9 v3 r# l) n: G. I
+ N6 o# j( Z& i! R1 ~( W( u9 W从U3C5的datasheet上可以看出,是支持2路FDCAN的,截图如图2所示:
. E2 ~* W/ i% [+ u8 `, V$ v i$ n4 p
* P( F: f9 x' c! ?6 {# P图2, c+ L; j c0 T0 w4 `8 v9 {
7 x/ M: O o# N+ X原理图如图3所示:! J0 Z; Y4 W, \; U
" o- x* K* C' J3 p6 t5 \- X: G图3
: r3 m! s6 s" T( I3 b0 \0 j+ Y( g: r% c7 o2 j$ x
了解了其基本性能后,还是从STM32CubeMx 配置开始,首先配置时钟,如图4所示:, N7 G0 M% j* N$ X/ K' h0 n
+ E6 y2 ]0 B9 y6 F$ p V0 \. M. C
图4; ^; P( P% |4 w6 E
) b% ^- b* d/ N' d+ d# z
配置FDCAN 引脚,如图5所示:
6 k/ g/ e3 o& J j c0 s' I' ?2 P
, I- [7 F5 Q9 X% R5 Z! W
图5
; R' V+ d0 N. j2 G* b0 R, @+ W1 S! ~5 H
/ L/ A2 A6 h( D3 q! E( j$ {配置FDCAN的Mode 和 Configuration,先配置为2Mbps,如图6所示:
4 Y5 C1 Z$ `$ }) y
, [, l; L, R; P: V6 l
图6; y; c; x2 j& B8 _7 E! k
4 `* g# z! k& g! i7 S+ [( A2 ?MCU最大支持96MHz,从时钟配置上可以清晰看到。FDCAN也是96MHz, 按照FDCAN的配置,配置通信速度为4Mbps,数值可以配置为整数。如果配置为5M,只能配置接近,所以通信速度暂时配置为4Mbps,作为测试速度,如图7:/ c' M3 ?( x6 C/ f
( Q9 ]& e- S8 w4 \# ?- A
图78 }) {* E/ y0 |5 A
4 |! y" l# C! u9 H% B" i; y# b在VS Code中打开项目,需要增加一个FDCAN configure 函数,如下代码所示:
$ h( O/ D' d5 v- /* Configure global filter:! k) k, g' y# S5 n8 _' i' T
- Filter all remote frames with STD and EXT ID
& X9 H1 M b4 q+ S - Reject non matching frames with STD ID and EXT ID */
7 o2 t3 F6 c0 i# \& g3 ~ - if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)$ z+ Q3 \9 U& l4 A" w
- {8 A0 r# h; i5 y0 |+ v* ^3 g. ^
- Error_Handler();0 a3 H7 }" `6 \7 q, r% R
- }# ` e; Y7 ^5 Y9 ?9 ]4 a' d+ |: r
- 5 a( b& t/ E$ \( K$ b4 r+ K
- /* Start the FDCAN module */# e' x" r0 ]) Z# z
- if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)- d: L* N$ _. L
- { ?3 l3 o! ?$ Y) E( G8 a' `
- Error_Handler();
! _. r! K5 W7 L+ z! I - }
$ _8 X+ j$ L" x# f' F( ]
% {% r1 I! K0 p) h' q. S- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)( [" ^ V; ?& u# X& k* S4 ~: P" f$ J; V
- {
7 T: E" d1 [: d' e! Z' s - Error_Handler();% a4 `1 z: J: z& T6 H' c; Q
- }
2 ]4 Y1 q: l* |+ c7 }
* M1 I6 e' u7 p5 }4 O% d" x- /* Prepare Tx Header */
; O+ j7 b# E) r, K { - TxHeader.Identifier = 0x321;0 ^* {" A' M- |+ h
- TxHeader.IdType = FDCAN_STANDARD_ID;* Y3 r2 r6 V5 W9 p
- TxHeader.TxFrameType = FDCAN_DATA_FRAME;- I, }; d/ L; ?* ~7 f3 }
- TxHeader.DataLength = FDCAN_DLC_BYTES_64;//FDCAN_DLC_BYTES_8;
+ T* T6 _1 r% s$ d - TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;# l9 m; h5 ?) q3 r* R
- TxHeader.BitRateSwitch = FDCAN_BRS_ON;
$ s4 S! ?5 w5 }: A) v6 k A - TxHeader.FDFormat = FDCAN_FD_CAN;//FDCAN_CLASSIC_CAN;1 X) @/ n4 [3 q; Y2 o4 U% r
- TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;8 Y0 M8 b2 {5 m# P/ |
- TxHeader.MessageMarker = 0;
复制代码 2 ? }) Y" u2 W' N+ Z0 d! W- g
需要添加接收Callback 函数,如下代码所示:* u6 \* W8 s8 }: W8 ?+ n* S
- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
% E, ~( T8 {: F3 A - {8 s* e2 L& U& z k S
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)
: a4 a( J8 c* @$ K+ U - {
- X& b, [7 k% k h" J/ o" H. J - /* Retrieve Rx messages from RX FIFO0 */
2 b, s4 y: q0 d4 i$ X; n, N6 J - if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
5 I' c, M/ x9 a7 c; a5 S" |( D - {
, y. X! @7 |( F! ~ - Error_Handler();
# a" V0 C) Z; ]- R- }5 {, X - }
$ r Q' G+ x, D- H9 h - }3 t6 r5 D3 Q) e* s4 R+ \
- }
复制代码 - w8 a/ ]6 z7 l" ^- ^) T8 \6 K
目标是每一秒发送一帧64字节的数据,接收来自于上位机终端发送的64字节数据。, o& p' p+ i1 z" F. J9 g9 n
上位机接收到数据如图8所示:0 a% ?) T9 f5 t
* B! K9 }" V% V( ?( l5 q
图8
- f7 A' B1 ^2 V* w
: ~. M' R' J L" S) w0 |+ XMCU接收到RxBuf的数据如图9所示:
; [% A$ w& {. J& W7 t
+ U0 V3 i1 v% F$ d; k图9' Y3 i/ ?- a R- D* _$ z
从当前测试来看,收发数据正常,无数据丢失,满足初期测试要求。
; @0 o/ {$ B; C8 K1 z d$ ^/ D) I3 r' f% L
|