0 D+ I' l' M& G, g2 K
收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。" s: W# e# P, p2 P8 v
首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:
( D4 K) g* O3 p
* K' F. @0 W4 c; D% X2 ?5 |& O3 B9 v
图1
7 r$ j3 Q- {8 _) a( G! D4 ^. Y: [7 X2 W0 T$ X* y! `2 l$ i2 n
2 ?9 l$ t- r; s y5 w' N; p
8 A; n# J* D4 G+ B6 ^8 i
图2
. Z& q; e6 _1 o8 y
; F! y8 \: B/ p* }# `0 b/ c 然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:& r9 o6 N; @0 `3 v4 a
6 a' h1 Q& z& z$ G* \! S) N( x- b2 S
图35 R4 A- d+ D$ `: p& I; P7 {
FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:
$ G, @# O* Z2 @
' Z& v5 Y/ Z$ [: C. G- L
7 K( Y0 _' Q# ~ X
图4. v3 a% J8 g+ i
使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:/ P+ C, [2 d2 F
K+ N; o$ G/ j; f* c v
2 t% D ]* @ ?+ H4 K3 ]6 H图5, ]5 S" c0 R% u1 n; A1 B
这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:
) r7 i3 o" C; W& C
5 K; V4 Y# B: R9 V. |- /* Prepare Tx message Header */
0 k" |1 j- p: d0 u - txHeader.Identifier = Tx_ID;9 v# Z& ?' _" c5 y$ _, h
- txHeader.IdType = FDCAN_STANDARD_ID;
! D* Y U- b5 A, ^- S& `0 r2 K - txHeader.TxFrameType = FDCAN_DATA_FRAME;% o* f o# T5 N# x- Z8 y& R3 n
- txHeader.DataLength = FDCAN_DLC_BYTES_64;' ^% |5 i( m# U# h
- txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
2 M7 V* ?% h+ s2 C ~ - txHeader.BitRateSwitch = FDCAN_BRS_ON;8 n+ ^' j$ Z) S1 U+ a* J" r2 O
- txHeader.FDFormat = FDCAN_FD_CAN;1 }2 F+ h. c( N# j
- txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
7 {2 V6 Q( X! i- ^5 {! J! M - txHeader.MessageMarker = 0U;
1 B9 Z$ W* p6 `% r2 B4 j+ @
, p( P8 H, [; X, e# P- /**- _2 t. Q. Z! D5 m5 j0 [
- * Configure and enable Tx Delay Compensation, required for BRS mode.
# C1 F6 h; m1 v6 ^& A2 N& v& Q - * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler
2 R- u8 X0 A1 ~3 J8 u' P2 V) s4 o - * TdcFilter default recommended value: 0
3 D6 H3 R; \" `# K - */4 U# | i3 d+ V0 _
- if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,' F+ p9 j3 r& v* Q7 Q
- (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK)- Z7 c; q5 c! m8 f
- {
* a6 f0 x; E/ L - Error_Handler();) ^* e5 u. v1 O- p+ t
- }' Q1 N6 e1 t' ]
" Q2 G; t, X: D" |1 v- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)
. t4 r; v" n/ O, E; Z - {' C, [& x/ J, @# m; g
- Error_Handler();
; |. l. p' \, W) @# I+ M - }1 N$ A1 T: t+ m
- f, F" w' ]5 X; j0 R- g& B- /* Start FDCAN controller */
f3 ?% {! T/ R3 J4 H$ j) x) F8 M - if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)- N4 `1 m- U# H3 s* ^- p- J. o
- {
6 l q! x6 }# ~) q0 M - Error_Handler();; D$ Q q2 f; W& l* e
- }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
2 P) j+ h* l5 {. L2 B; q - {
m( ~9 a- c+ ]( }7 D, z3 J" } - if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)- v8 Z0 ?$ U$ `( U
- {
+ A0 F( `* |& @, S - /* Retrieve Rx messages from RX FIFO0 */
8 J+ F$ z0 w5 ~" z# c - if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK)
* n8 ?; q) p4 k. O0 |) ^ - {6 {: _. u8 l* `* @3 y
- Error_Handler();
" |: s% y( J2 V8 L4 b; Y - }
. e4 C# _0 d: B5 m7 Q" p- r$ s
! f) A; Q5 g# X( Y' i- /* Compare received RX message to expected data. Ignore if not matching. */
8 @- W r+ G& c1 q( i: n - if ((rxHeader.Identifier == Rx_ID) &&
7 R* a* `) Q) g# F, W, q - (rxHeader.IdType == FDCAN_STANDARD_ID) &&. p/ n, v8 @4 H% ?
- (rxHeader.DataLength == FDCAN_DLC_BYTES_64))0 \4 s) V- ?* c9 v
- {$ ~, D6 j1 v w: e
- % I5 p3 |& _4 v7 z8 C! G
- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);' g9 ]; v& I, ?7 V" P1 d) g
- }0 N# e9 Z+ [) @' z+ v4 ~9 l
- }, ^) ?, G: J4 M) u3 i% u @
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)
* t- v" u* Y/ n8 {" [ - {
6 v: x- R0 c6 J) ~$ A: t6 n - Error_Handler();+ _! P6 r8 m3 i, \) C8 Q) I
- }# X' }& T! f0 c+ ]
- 8 N- ^7 X( B! E+ C9 |6 D
- /* Delay for simple button debounce */
- ?2 z, |2 ?: e1 k) U# J+ q - HAL_Delay(1000U);
复制代码 |