2 e4 K$ l- o: F 收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。) k7 t6 {( N. p8 e8 L
首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:, b* c6 F, S* ~8 ]5 _* R5 V
+ |" V4 n" Y/ L8 B; f& R" g
2 j( ^4 E( p8 z' A# h) N# Q
图1
2 h7 {) }4 b ?' E5 A$ ~9 N8 ~) m9 w
7 M- {' E" R. I( M, D7 R
; u# c) x4 Y8 P# O0 i+ m" k( R1 D2 O F5 g! y4 k' p$ ^
图2& ^8 T3 y( J* G/ E( L
a( g" p8 m) q. q, l/ E
然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:
( s6 L% b5 `% ?' s) \0 c$ w
- e( d1 } h* T. D5 v E9 X
$ M: z1 y' d: H0 J/ A图30 `; b7 K; ?& V- k# ^, v/ B
FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:* G2 N6 O* J; h, j3 a5 j
3 F+ W+ [% h' ~; }
" i$ P3 z' @6 p2 g# B图4
3 x, @) E* Y0 ?; i! A& r 使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:
- f+ ?( u h4 y& X* \: f4 A* J
4 [( v& H& ~) `8 b" k
$ u% m6 [ G8 e, q% ]图50 R. ^: m- p& P7 H
这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:" A7 M. q$ L, {) C( D
8 j) v3 S, U0 {- /* Prepare Tx message Header */ q: O" i w7 b: \4 g3 P# F
- txHeader.Identifier = Tx_ID;1 p) e0 b7 z' p" @4 f
- txHeader.IdType = FDCAN_STANDARD_ID;) x4 h) u7 r- A% b7 A2 i' e
- txHeader.TxFrameType = FDCAN_DATA_FRAME;
- I2 p, e0 C) z5 Q - txHeader.DataLength = FDCAN_DLC_BYTES_64;- T6 F3 Q: B% }0 R
- txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
* \- {2 O- c! c4 ?9 \# x - txHeader.BitRateSwitch = FDCAN_BRS_ON;
$ m5 X3 f: V# G5 V) u - txHeader.FDFormat = FDCAN_FD_CAN; Y# f b0 S& W0 T+ t' j
- txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
2 n& e7 V% T" S/ ]# I - txHeader.MessageMarker = 0U;
) `7 u" X' `, [1 b9 W
L- C0 Y' \$ H) @2 L+ }- /**0 ~# O. z; \0 Y3 d% Z
- * Configure and enable Tx Delay Compensation, required for BRS mode.
+ @: n; |, r$ `: e! f2 d - * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler, K" P. \* q X9 R3 L2 l
- * TdcFilter default recommended value: 0- j+ U$ m8 B" Y# p$ E
- */
7 {2 D; M3 N& h# D& Q& Z - if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,) E( o( W% [3 r3 S
- (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK)* ]4 M H) R, I* g7 C
- {$ R, t# q: p% l
- Error_Handler();$ O% ^( d D2 {+ O
- }
8 [+ R8 a1 z; h; n' g" b - # J2 P0 a, w& ~$ ~) ]) a2 z
- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)$ \" o. U5 D3 o w7 W# W
- {# Y2 j, ~" x; e1 i
- Error_Handler();
3 m4 b% `5 d* H/ ^ - }
+ i+ y& l$ ?+ a6 I; g" p
; x7 Y' e& p1 S5 U, Z) b1 V- /* Start FDCAN controller */
2 z. l3 v+ ^) N Q W8 X& L - if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)
0 U0 [4 P2 a [) j% c6 l% V) T" V - {, |4 E5 V& i8 [) X1 v
- Error_Handler();4 T% k- }& k5 n! v
- }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
z5 v' y# F% l( ] - {
& D3 ]% U5 ]& x, m: B- s" } - if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)
, s2 K- T- c* v2 V/ \ - {
0 {% S! e; C% y0 \" s1 d# Z9 o - /* Retrieve Rx messages from RX FIFO0 */- c3 y7 d* K7 I1 S- P7 P" T
- if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK)
9 t [; Z! R6 p$ D$ Q" Q - {$ Z5 u( V2 {$ L; e8 _
- Error_Handler();1 Z# v! p+ u, Q: |. W
- }8 I, A/ ]2 |5 j; G; E5 e
5 e4 q- ^0 k- |( G# G6 p1 ^- /* Compare received RX message to expected data. Ignore if not matching. */* g# z7 `: u! z3 j6 [* W7 v
- if ((rxHeader.Identifier == Rx_ID) &&
/ Z0 ~4 y8 v: d4 h9 E- _ - (rxHeader.IdType == FDCAN_STANDARD_ID) &&0 ?; }" q, ~; S3 w6 I; d6 K
- (rxHeader.DataLength == FDCAN_DLC_BYTES_64))
$ C! O% [+ k- ~0 g+ F, I - {: S$ v8 y6 P+ Q; C5 j! S# w6 K
- 8 q4 T0 u. b! a% g7 }7 T
- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);
& p0 f9 {9 X" G+ ~9 D' \7 k - }
+ A+ }; w0 X: v( i8 F# Z. C - }
1 R0 l* d+ |* A0 Z S9 A( y - }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)& R% p5 c5 a# t9 d4 i* L
- {6 }/ D! t& i/ R: R) N# C
- Error_Handler();
( n) ^( j) s- N d8 |: C - }6 R; B1 N9 {% n( y5 o
- 7 R! T I! l! D A0 S9 w5 O1 \
- /* Delay for simple button debounce */
+ y2 E' t# G- g$ Y* P5 f% Z - HAL_Delay(1000U);
复制代码 |