% I; a7 T$ U9 |$ P/ ?5 G
收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。
1 t1 {5 d- l- v! f$ n/ C! ]; F 首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:' k5 S1 J& e4 s1 s8 G4 ]" [- |
j3 N* i" Z7 G2 m6 I7 `
$ i+ ^- R- b4 J* r3 p图1
' O! ]) K6 j6 s0 z4 G
0 _( v( e& x( u H: |
% n9 a2 N! ^6 `
' r- D7 r- |; A3 Z: w图2
& |/ j: E7 G. ?% d+ f% o% L# O3 ~8 x9 z
然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:0 t( a- n& t0 I+ O/ n3 s: T8 E
$ y+ V E( s) \/ _! e
) p S. i$ z0 l( W0 D( U图3: X1 ^3 T$ V6 P5 V' H2 i
FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:
* n1 V* ~4 h( b( R1 M; ^/ ^9 ^
7 @3 {+ b6 k/ C/ V. h% p/ d: c2 U" U" d' p
图4: a( V1 H" P, K
使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:
, G; {/ ]- q1 m, G
& M$ ~. s$ m, j- \" \6 |
, w/ B7 X1 J5 X图5) m+ [6 A& d" m V# ?- J3 G! c
这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:3 m. g# m( j9 L! ? H) d0 o
' b2 a; b5 U* k. ~
- /* Prepare Tx message Header */: l6 F5 B; j' {% }6 T# H
- txHeader.Identifier = Tx_ID;" j" |5 g" K/ M0 E9 e* g% |8 X
- txHeader.IdType = FDCAN_STANDARD_ID; q4 c' p5 p) {; J' t0 R
- txHeader.TxFrameType = FDCAN_DATA_FRAME;
1 r" G* U& K. u' w - txHeader.DataLength = FDCAN_DLC_BYTES_64;
$ M% g a" y, B- s3 a - txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;6 L4 L' x5 U6 `
- txHeader.BitRateSwitch = FDCAN_BRS_ON;, M1 E& h% N$ W/ t
- txHeader.FDFormat = FDCAN_FD_CAN;
4 P$ b1 e4 ]* ?( W1 s4 f: @ - txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
/ @4 k2 x% g5 c - txHeader.MessageMarker = 0U;
3 C# D; g! U- B. j# N - & e0 L$ O. p' w+ L! u9 O9 p; B5 w
- /**
2 a% J" W" I ~: k5 H( E0 n* P - * Configure and enable Tx Delay Compensation, required for BRS mode.
( P/ B2 [1 w% ]$ l' s - * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler7 Z' z5 Q( ]* I$ j% H0 y4 T
- * TdcFilter default recommended value: 0
2 N6 K3 d/ s4 h) q6 |0 X - */
d9 P7 p( A9 \ - if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,
4 X4 T9 A* B' {8 W4 F) ^$ J Y' i) l - (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK); L& L; y `/ Q& _0 M
- {
# s) j( y: @5 R: ]& i: V, w - Error_Handler();
+ N% t- P, S$ M6 p5 e2 q; v) C - }4 W- ?1 j+ V5 O) s! y
9 c* p* [* B: }$ X5 G3 O- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)4 X" W x, h# B9 R W8 |
- {3 u/ R0 }# e7 q( _
- Error_Handler();
% c8 z" q; G6 i- x: k - }
# e. @# @: h6 Y" f. P( L - 9 p1 y, m$ p! L
- /* Start FDCAN controller */
1 B- I! l3 b8 A+ t& {- \ - if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)
4 ]; q8 b x: |& Q/ z - {
% \. U- R3 d% D% o: ~ - Error_Handler();
- H* b- h, e. R - }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
, ~0 x: ?2 ~6 X$ X - {
3 m! x5 @, }% y4 } a - if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)
# A: Z: _' a4 l$ g5 O8 i - {3 g; V0 s$ w# t5 e6 |$ h6 Z
- /* Retrieve Rx messages from RX FIFO0 */
. y3 J$ w5 G& Y/ `2 A - if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK)4 W8 n, J/ j; n2 |& B3 I0 [9 u9 s
- {* X, D) o7 Z4 C/ W# [( b
- Error_Handler();
0 p: L i# B& G( a [ - }2 B, N6 O3 M* l5 @- Y& R
- 5 C' h! z# k: @0 U% d0 F& K7 |
- /* Compare received RX message to expected data. Ignore if not matching. */
9 Y4 w# q0 ^! G2 M, o# A4 c" D - if ((rxHeader.Identifier == Rx_ID) &&
! z" P& r: `3 P5 |# c - (rxHeader.IdType == FDCAN_STANDARD_ID) &&
- t, f: |" l, a# ~! ` - (rxHeader.DataLength == FDCAN_DLC_BYTES_64))
+ e; W; n5 ?9 K4 h+ b" C - {
" f- E" { m9 t/ n! m; s
$ J# R2 C5 F; \$ U0 c- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);
1 q, w! n3 F W - }5 H. N/ t* j& N' E, T( ~
- }4 }* j% n, N- G. C
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)
) {7 n9 o! r( V# f" _3 d+ t/ c, G - {$ I& z) Z# c8 L
- Error_Handler();
: K: d! w* [0 r% U - }
: b. _. |2 f# ?
8 Z) d- t1 S" d" ?% r- /* Delay for simple button debounce */, X" L" M( K" j$ u: }5 X
- HAL_Delay(1000U);
复制代码 |