# H7 [( d& t" h& r 收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。
: k$ M' Y) ?) @0 C( C) X5 u 首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:
5 R* k! f, t/ C9 G# ^
8 F. n ]. @- n+ D
3 ~7 F3 ~; [6 [
图1
* w7 |4 N$ o5 t& U& N1 d) }
_) {% D @! r( l X
1 h( g' l. | ]- p* W5 s! F& {* ?3 Z4 G. e/ ^; r
图2
; v0 j7 R; X& |# b' V
/ Y R0 B/ N3 D% H% C! h0 a" L, k 然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:, L) D+ U b |$ M% Z5 D. h2 h5 \, X
, Z8 H5 k8 i7 N2 h! L1 {( L
3 W' G. C! `4 d) B9 E/ X6 z图32 P% `' O& G, G) a+ Z
FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:
" z0 z: H7 N# `' i
# N' L$ \8 C+ s" X/ b0 o
0 T( K2 `6 M9 o W0 U图4, G" Y6 ~: p4 W8 d+ \9 b4 k; b
使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:- Q* `$ U! \8 J- z1 g5 r
1 G* t6 \- D( P J6 m; \$ N- p& E- ~2 d: K6 X3 s1 {; g: R0 y
图5) T2 a+ f/ [& y
这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:
. T5 k. i, i2 L- u 2 L: T, V' V: Y
- /* Prepare Tx message Header */
) D% N: t" }8 I Y( P- W6 d( ^ - txHeader.Identifier = Tx_ID;
# G& a* f3 ]% g6 g1 o; S# L - txHeader.IdType = FDCAN_STANDARD_ID;
& R/ F2 e D2 B - txHeader.TxFrameType = FDCAN_DATA_FRAME;6 f( I+ j6 Y0 v
- txHeader.DataLength = FDCAN_DLC_BYTES_64;9 H, X$ q, m$ V8 p0 w4 h& F
- txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
) V- l5 h7 P4 w. y( P - txHeader.BitRateSwitch = FDCAN_BRS_ON;
1 C$ k" i+ c6 ]9 U% N - txHeader.FDFormat = FDCAN_FD_CAN;9 c1 K2 I; `' S9 b+ z g$ G
- txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
$ n# r: b4 ? v) |# Y5 P - txHeader.MessageMarker = 0U;
4 u; Y9 i$ g- ~+ q9 a4 _6 M0 G
- a5 `2 F8 e4 `- /**' @" T1 z: {1 t2 { x! N; C e% [0 l
- * Configure and enable Tx Delay Compensation, required for BRS mode.
4 _" p) i2 d# o# n% M2 x0 W: A6 w" b - * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler
8 a# o5 h2 r L, U* M4 x - * TdcFilter default recommended value: 0
1 o+ [ F) y0 N1 {6 p6 f4 @ - */
8 Q* t- |, S; S3 L - if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,! [/ }1 r# z8 M; g5 _7 B5 B
- (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK)1 u7 W8 T) _* w
- {0 d# r# N/ E8 A: Z2 f+ S' ^
- Error_Handler();1 A5 ?; }$ F5 u0 M3 j
- }! `5 d4 N: y8 T2 W K# Q+ O! _
- , o( p$ M( O! ^- M9 h: [
- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)
3 y; J- F2 T6 Q+ _9 [ - {* ?8 c6 f, l) A8 K) c9 m
- Error_Handler();
0 q* q# q* f* Q( c# f6 [& A - }' U/ K9 a5 \$ y0 b8 _; e/ S
. f/ z- s1 Z; t" l n z4 \- /* Start FDCAN controller */
4 q# b# j u6 I2 d @9 j9 P - if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)4 h. S6 {9 T. v1 r0 c& J5 A% f" l! Y
- {2 m! K0 F! Y% Y3 C c) |4 o+ S; v" K
- Error_Handler();9 F9 R. v/ _/ J$ i7 e: U6 l) q* R
- }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)' H0 W3 V# J* D4 A8 Z, C- u! N1 N9 _
- {9 s7 |# N( A* n/ ~
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)' m5 L! u! Z% e$ t9 E
- {0 p1 B" \( t) i) u9 e2 L+ K0 P
- /* Retrieve Rx messages from RX FIFO0 *// j1 j# [0 r: {- S8 c
- if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK), i, R# i( g) u' O8 l% l: B
- {! z: T) x- ~3 F( r# o1 q0 ^: E* k! `
- Error_Handler();4 P8 C3 ` ?7 t" `/ X
- }
" [; S) i" o: f3 d O - 8 [' P3 Q. C" |% ^2 r( X
- /* Compare received RX message to expected data. Ignore if not matching. */
9 [" k0 B+ i X% A2 ~ - if ((rxHeader.Identifier == Rx_ID) &&
4 w0 a( L* C) @5 B: L - (rxHeader.IdType == FDCAN_STANDARD_ID) &&
4 ]$ R6 L' H0 k. S - (rxHeader.DataLength == FDCAN_DLC_BYTES_64))% Z9 u% g% T6 k
- {# w- E% D3 k7 U! {3 U9 k3 y8 l
- u/ m5 K: J1 @, |- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);
, H" o7 ~, E3 @ - }6 m6 L; C2 h3 ^, F T W
- }5 {. D0 b: V! e( C2 Z9 K
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)8 \' a: Q' b+ k3 y5 p
- {
) O1 {- d* |9 b$ j/ Z - Error_Handler();
, g `8 E) l0 a# N. c - }
! t/ A- j6 S/ _- E
$ n: s9 x+ ^: O4 Q3 m- v- /* Delay for simple button debounce */
! Z I# i8 H0 N( c5 G* U; F- D - HAL_Delay(1000U);
复制代码 |