0 y8 D" e; s0 E( R E% c: c 收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。
1 X8 L# C3 ?4 \- \ 首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:
+ |" Q$ ^7 K7 k8 C6 q+ B* ?3 ^ c, J. W
1 n3 Z5 L: c+ y- M7 M* m& D, T) e1 u, b; a$ e0 h
图17 W) ]8 F" U! @; ?7 G# G6 w# i5 P4 S
$ Q' w1 x2 A: G; b% L) L, W
8 X2 Q. u8 i9 V% F+ ^, s, G) k; s: U/ v# ~
图2
# V+ E2 [; h5 o( V& [* O
& |4 ^# Z& p% u1 @ N5 z$ U/ S 然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:
: { ?8 j" Y5 ]- m3 v: T
; O; A6 i+ N+ b. p1 Y' j8 K9 C/ d$ N1 l& T, r5 k) w: B
图34 I+ m0 ^3 d7 F0 I3 ]
FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:8 \! B6 n$ _( V
6 V" J9 r& j) d9 A/ f
% q/ i1 S3 H' u7 a图4* J _- i. X' ~) N9 a! a. l
使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:
5 Q5 i6 H, c' @$ R3 M# b0 d* T
% e ~8 b% B1 P3 X, `# a7 A! ^; y1 t( u5 u$ p/ G
图5
; R G5 N T% m: B" F1 i; J5 P# d0 N& q 这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:, S" k0 r& I: [0 N3 H
% V, E* h( N% K9 [4 X# F B
- /* Prepare Tx message Header */& P" |# q0 Y0 b7 g, s2 T
- txHeader.Identifier = Tx_ID;
! B2 ~6 o+ S( |* W - txHeader.IdType = FDCAN_STANDARD_ID;1 y, L! e* z* [$ ~# R1 x
- txHeader.TxFrameType = FDCAN_DATA_FRAME;
J' b! S$ i% D7 H- W - txHeader.DataLength = FDCAN_DLC_BYTES_64;
. r! W. Y5 Z! ]7 M q" Y - txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;0 n+ O. H- ?9 B. O: C- y
- txHeader.BitRateSwitch = FDCAN_BRS_ON;
1 K# i4 S1 K, N( [: T - txHeader.FDFormat = FDCAN_FD_CAN;
4 W" O, n# |9 E& w- e. g - txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
! y1 v* Z4 M' v9 l; y/ K; } - txHeader.MessageMarker = 0U;' W2 U% [. Y* x( Y' N8 \
1 E# h9 d8 {& X) v- @& ?- /**
6 c3 r5 {! `" O: E3 M& k2 C - * Configure and enable Tx Delay Compensation, required for BRS mode.% a( X6 ]( i1 \4 O ^5 z1 }, r
- * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler }/ l- V7 f& \" q% v4 n- d" y
- * TdcFilter default recommended value: 0: t' d$ w& A% P( |. A7 [
- */) }0 D. ]/ N; [5 a7 j+ Y, q
- if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,1 ?, r! ~2 B6 k( c5 V0 [3 J6 T
- (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK)
4 B+ H! p/ j' n' l' J - {* d9 s. K, P8 `- E* }3 c
- Error_Handler();% C% q& Z: F) k! @: k
- }
# f* g+ ?1 K6 K& g: ~ - 6 F+ T) [+ T! x* C9 p
- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)
! u2 }! [$ S; t - {% W+ [8 o# s9 \
- Error_Handler();3 {' D- h- q; s" ]; m! H1 Q
- }
4 l D! I; ^# N8 n" @
4 \5 l/ w k. O9 ~( ]8 F% _- /* Start FDCAN controller */
) S0 _1 p& j& K( j8 v, l, `( F3 l3 R' t - if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)2 Z9 c( x6 R+ ~7 h7 Y1 u L! ~0 j
- {
5 o# m" v8 v( }6 @ - Error_Handler();, j. D. T5 Z h# ?
- }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
, h1 i; @! L% z - {( V* X- O. {8 k5 C+ ]
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)! e7 u# A: I; b( D, d
- {
7 I( m. i+ E7 U) V8 W! j - /* Retrieve Rx messages from RX FIFO0 */; x* D7 `8 |+ Z) _5 e
- if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK)
6 T5 T1 I2 T4 i' o - {
- M2 Y- I: q0 j$ O) K+ M c - Error_Handler();3 ~0 f' c5 U' c) B; s
- }+ P. L7 c1 y, x/ U; k
& b _" G* `& k1 U0 K- m- /* Compare received RX message to expected data. Ignore if not matching. */- B9 k. p9 F1 B1 c4 n9 {, T1 h
- if ((rxHeader.Identifier == Rx_ID) &&; k# n# h2 g4 F6 y
- (rxHeader.IdType == FDCAN_STANDARD_ID) &&" I$ [( c4 D. `
- (rxHeader.DataLength == FDCAN_DLC_BYTES_64))% e" i5 i; I3 E
- {! @! g) R4 M2 G
7 B. i, n+ C5 U. j/ U" M/ Z0 [- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);- V/ @. o' P2 u1 |. d
- }9 u% b- N4 ~ Z! G* Z, G
- }$ N% ?; P5 H. d4 x$ |! ^" L# R- h
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK) ]5 a6 u' t4 o, _
- {
+ p( C# m$ T2 Y4 c. d+ U - Error_Handler();, a& X* u0 Z ^& s. G9 c
- }& D+ w) c' I6 Y
- 3 l+ ~% Z0 I8 y/ d V' N
- /* Delay for simple button debounce */5 v4 W/ C9 T2 }9 L4 X4 M0 ^
- HAL_Delay(1000U);
复制代码 |