- _1 ^1 T- ~. G/ n/ y6 m# V
本次测试FDCAN通讯,STM32U3是带FDCAN外设的,功能还是挺强大的。这个外设也是现在项目中常用的通讯方式。/ o. L; _( F3 _4 j
通信芯片使用的是自制的TJA1462 模块,这样使用杜邦线连接到FDCAN测试仪,连接到电脑上位机上,就可以进行测试了。
; X* U# l: [/ b+ n 整体连接图如图1所示:, N- u. ]0 X6 b$ A! g
8 g8 D5 R# _5 C! b0 M图1& Y5 J, ^' o6 X/ }
CubeMx 配置如图2所示:
9 }' S0 I4 _6 d/ P7 v1 _, l
$ l! ?$ F& ~' ?! X2 F; h- V4 c图2' c! s8 y. y( A
! U3 Q1 a0 C) b, `) P7 ~ FDCAN 配置为 Nominal 帧设置为1Mbps,而数据帧设置为2Mbps,数据选择64个字节。然后生成项目框架。
9 m. ~2 M( Z) b2 m+ j
% X+ P! V( L! |2 o6 [0 x 修改一下程序的发送和接收中断程序,程序配置如下所示:
: X; T% m) _) E4 T6 j" N. Z- /* Configure Rx filter */" L. y, f8 k9 D5 Z
- sFilterConfig.IdType = FDCAN_STANDARD_ID;
$ y4 L/ S' B4 c, p: |1 N t - sFilterConfig.FilterIndex = 0;
, P9 W" A/ G# o- N% ^ - sFilterConfig.FilterType = FDCAN_FILTER_MASK; D/ y/ q0 o8 K& w, c
- sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;: _( y2 g5 H" }! c2 T i: M0 x5 L) B
- sFilterConfig.FilterID1 = 0x123;//receive ID
- C; u8 }; p6 v7 g- r/ `) D) _, _ - sFilterConfig.FilterID2 = 0x7FF;& H2 `# e, ~# X7 j) O
- if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
; _" I( g$ y" g' u1 c7 E - {; {6 h# b" O* K H) N! Q1 F
- Error_Handler();' I/ H5 x% e. s, R! G
- }
+ J+ H, y, ^! k5 F. l
% K3 @7 s9 R2 Y' e; o- /* Configure global filter:
2 D9 m3 S4 I' r$ G3 ? ~( z0 J - Filter all remote frames with STD and EXT ID/ z, k/ m' g1 w& _$ I3 p$ K
- Reject non matching frames with STD ID and EXT ID */, W5 W" W" ~4 h3 O7 j0 p$ r0 |
- if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
0 r* D# L/ ^% X9 M/ w: G) ]: K - {
5 [+ O1 [2 y7 X( @1 ]$ e/ f - Error_Handler();
! X+ d/ {2 u1 X! m& w' [& T# z - }! W' P" L& h* Y [5 U5 h( r
& f0 t7 i* N; o7 [* y& k- /* Start the FDCAN module */
9 G; J# p6 E6 b$ y8 r3 G - if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)# l, q* a1 t; M% V' E; a: u$ q
- {' G) D. M, j* i. S$ T n
- Error_Handler();
4 d' e$ i$ z, a( _, \, ]1 U - }6 @* J, v! |/ g1 H M
- ; W" V) Z. F& k( H9 {% C0 p) g% ~' N
- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)9 `+ x/ f- X* M7 j3 l, a! [
- {8 c' _" @; J4 a
- Error_Handler();
: l& j( ~; J6 w% I2 c" F - }
! h/ d" d$ Q' l" \ - 5 o0 X/ O5 S: s3 j. u9 V$ ~4 P+ a
- /* Prepare Tx Header */
4 h9 X# e+ G* G+ T! |) O' A - TxHeader.Identifier = 0x321;4 V5 W! D0 l2 E L+ H w* ^7 _3 O9 G
- TxHeader.IdType = FDCAN_STANDARD_ID;
. C+ w+ t' v- |6 }6 b; n- A - TxHeader.TxFrameType = FDCAN_DATA_FRAME;0 } C. M2 h: I* d
- TxHeader.DataLength = FDCAN_DLC_BYTES_64;//FDCAN_DLC_BYTES_8;/ g- V- p) x' B
- TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
9 a+ [/ e* |1 W8 F* c - TxHeader.BitRateSwitch = FDCAN_BRS_ON;# Y! d# @+ t0 l8 S
- TxHeader.FDFormat = FDCAN_FD_CAN;//FDCAN_CLASSIC_CAN;
5 e" h0 a C5 t8 m$ A7 \ - TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;0 `! W9 }0 n [8 @! Z9 i
- TxHeader.MessageMarker = 0;
复制代码 ) P7 ~6 m1 T7 ]4 N( q8 v
( J( {1 t7 z1 g/ z) ?2 X5 V 编译,Debug,通过上位机观看测试数据,接收数据如图3所示:5 A4 c7 Q( v* m; z* a) p
3 {! I1 b- [3 |- w2 n; Q; U% z0 _
图3
7 h5 Y" b8 U( \7 d( y: v 发送数据如图4所示:# O$ d; ]9 `2 r
1 b# ]! ?8 X# Z2 }$ p0 @: o8 `图45 ?( }" B5 o6 E* R: I5 J9 i0 i3 Z
经过测试,发送和接收正常,调试5Mbps的时候,数据不能连接上,应该是杜邦线的问题。
% {: v M1 Y3 }; ^' u+ i, i" M: q |