5 D# T1 {! w! t- ? 收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。
6 z7 T/ E8 X" k; l5 @2 W 首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:0 o4 z/ k" I, i. g# m
9 W7 d% K; W P f P' y
. E, q- }. j2 \. s n
图1
7 u/ G+ q, O5 ]$ y8 l; }7 t- b2 z7 O4 _/ L( M
- c7 b! j4 @" R+ ~
3 W1 n! `) K1 k) Z# p
图2; B3 Z, [5 P7 \& x
5 Z, N* @' x# U4 x7 N2 | 然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:
: j2 B% \+ V: q- ` J
- f" k: B0 J- n$ n$ C
! L n0 W* @* @8 _5 j- O- c图3
' d N, L1 e- X( s FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:7 M$ g9 K5 E; Q1 j: c
" A0 s. ` @8 i" u. k6 k
! D' k2 S7 C3 c) J5 r图4. J& ~% k: C9 c# d0 O4 U, N
使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:1 u5 l3 n7 N5 S" X. |) `+ p( Y
1 R$ }3 a, P& B- k! q8 ]/ D4 \ ]) D/ P$ D1 K1 G$ \6 z
图5' ?& d; x7 B: U* y: @* J5 c
这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:
" h6 L7 k& U! R4 W( w/ o F & K4 `5 f: ~( [4 S' e ?* S
- /* Prepare Tx message Header */
- @. G d+ A& ^, I. v* y | - txHeader.Identifier = Tx_ID;
/ h$ `5 h8 u* o$ n3 b0 d. ] - txHeader.IdType = FDCAN_STANDARD_ID;
4 S( Q& C, u3 v4 k* E - txHeader.TxFrameType = FDCAN_DATA_FRAME;" b a/ g& n! d* K/ E6 V
- txHeader.DataLength = FDCAN_DLC_BYTES_64;
, {( R% d2 `6 J2 ?/ I - txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;6 r) {9 a8 L0 R/ c1 X, k
- txHeader.BitRateSwitch = FDCAN_BRS_ON;# u. ~8 t3 t! J. {/ r" E
- txHeader.FDFormat = FDCAN_FD_CAN;+ \1 D; O2 W9 {" w! b- m
- txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
, ~2 A2 T; o0 U# W% j3 B" w" C* u - txHeader.MessageMarker = 0U;( h: {. `, T1 [! N* R
' G7 F, c6 j) ?% ]/ ]* c! _- /**
2 k8 Q% z7 y- s/ ]+ ` - * Configure and enable Tx Delay Compensation, required for BRS mode.: z- G' {& r0 g7 s9 O% r' i: ^ H
- * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler' Z/ u3 B, _- k5 e7 }9 s
- * TdcFilter default recommended value: 0
8 X/ P& B' B D1 H; c! W - */
# D2 S- T7 E; j - if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,
I( @2 E$ ?) ~" ]* J: C6 {- w7 m - (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK)( E. S* R! p, X5 \* O
- {) r6 j) L% I8 ^! |
- Error_Handler();
6 r `5 [6 {$ u6 w - }5 ]" W4 }$ f1 v, j! ], O
- & _1 \6 U* ^ N* L: I, z+ H
- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)
- _- ?, A7 B' E2 S5 y1 l - {
+ g% i, B% H( C - Error_Handler();
& W: A; F$ |8 ?% c - }
3 k0 h! s1 h" X9 z _) @" C% [
% P5 m% D+ | o- /* Start FDCAN controller */* r, |1 j) K/ {0 z- A# K6 ~" m
- if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)$ c3 F% Q8 S. _8 b; B
- {
y V: o- h! j3 e - Error_Handler();
5 B& W. h5 Y$ a/ s( Y% R - }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)4 A& f1 R) `0 P- ?7 X9 o8 D/ x5 G( o
- {8 D0 K9 ~; B9 A6 }% m: z+ n
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)2 }: F9 w) O3 T9 A# r0 _
- {
5 q3 W: o: l2 M0 j6 W2 u1 z1 M! Z" u - /* Retrieve Rx messages from RX FIFO0 */
6 s) Q3 i4 @, @9 t - if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK). ]$ D' E0 E% T5 f
- {
) {- r) c, F- Q1 g2 l. Y - Error_Handler();
1 \" ^/ V; P. v8 C$ e) [5 y3 R - }% Z3 Q% G1 ]! f- P+ O
8 `2 g6 e( M* p/ |- /* Compare received RX message to expected data. Ignore if not matching. */: V# m4 P/ |% ]# J E
- if ((rxHeader.Identifier == Rx_ID) &&) F& E# [ S/ b* M! {5 ~9 n) @
- (rxHeader.IdType == FDCAN_STANDARD_ID) &&3 l) ~3 U9 C5 s0 a8 z1 ]
- (rxHeader.DataLength == FDCAN_DLC_BYTES_64))
4 J2 }- Z7 C" o' \! a+ ? - {) u+ o) L) h6 g
- ( e+ Q) l" l P! B# e
- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);
2 J2 c; d* G* s& v - }2 ?9 _. p% D2 X' c9 I
- }+ p- w3 \; ^. i# x5 s3 c6 g+ j2 v
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)1 w9 O# _1 g$ O7 p2 _
- {
! y7 @; x2 T: f- m' u - Error_Handler();5 s ?5 f- L- x1 T3 N, x# ] A
- }% v8 Z1 q# s+ ^$ M/ i6 _: A# S
- * ]3 y: W8 Z0 {0 K- H
- /* Delay for simple button debounce */ I1 J d/ n/ \" O+ e4 Y4 i) i
- HAL_Delay(1000U);
复制代码 |