* j0 f& N: r: y- i: T$ ] 收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。* p0 N+ B% [! a" P7 W
首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:7 [4 @3 R8 q6 G1 J
' S" N' N, a9 x
, `+ q" Y! S! k! @! A, d6 ]
图1
, I' N5 ^$ H# A4 p8 X) O. w1 o4 J' e2 z- Z9 x# H! Y& c \
* |4 e0 \+ z' L( B& F
- L0 c7 S$ s- C G2 t, J& j. H图2
" R4 P+ @% V' f4 e8 W
2 X: s9 t$ V. e, w& t 然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:
. P/ f8 F1 G4 u' @2 H c/ d4 D
( @. |/ N7 p* U2 R* @
* \. F0 s; l. H4 k8 D图3
+ Z8 }) L- H& S/ ] FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:
9 L* J( Y* ^9 ^" c M2 q/ M
, Y7 X' o! q3 t7 S) ]/ L; A3 s/ C1 N0 r. G
图4
/ I/ m6 h+ u0 Q- Q 使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:* W4 E* n3 B9 B, Q
9 }: | h9 k& W7 g8 W# ^
9 R4 G2 p& N" R# y) P
图5
, J1 f& t7 m* R* N7 p9 I 这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:
/ o- a* R9 f6 W0 F9 d9 @ . m9 ~5 l" m+ S& B; G" |" f
- /* Prepare Tx message Header *// g# r. l3 s3 d7 a/ o
- txHeader.Identifier = Tx_ID;
% M; C2 k: C2 D7 `- a N - txHeader.IdType = FDCAN_STANDARD_ID;
9 Y- ]* H2 v1 a! T4 ^" n' t3 g% D - txHeader.TxFrameType = FDCAN_DATA_FRAME;- F2 D2 |9 O1 G; V1 x9 g0 Z
- txHeader.DataLength = FDCAN_DLC_BYTES_64;
$ q- m8 D+ D% S$ z! }1 u' f6 }0 O- n - txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
5 \1 `. a4 m1 k, a; ~, }5 \' ] - txHeader.BitRateSwitch = FDCAN_BRS_ON;
B4 B Z6 u M7 ^% Y - txHeader.FDFormat = FDCAN_FD_CAN;
) s1 J8 |% ?" h$ l; Y2 v6 s - txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
* J( A" i6 V% D, g/ N5 n4 { - txHeader.MessageMarker = 0U;
# V& s, _9 [% x4 k0 { - ; _9 S4 r1 D! Q
- /**
$ e3 [6 U+ \, O7 C' u$ e - * Configure and enable Tx Delay Compensation, required for BRS mode.
. j' k% `# F2 ^& T- X4 ~7 `0 z" X - * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler7 B' u) r5 c) t, _1 m! l; B. h
- * TdcFilter default recommended value: 0
7 p6 |. A3 {+ E. t7 Y5 i - */2 v0 O9 G$ Q5 O3 V# s0 z) n
- if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,* y+ Y5 r; H# u x& y d, `
- (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK)" U+ g& y- V* p. O9 m3 B
- {- ]; w# x* T e1 q* w
- Error_Handler();
6 Y* X, D3 R3 c - }# }2 [# }% }( g
) q2 L5 \. o6 e! ~& U- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)
! ?- }6 d1 Y# D6 N/ v. n - {
0 L5 a9 N3 f6 Y$ V/ z) t7 n - Error_Handler();
, t1 @9 R5 ~# S4 N - }
$ e, s+ w# R& { - E/ x. h2 d$ E. ^& A
- /* Start FDCAN controller */
+ o5 D6 _' ` m7 g, s+ w - if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)7 J/ v3 ]! y+ W) M0 T
- {
& O7 |; R: _5 q! m; P - Error_Handler();$ s" m/ p( z% A# e% Y
- }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
9 f6 O6 e$ X/ s* N! }/ f: l - {7 {$ |- l' b3 a6 H& J
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)
! k A9 [/ R1 j1 I - {: z( L$ C/ F% [( ? w
- /* Retrieve Rx messages from RX FIFO0 */
. s( `- c4 H! S: v W/ d6 I - if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK)* I* _. W- J3 k$ { |; A# f1 g" g
- {
3 v3 R- p f6 y3 D! L6 t5 q7 V - Error_Handler();* Z0 x$ N7 D7 K0 M
- }
# L: z' c; r# q7 s: z7 |3 D
( b6 |( N0 K R, L V5 ?# r- /* Compare received RX message to expected data. Ignore if not matching. */
. ~0 L9 g5 n: N* L# ~$ T; n4 S/ r - if ((rxHeader.Identifier == Rx_ID) &&
7 a; h# j6 x8 H! i! J c5 }$ o4 Q - (rxHeader.IdType == FDCAN_STANDARD_ID) &&+ D, l8 l; X. w+ c8 U$ M+ K K
- (rxHeader.DataLength == FDCAN_DLC_BYTES_64))7 I; Q9 j3 o( S- A
- {, T8 S" q8 Y3 F: A i+ l( |
- / q# [5 b9 q) n# I7 R
- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);
. M3 a3 N9 j, y! T5 d - }2 W, s9 s4 X, { O& E8 y, N' W: B
- }) B7 _/ U. e9 D: Q2 J0 r
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)% u3 b6 V7 g( V x) D8 z- Y- h
- {
3 l3 b1 @4 L1 u( x1 _, t, B - Error_Handler();4 M, t# P9 }. u) {9 a' s
- }
: ]- ], C/ A# s+ S: b - : u0 O* B3 l. e
- /* Delay for simple button debounce */
2 |6 d# E a7 v$ X0 W% f - HAL_Delay(1000U);
复制代码 |