1 `0 z6 c2 E3 n& x' d
收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。
% b. V' [) V+ j) [6 o6 L 首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:
! b5 \6 `' ~% Z. [# [4 w
3 ]" o9 G8 W% x I+ t# z' ~4 X* W. Y& G$ ~. _
图1: J! \- c+ U0 m
. y/ q1 y* [7 m! q' P. }' z0 k
9 I6 }2 ?4 B4 o5 z p/ D) [+ D
& P1 _7 q# I0 _* `3 b% O2 p图2
/ s- f" s8 V6 ]! @3 C( M) t; A
( \4 i4 r5 R0 ~9 k$ I/ w 然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:
" H! p b+ J0 i
( V: g/ I& B" Y) I- N9 Q: e( U$ Z0 G
图3/ O6 E8 I! I x8 {, [; X0 G$ D
FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:
' m- K8 D9 u; @( p* X
7 r- F: l. M/ J. h2 L9 B% P
1 K" ?0 _. l. o5 v/ [; `图49 @1 F$ l0 L4 B# s5 D, V4 P
使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:8 e1 [- u- R! ]4 L; |* I" g) P
3 E. t9 e0 G e+ a
6 w% o" ~! s* A" [$ C图54 _0 R! h/ C8 l& `3 ?
这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:
5 r9 {3 R- L; e& w( r ( A8 v% f+ l, _# o
- /* Prepare Tx message Header */
% y3 P j' H x1 k7 }* U - txHeader.Identifier = Tx_ID;
6 a- G$ P, ~( \+ p8 V - txHeader.IdType = FDCAN_STANDARD_ID;
; b0 n' a0 @' J3 J) P - txHeader.TxFrameType = FDCAN_DATA_FRAME;
+ R. O' |1 X. A; J# j( w; _1 g. s; n - txHeader.DataLength = FDCAN_DLC_BYTES_64;
6 e' [; H+ P" E( z" X7 {/ U - txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;; }# `# _& G6 V) S5 I! Q
- txHeader.BitRateSwitch = FDCAN_BRS_ON;
, ?3 T- q: a, d - txHeader.FDFormat = FDCAN_FD_CAN;/ v5 j% {) N+ M# |5 s* c
- txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
5 p) Z$ e8 f& z, k) O - txHeader.MessageMarker = 0U;
' s9 @8 q: L' R1 F# e* B3 d - c2 m6 M0 J2 c1 h5 q6 Q' C
- /**
* a, X. X s5 R8 G% u3 x( v M - * Configure and enable Tx Delay Compensation, required for BRS mode.
9 R# y% X, C7 |. C - * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler
5 Q+ k& U* l5 {: k% }2 Z: u - * TdcFilter default recommended value: 0
& g# Y2 f# ^# u0 U6 v* R - */: A2 Y; p. n# X
- if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,
4 B; v6 O% \+ ]3 P. J - (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK)
# f5 F" z5 g8 U+ R& j% G: m - {
! Q$ w% @. L1 i - Error_Handler();
8 T/ @/ _7 y" W( O7 L1 J# p - }
! ^1 w) K% B. k8 r4 l7 u! I
3 u9 k4 p4 ^" H- a& V% k- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)
% K5 K1 H" \) L! B3 R, j - {
) g% f/ ^1 H6 a) \& \1 ]! m - Error_Handler();" f0 l* |, i2 y# ]
- }3 V" L. V" p$ _ R
5 q$ h( O& K8 X5 m8 _- /* Start FDCAN controller */
6 v( t: X5 Q e, ?. Q - if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)
- U. B! D: b5 H2 V/ ~ - {
# Y/ n+ A7 a) h1 D6 R - Error_Handler();
: I; z0 J4 Y# N - }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)0 ?0 k5 g0 s: C6 Z o, C
- {% e$ t. `' q7 K
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)) J8 w6 ^ D+ t4 O$ @' z/ U
- {) u. d5 Z+ R3 u' A! ?# D% a
- /* Retrieve Rx messages from RX FIFO0 */
/ l( n5 P) ?; q; U+ }1 ~+ N - if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK), v& s {2 e, y" G$ Y- t- a8 N
- {. U- U4 n8 }6 ]: H
- Error_Handler();
$ w/ j1 z% \' V) R$ ]* n* P- d+ U - }! L1 t* Y, j) z7 _
- 8 Y5 ^% n3 O" ^, H* [* u$ h
- /* Compare received RX message to expected data. Ignore if not matching. */) g+ D8 A8 X" d$ v9 b
- if ((rxHeader.Identifier == Rx_ID) &&) N: `3 n4 U) @) e; B4 j
- (rxHeader.IdType == FDCAN_STANDARD_ID) &&
9 S5 f- P% R5 \6 v- H5 Z4 K: A+ j - (rxHeader.DataLength == FDCAN_DLC_BYTES_64))
1 h5 [( \+ B& A3 F - {- t5 Z1 r2 q1 B5 Z4 z6 z& ]- T
; s1 {* @' @2 r: C( k+ Z- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);
; X+ h7 q4 k( M6 l3 s1 j& P - }2 T+ ~ [& u6 ^( t( x2 c
- }! O: o; {( @& S: M3 n9 `
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)
" k7 [7 ^2 w0 M - {9 t! \/ g9 w7 c/ j
- Error_Handler();
; N% t- X0 f! `- `9 I* q2 R4 c - }, ]7 F* J+ P- F q$ |
- $ t/ H# C) [4 Z$ X; Q3 t/ L" o
- /* Delay for simple button debounce */
) _) n" p" K$ _" a/ b" ?- y5 G - HAL_Delay(1000U);
复制代码 |