- v) ?1 X9 S; [% ?
收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。
0 i7 S5 [% Q; Q* Q Q! X 首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:
i0 ?3 z0 y, s" h* ~$ y
1 [' Z; F4 `5 P/ }9 C) f D. Z
9 H7 [' s7 {8 J
图1
q m' ~0 |. S8 U( \6 @& m/ B
$ i$ e1 J3 i- O4 a
3 Q, L7 B9 w. E; r8 U$ | S
7 w4 O% [+ w# p# L- O" u: M图2: {1 ^2 ~: i* G6 |' Y* p9 S# {' J
3 | _+ e b6 w% I( y
然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:) _9 o! o# ^6 ~- `! p
* h, v0 H d$ }0 E( x1 I
( M8 g) K1 K* N图3
% X" W% p! O4 q! Z! e; K FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:
: W, J9 }4 m" n+ g; K; G2 P
. L+ n w+ `$ N& E/ j/ F; m' R& y! d# K$ [6 A1 E' A7 B/ G* b
图4
' R! `- G2 ]! R0 V 使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:
8 T3 |$ f: Q h$ o
' N$ Q2 i8 |8 _% b8 [0 E+ t5 m+ Y
: L# h! ~, y! E/ ?6 D' O
图5$ s. S5 K4 w7 _+ H7 h
这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:) n+ Y# \5 ?& X! j7 b0 i6 g
% U* q, X: P0 s. [- /* Prepare Tx message Header */, O& I) b- m0 q7 E
- txHeader.Identifier = Tx_ID;
9 g0 k, N$ }! R8 {: v - txHeader.IdType = FDCAN_STANDARD_ID;
4 k3 D [2 c& A7 u - txHeader.TxFrameType = FDCAN_DATA_FRAME;' g. X* ^3 a6 Z' w5 F$ c% q$ p
- txHeader.DataLength = FDCAN_DLC_BYTES_64;& K1 r' \" K R# D& W7 W9 a
- txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
8 u! U- W* A, M' W! O% P9 t - txHeader.BitRateSwitch = FDCAN_BRS_ON;, h) u; |/ v4 Q8 W, Z: V* Q
- txHeader.FDFormat = FDCAN_FD_CAN;
/ y" J% D" _2 O4 ?( S! R4 ~ - txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
0 H+ ~; q3 d2 R6 E) ^ - txHeader.MessageMarker = 0U;' @( F8 a* F: z
- , f3 q7 G3 ]# G' r1 q3 t
- /**2 |. m. O. R/ R) ?1 n
- * Configure and enable Tx Delay Compensation, required for BRS mode.* Q. ]7 C3 X, O9 A6 V) w% j
- * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler v7 K. C+ \# p3 b; r
- * TdcFilter default recommended value: 0
( O# r& G7 G; a- N9 P3 D - */7 |8 Z: J, @9 K3 V2 V% A
- if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,
% O4 g& ]( {; u% W - (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK)
9 z% H* v: u* A8 r4 e - {
, H9 f/ z1 H+ R3 E( V. `0 X - Error_Handler();
( F% `( U0 x) O# J6 Z. f* B6 ?8 W - }
9 m" o& w+ i( G7 s6 G
% L7 O& O U1 W5 I- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)
/ p( v% E) N/ V. k) M - {4 N1 `' D- `2 u7 a% b3 v
- Error_Handler();
" S+ _3 p& e0 o5 X# V1 d, `& B% L - }3 H, `8 _$ b( j3 Q! b& _/ p
- ?# u( {9 S3 \+ p5 u- /* Start FDCAN controller */( R7 v9 _" y! |9 o( I
- if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)
1 U ^6 T, a& s5 a4 \+ l - {* m% D/ M/ q0 Q' s: \
- Error_Handler();
* q R3 r- K; V - }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)4 C% N9 B. u G& ]$ l, p
- {3 Z9 ]8 D- }4 Y$ a7 e/ `" @" U
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)
; T# O$ r, }, [5 F/ w/ c - {
) h( ~5 H4 u# A3 W: ^! X - /* Retrieve Rx messages from RX FIFO0 */8 R" M0 i0 I! @/ P$ p1 V
- if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK)
( ]$ T; M1 u% C, ] - {( d+ G) i; Q, y5 j$ e
- Error_Handler();
6 `( S$ s+ H8 ~7 N2 g) |3 `8 l - }
! s. d9 n$ U& F0 ~1 K1 U+ {4 w
. m2 \+ v; S5 S5 ^8 f# M) g& ?/ T- /* Compare received RX message to expected data. Ignore if not matching. */
; w7 G/ l$ Q+ P% W - if ((rxHeader.Identifier == Rx_ID) &&
* v* A/ p, n8 a - (rxHeader.IdType == FDCAN_STANDARD_ID) &&; l! E+ T; R' n/ }
- (rxHeader.DataLength == FDCAN_DLC_BYTES_64))2 T [' Q6 _; P t
- {
/ E3 H l* g& {0 B
0 b+ \. j0 A4 o N5 r# J Q8 T- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);2 ^4 l8 s7 g! Q& c4 s5 m
- }
8 a& p- ]3 P- t% n - }7 m8 |/ y' Z4 F6 L: l- n
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)
- w7 u) k# x7 r7 J- w' e; m8 H - {
R7 k" z$ \, G/ A - Error_Handler();6 c9 W5 D3 E4 ?; O+ B7 D, O
- }
8 s) C4 M* a3 t4 k; N) S, B& i - $ |7 G. y" H4 B: O' \4 S0 q
- /* Delay for simple button debounce */0 H9 k* w5 E/ i5 h, I l Y* g; X0 J; b
- HAL_Delay(1000U);
复制代码 |