- n% G2 w* u! w; v4 G 收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。1 R4 x$ k7 `! ?& G* W
首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:" K$ O' h* Z3 Z" Z4 k4 }# w
$ Y; x* G1 y# t" {) ?+ l' d6 t5 y- g* o
图11 B" [7 b+ x- r
8 E: {7 B0 X6 D! A% C
`# H' |# b7 C* S u" ?
3 }$ Q: S; e0 y4 i" e: p8 q& g6 R图2# s, m, j- N9 e: W; @8 d
+ u E) _3 ?9 @- R+ Z/ D: V; U; h7 P
然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:
% e% b ]' X6 y: V
; ^: ?& V- E$ W4 k% t% J
, k3 l, m% n! D$ G' W' b$ F图3
* u" n' o: p+ @# e$ b FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:& X1 R% N# q& y6 {8 ]; T$ F; _2 S
9 D8 d& s6 v! W4 }$ d6 P# Q
5 F* Q( ~! M A: p) E图4
0 h% C8 u8 f, m9 h& ^9 {& U- \ 使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:8 a3 y. }9 F! Q9 L0 [ K/ Y
( A1 {* e) M7 K- [/ L
; X0 ], S; t# k, g: |图5" T5 z1 {- I" F
这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:. j( A& \1 ~; F
/ g5 n* m0 r" A' l6 k; j& Y
- /* Prepare Tx message Header */
9 ~) b8 K# f2 r( {, @$ N - txHeader.Identifier = Tx_ID;
* n0 M3 o2 _$ N) t! n% `; E - txHeader.IdType = FDCAN_STANDARD_ID; C6 Q k! j9 q7 j' ]' P" x
- txHeader.TxFrameType = FDCAN_DATA_FRAME;; y) `2 @9 a+ a1 A
- txHeader.DataLength = FDCAN_DLC_BYTES_64;
! t. i7 B7 j3 N - txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
- Z, @* J7 y8 ?5 V1 k. M7 o6 ^. F z - txHeader.BitRateSwitch = FDCAN_BRS_ON;
9 c3 |+ ^+ x+ k" C' r3 Z - txHeader.FDFormat = FDCAN_FD_CAN;. p+ u) z: h! o
- txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;0 o/ P4 ^' [3 X, G6 ?) K
- txHeader.MessageMarker = 0U;
4 p3 K9 |8 p6 j1 d; [7 F1 h
; y# s) N9 Z$ d2 s- /**6 ~+ E6 K: e- ]$ D
- * Configure and enable Tx Delay Compensation, required for BRS mode.
) c" s/ h% S; z! m - * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler
1 O4 a: {/ Z# F b6 o, N) L - * TdcFilter default recommended value: 0; y, h( }+ P2 r
- */2 |5 g0 I( y; m) q8 l5 _
- if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,
! u; W3 K# P3 W. Y% s3 W, G - (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK); m0 b6 j6 l8 S
- {
# I7 t: S* }7 I - Error_Handler();
9 y. a; C8 R' @6 \& _ - }
* V+ L- f0 z6 Y) F - ; a+ z0 U3 p8 t
- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)( o0 ~# h- s. s; v+ l! F1 P
- {
) ^, f0 ~; `9 n U7 \5 \ - Error_Handler(); {9 M3 ]# A& Z0 |7 h
- }: w# v& b! Z c3 {! S
7 \) Z. y* r) b# o" `* R- /* Start FDCAN controller */" x" }; `% S+ \: f0 U( Q2 ~
- if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)4 g$ P9 E3 P3 h6 D; P _, |
- {
& ^0 t9 k+ l W; [5 c K2 V - Error_Handler();, t$ S3 X" Z# M. ^' p6 I0 e
- }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)5 [. j! ^6 A$ ~
- {* z" v* c3 ~ ~& Z7 N) x
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)
! L5 i& _' R+ U - {
4 J$ f4 P' i* N( v3 Z - /* Retrieve Rx messages from RX FIFO0 */# h2 u% l. e0 h- @) ~' `. i0 s
- if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK)6 O: i0 A' F* H- }% ^- U
- {: i9 {; k& e9 T6 }
- Error_Handler();
" M9 I) Q, K8 h - }7 v" J! F, Z _$ G. I. D7 m
) W+ G( _( [* A R- /* Compare received RX message to expected data. Ignore if not matching. */
' j7 Z F' i* m" l, f7 m0 x - if ((rxHeader.Identifier == Rx_ID) &&+ a" F! U( W! }( o
- (rxHeader.IdType == FDCAN_STANDARD_ID) &&7 l+ z! h, c3 N" |% q* l% l/ U2 w
- (rxHeader.DataLength == FDCAN_DLC_BYTES_64))4 ^; C4 A' _1 ?4 @
- {9 S" B1 M* A2 h* P& \
' i1 p4 R% H: y5 w, U3 G# N0 M8 C/ Q: E& e- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);
, Q, s8 {+ Q5 p& i L! v5 E1 [ - }
! W, v7 f8 n: c. s - }6 t8 H( u9 B' Z/ x1 C6 V
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)' Y* f. x1 b6 s
- {
% N* z0 V5 f+ { - Error_Handler();
* o4 A/ U1 j' Z3 d- s4 ]6 A7 ] - }" ^5 \8 H5 D/ C; G
- : G' A$ [: ]9 {1 G4 d
- /* Delay for simple button debounce */8 Q, X& k) [8 L0 ~3 p A2 J8 s3 {8 [
- HAL_Delay(1000U);
复制代码 |