4 X! s' Y" p& ^/ l5 ]
收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。% Z7 a' ~9 r" X! p, [7 u5 q2 {" M
首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:
+ f! d& \1 |1 @* `6 u u g
* U% |) m8 f x6 ?7 n9 Y% L( V( w7 G( C2 I
图15 o( Z! l8 v* h6 q
7 J8 X* O; [3 @4 M* U1 }
3 S9 M7 z, F, P& m7 ~3 v
3 B# y. Q$ v% t( N; v! H: H图28 _. Q J7 d) W0 T! }
$ c) O$ f- W$ c' X3 n! @
然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:" ?7 `8 f. y& R1 }
2 |% @0 A1 B& B
! e: S$ b% _% Y5 J图3; q4 s! a& `6 H. U G# m% Z0 [
FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:# k$ p2 D/ m, e" W
; e) a% E2 g& z& {" W
4 x- U( G0 k- r0 B0 D3 Q5 E5 A* L图4/ }0 i8 m( _4 E; |) M7 \! M
使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:
; ?5 f8 O f$ O. T
* x! M. F$ J' a& v" H) }. P' L# n
4 m! |- J7 j) G, |
图5
: C. u$ H, J; x, ]& J: O, } 这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:
+ W2 m% J2 r4 V; k
/ G0 e+ ?% {) R7 M( ^2 W2 F* m- /* Prepare Tx message Header */
+ N5 W" v( R0 u" m% P6 U - txHeader.Identifier = Tx_ID;
+ p: d" S" K! `/ n - txHeader.IdType = FDCAN_STANDARD_ID;& u: U$ I5 S: o) E
- txHeader.TxFrameType = FDCAN_DATA_FRAME;
9 N( B; ~; r! Y2 Q1 e" S. G - txHeader.DataLength = FDCAN_DLC_BYTES_64;6 Q" o: N; W+ T5 {! Q' z( d; o
- txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
/ G* J1 }( o9 M" q3 |# S4 @5 E" G - txHeader.BitRateSwitch = FDCAN_BRS_ON;
d+ H5 v6 u* w0 I o1 e - txHeader.FDFormat = FDCAN_FD_CAN;, U4 j2 L; `, c% T+ n0 w" e) Q) R4 z+ ~% u
- txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;% R. P% z2 u. @2 z. ]+ r2 U
- txHeader.MessageMarker = 0U;
; w. [& V ~$ }; _ - ' |, j+ u- z- ]0 J2 e" L
- /**
5 }7 T5 M5 t* D# i4 A3 v9 l" o - * Configure and enable Tx Delay Compensation, required for BRS mode.
8 o2 V; p$ s1 f4 h8 j - * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler! K3 N! J/ ?/ w+ X
- * TdcFilter default recommended value: 0+ A* `/ ?2 g' d- B& i" O1 s+ E
- */ G5 R( Q5 v! a# {0 B+ J! C# w
- if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,0 F% |2 q6 q& e, s" g1 }0 ~- d" `
- (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK)' d3 \( y( U& o4 Z* I3 Y* J: Q
- {
. _; g4 q* M% k% h9 C& U - Error_Handler();$ r; h( j0 J0 z
- }
5 X5 A8 h9 u- Z3 H: D% K! N0 s# M/ B
* ?2 h& ]4 |9 S( W- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)/ m0 c$ B, D0 f6 U, o1 |
- {* R5 K: m% m+ N# h1 @8 t2 Z
- Error_Handler();
: ?8 L/ Q8 R4 E; u8 t6 y - }: ~1 \" N# g$ E7 s$ ?' y
- 3 V/ r$ k; _ X
- /* Start FDCAN controller */! |* z" R- H3 \% B4 }" t X
- if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)/ L3 N5 w4 m* r6 i
- {
% y/ G1 J+ _* ~2 a - Error_Handler();
% R) I* H" g; f6 A9 `" G - }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs). R7 }* |# l3 r; T! ]- Y
- {- U) v3 N) M; b: v" T% L
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)
4 \* a. U. {/ j+ A - {+ |' p! u8 i6 R- B0 }
- /* Retrieve Rx messages from RX FIFO0 */
" V9 t S0 y# Y( L - if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK)- I, ?- P ]1 Y" S& U; }9 p6 T
- {# d- p, H s8 i, U! O7 g
- Error_Handler();' y; s" t$ Y) n, |8 f3 P7 f
- }
$ Q- Y& [2 ]+ i" E: J' _
8 y/ c' i: T9 a: g2 w4 v( B. x- /* Compare received RX message to expected data. Ignore if not matching. */4 U, B' {4 ?7 Q+ T
- if ((rxHeader.Identifier == Rx_ID) &&9 J, T1 h' k: w5 L
- (rxHeader.IdType == FDCAN_STANDARD_ID) &&
4 `0 M# s8 O4 f1 q- M, ~* H - (rxHeader.DataLength == FDCAN_DLC_BYTES_64))
% i `6 ]( O8 k5 R; Z7 M - {
& |, E; |9 W& m7 c - ! o& y+ N1 S% E& n
- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);! T: _/ s$ c7 k- V, B" H
- }
3 K5 N) y4 E0 F8 ]; |8 k - }- o5 x9 Z( |. b3 I
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)
6 \: n. ]) ^9 n - {# }. |: [3 J. C* I; b) H1 ~
- Error_Handler();+ y) F9 [, Q( L) ^) \
- }& z/ J2 Y- k9 ?. T/ P* c
- # q( H& x# E' `4 K: T6 F
- /* Delay for simple button debounce */
1 z; f$ O8 k) R0 D/ ?% B) y7 ] - HAL_Delay(1000U);
复制代码 |