/ B% V1 I8 o; }& O: f1 @ 收到板卡,先点个灯,没什么问题就进入正式测试阶段。仔细阅读H533的Datasheet,是一款资源很丰富的MCU,发现其有两个FDCAN接口,这样就丰富了板卡通讯。这种总线通信方式当前使用的比较多,就先测试下这个外设功能。
" H4 f" G6 h7 ` 首先搭建测试硬件条件,使用板卡上的PB12和PB13作为通讯接口,连接到TJA1044 驱动芯片板卡上,按照datasheet对应上即可。如图1所示:/ f6 ]- r# E& l. |
8 t' {/ O% j& M5 z/ w/ U3 G
9 R# I$ l* T6 m2 t/ @" v* u1 C
图1
! Q/ a' T- A% r% Q1 @
9 B. H" `% W. }6 i0 v
$ k( f1 G) u+ j) f, a. e
7 R6 t6 H/ X# {% ]% v图23 j, k4 s" f' j7 m! Y, L' O0 b
/ p$ J+ R" z# b" p$ G
然后是使用Cubemx软件对MCU的时钟,外设等进行配置,并生成所需要的项目框架。时钟配置如图3所示:' h8 x( i: }( ~1 m2 u
$ N& y: X0 ~% j6 v* F
5 F* {) W: y) g: u5 Y图3
; r4 x" y3 ^8 @; F- S FDCAN的时钟使用24M,不倍频,波特率为1Mbps,数据波特率为2Mbps,外设的配置如图4所示:
6 ?9 \4 S Z' i+ S) c. i1 t
$ q. g5 `# H8 S$ s, Y' ~$ S. a( \" g% S& ^0 w4 \
图49 o6 ? b( I0 `4 Y0 n: r
使用板载的LED作为接收数据的指示灯,可在图上进行配置,如图5所示:; @, Q! J) A$ a. l* d
4 \) r4 q: ~6 y7 n
S0 @1 A: a! h8 U+ W; u% Z图53 J" o8 y# K3 u; a
这样配置完后,生成所需要的项目框架。编写接收和发送数据的初始化函数,如下所示:
0 f L$ @9 A/ V- `. _
% ~- H1 R2 X" [, i* ^4 L: S% K- /* Prepare Tx message Header */
( P; h1 o, _# F; b - txHeader.Identifier = Tx_ID;/ x, p& n. ` o, n* P4 _2 }9 z
- txHeader.IdType = FDCAN_STANDARD_ID;
6 ]2 {5 A0 a! Q' w - txHeader.TxFrameType = FDCAN_DATA_FRAME;
# D' k* j$ I8 }- P! R% l: O - txHeader.DataLength = FDCAN_DLC_BYTES_64;6 ~6 U( @/ U* Q
- txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
& }+ c+ t& F. [& m& p2 T3 O3 Q - txHeader.BitRateSwitch = FDCAN_BRS_ON;( Y3 K) t$ | m" k
- txHeader.FDFormat = FDCAN_FD_CAN;
* {- O- ^* i- X6 p& G3 Z# y* O - txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
$ e' [9 x4 v" P- L - txHeader.MessageMarker = 0U;* @ M" m6 s4 @9 q7 |5 i. t+ S8 {( t. r
- 4 y3 s3 F0 _1 ~' { I! w6 f+ y
- /**
5 o( ~ W7 J* E3 R$ G: T - * Configure and enable Tx Delay Compensation, required for BRS mode.0 ?( Y: H& z3 \, E
- * TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler
# Y% A" }! I7 p; y* J. ] G( F- | - * TdcFilter default recommended value: 0
9 J5 r' S' v, d, _ - */0 F( \* e+ r3 Q H; `
- if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan2,
0 \. W, C9 ?% R- ~5 u - (hfdcan2.Init.DataPrescaler * hfdcan2.Init.DataTimeSeg1), 0U) != HAL_OK)* J( \$ s" w9 W+ ?" M
- {
/ O% k" J' k9 y7 m, W8 C* x1 n - Error_Handler();
0 M0 U+ Q& V# z/ d - }
2 ?1 C, }# a2 [. I - $ w: _' w* t+ ]% S9 K7 I! L
- if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan2) != HAL_OK)1 Q; q% u/ q, n* v
- {
2 I; N7 b2 t+ ~; k - Error_Handler();& m6 E2 V5 { ^4 x9 X- }- E9 Z
- }
4 E, i& C: o* u* `8 C: ]7 m - - h8 w' ?" \4 }: A( p. j
- /* Start FDCAN controller */9 J+ s# H, B: B7 l d' ?
- if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)
! ~# n/ a& ~7 d D8 s - {# ]* j5 l% u; n4 \4 W3 H8 {4 n
- Error_Handler();3 q# Q8 k2 D- l) j
- }
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
' K8 _" T# F. I d# ] - {7 Q$ e$ o; w9 }$ D: ?
- if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0U)6 |2 c3 I; a/ `$ |5 w' d1 h
- {
* Q' R+ Y; Q; j7 k; T0 O - /* Retrieve Rx messages from RX FIFO0 */: I' y1 R: a# T3 G% `: Q
- if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK). ~$ l7 w1 Q6 U4 `/ {" n
- {) z8 `) h( G3 {; Y
- Error_Handler();
3 |, m( g" v% H- X - }
' S$ q7 L o7 R ~0 @
7 J# h, F. R$ Y- D6 Z- /* Compare received RX message to expected data. Ignore if not matching. */
6 V0 p5 W' J1 _# n4 v! j1 l - if ((rxHeader.Identifier == Rx_ID) &&
" q* k& p' B- e - (rxHeader.IdType == FDCAN_STANDARD_ID) &&) P- S- u( O+ f5 s" ^4 ? i' ?
- (rxHeader.DataLength == FDCAN_DLC_BYTES_64))
+ U$ k" _7 \1 E9 ] - {
" S5 D( v% `" G% }
: K* s2 A( X, g- HAL_GPIO_TogglePin (GPIOA,GPIO_PIN_5);6 I; p6 D1 `8 L( N* X1 I2 B2 N
- }
. O2 b' }* I6 t0 P k" m; m - }/ H0 Z4 n% p* h" v
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &txHeader, txData) != HAL_OK)
. h, u/ _/ r& O! i' I - {
! g/ o4 |) Z! ]3 m# i. B3 P0 M - Error_Handler();2 n/ x+ [6 U+ e( y. ^) m# f: T( k" D
- }
+ b. D! h" I1 Y* G
7 v9 u$ i' \9 D. u+ B+ i- /* Delay for simple button debounce */
i G$ X% w0 _. n5 s - HAL_Delay(1000U);
复制代码 |