# B' _9 f q- b5 e+ j" a 收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。
% i3 l1 i, M" k! Q" r, {# t i 首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:
- X. L3 Z1 H9 y4 s) @- @% D
7 W: u) J7 c# Z- H+ B' k9 e Q2 S: X/ h, k
图1: H$ W: a- w. y8 a# B
. v( h$ b0 d& Q$ \
& p0 ?% U4 ~# H1 y9 K g
+ M4 D- @& p0 j' o7 N图2
6 g# g. G* {. C) M Q" s7 J( {0 K- a" o) h6 ~- c5 |- b ?
然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:9 P. h, G$ I& [9 O$ }" T
8 I; B1 c5 Q: i0 E; X
$ \; l# E3 ~1 W: @; L4 i A7 T% _图3. q- @; M; b5 c7 r8 k/ V1 \
FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示: ?6 [4 D6 Y' a6 p7 T6 W
% w" H3 w1 c3 ^. Y4 x: \3 i- a/ @; ~" A6 J0 H/ |) \7 _, q b3 g: Q3 e Y
图4% p# o. o# ]% V0 h
使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:
. D N. B* T# z8 c4 k2 v" f# D
/ _- Q8 t! M; ]- e
# N0 A( ]3 |& t# C图5: }+ G# d( l* b" c
这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:
1 a8 Q4 M+ r$ z% J & X, x& b; k& l1 Q& K" P
- /* Prepare Tx message Header */
7 h/ v+ E# |# ?( J$ j* T - txHeader.Identifier = Tx_ID;
" [7 {8 K+ ~) N& }$ { - txHeader.IdType = FDCAN_STANDARD_ID;: f9 A Z. [4 q7 c' n3 u
- txHeader.TxFrameType = FDCAN_DATA_FRAME;: _( n ]) f0 e, a* h$ y
- txHeader.DataLength = FDCAN_DLC_BYTES_64;) x+ @8 u2 `$ i: ~- E: r& M
- txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;% y1 x% |6 P j+ h7 H# w: j
- txHeader.BitRateSwitch = FDCAN_BRS_ON;
8 \8 H* F9 \) S - txHeader.FDFormat = FDCAN_FD_CAN;
; w. }' \( [8 Z2 ~2 S - txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;% [9 R6 g4 w9 T% F# b" l
- txHeader.MessageMarker = 0U;
" k: ^( r7 D5 s- @2 R - 5 J9 z5 {- q, `: ^2 T7 Q4 I* d! R
- /**, C" A$ p: G. r
- * Configure and enable Tx Delay Compensation, required for BRS mode.6 w3 A. k8 I: M b" b) e8 X
- * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler6 H1 r. j' V3 u0 ^) _. C* @
- * TdcFilter default recommended value: 09 T( P; Q1 s% b
- */
0 m0 F/ H3 G! r6 s% ^0 ~( n - if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,
3 B5 I, g+ C9 [* |: s - (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK)
1 ]6 j+ @( X+ u - {$ G4 U, T2 m/ u+ Y. l
- Error_Handler();: |! C1 }& j" Y) {3 T' T* d
- }
( B% P+ D3 v: M+ q+ W
( }8 Y: I7 O1 l a( B* |: b0 A- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)
% ~, \7 D% t. `# q |" N0 y - {
6 C1 t1 B- l" T. `/ w; D - Error_Handler();
) ~+ V: Q6 C, D1 i4 ]. E3 f$ P - }4 q' D' ~2 I- R0 U
- - b. Z; ?: c2 f+ E' n! X& p8 `
- /* Start FDCAN controller */
, |% e: H# G3 u" I' L( S& g - if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)
3 c0 H0 F. V. E% [# L - {& P& Z- V8 E3 y0 `. J$ h* l- C4 r
- Error_Handler();- B, h9 [/ X! ?* D/ ^% [- |
- }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
$ E8 R' m4 g; _, u7 I; ~' B - {. i4 u9 d; X# J: ^
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)
" \4 V5 N# a, K! z - {
+ F" j" x. S: I: t - /* Retrieve Rx messages from RX FIFO0 */
( `$ I" I0 g$ W% @ F6 Y* h - if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK). F- k, `/ g8 b, d" s
- {
/ s0 i' w, T( B: Z' g - Error_Handler();4 x% {6 P6 s$ m
- }) Q/ H+ v2 M/ P
0 a' h+ M( e) K9 @; v6 g! r$ A3 P) H- /* Compare received RX message to expected data. Ignore if not matching. */% T& T+ `3 D. \' }6 n" E
- if ((rxHeader.Identifier == Rx_ID) &&
) i5 f7 L3 Y( ~2 J) Y; @. O$ d - (rxHeader.IdType == FDCAN_STANDARD_ID) &&
1 P2 o) e% R2 _/ C* T |( \ - (rxHeader.DataLength == FDCAN_DLC_BYTES_64))9 K0 {/ F4 J$ O- T0 p
- {" H* N+ X# g4 }. o+ N) J
- 8 x% l5 C3 i4 ~9 b3 K& x: x
- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);* z) l5 C+ \ Z9 q* g
- }4 [- Z1 G% m9 {: o; v, T
- }
8 q: s8 j1 z |7 M8 z: o p - }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)
6 X8 M8 R' \+ F2 a, } - {
3 R& B, f% O$ P2 T! w - Error_Handler();) U) b( S# c- V |7 H
- }' C: E* M; [" O0 ^
- ; |" g* Z, P7 A
- /* Delay for simple button debounce */0 m3 w' j& H8 q* d; u& `
- HAL_Delay(1000U);
复制代码 |