AutoRetransmission 设置为enable 可以防止通讯速度过快时丢包9 i. s& [$ @2 T8 Y' D: V; P3 M, R
+ h; T; Q- U; Y* `. t" [6 c0 f( a1 }6 i% S& z4 x
下图所示的TxBuffersNbr 和 TxFifoQueueElmtsNbr 貌似是共享32个地址的,两者加起来不能超过32
9 k) _3 `. h) Y# [% z8 N7 }- N, S( n! s
* u# s! w- E6 r/ f8 Q9 {0 i) Q9 E' \% l* I
1.设置硬件参数(引脚,时钟)
& z% |; T$ }- b, I+ S7 {/ ^" C1.1 启用FDCAN1,并设置参数( z. A( i2 N. ?# u* Z/ K0 {
启用FDCAN后参数设置如下: v# Y5 O$ R7 ? Z% b9 K0 E
设置FDCAN引脚,手头板子tx rx分别为PH13 PI9
4 s# Z3 G5 _5 t" o6 j' w+ f; R4 z# L0 f
6 J* Y0 e6 q- n9 g% B$ P( D5 ]/ p7 t; v \6 `; U+ \ b
设置参数& ^& I z$ l0 j6 `& E s: Q5 b
8 r0 r: _- [; u$ k
* w( g/ p/ a6 r1 V. q
# K. w1 i) r/ `' N- \9 o其中elmets Size因为采用classicmode 所以选用8bytes,注意 buffers nbr MP157rx和tx最多有32个buffer,offset貌似不设置也没事3 n/ a. Q3 t4 p5 h! u
) M0 a- F( o% s! V8 v# Z时钟设置
- H) T+ W' v: \2 I/ l
* t& o) v: z' m& t$ Z0 F, z2 L7 a
% N6 g9 V5 J& a+ z" r/ L2 s9 X0 @9 k$ H" }
1.2启用FDCAN" b4 G+ l; A! I+ k# n
首先可以设置过滤器,随后启动FDCAN
* n- }" t( g0 }
2 U! p! e& _" t* ~* c% I# w+ |- /*##-1 Configure the FDCAN filters ########################################*/ W L3 Y; ` z: O2 ^
- /* Configure standard ID reception filter to Rx FIFO 0 */# J8 m$ N: N- N3 ^
- sFilterConfig.IdType = FDCAN_STANDARD_ID;
! ~' m9 H4 M9 f; u - sFilterConfig.FilterIndex = 0;0 o8 D) d& E3 g) p* O
- sFilterConfig.FilterType = FDCAN_FILTER_MASK;1 ?. K9 M! M' i/ L; a
- sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
+ F: [9 z9 O( n; W8 @7 S - sFilterConfig.FilterID1 = 0x444;' N5 z' `; e% _6 L8 W6 s- j; y
- sFilterConfig.FilterID2 = 0x555;, e8 ?1 I& o1 O+ Y
- if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)5 @* O' v5 S! N) z; g ^% m9 ]
- {
, ^- E0 i, d# q! J e5 p/ g/ O' x - Error_Handler();
5 { V% W" }' k0 z. P0 R - }2 w/ u' c+ ] B% X/ o. Z
- * N. V! U4 ]* w
- /* Configure extended ID reception filter to Rx FIFO 1 */
+ I4 k* _* c: i/ O3 H - sFilterConfig.IdType = FDCAN_EXTENDED_ID;
. L7 r5 G2 m1 o7 V; Z, ` - sFilterConfig.FilterIndex = 0;' R+ f) {7 S% F3 Y( ` U
- sFilterConfig.FilterType = FDCAN_FILTER_MASK;* M, T; P; b7 }9 k2 @4 o2 p
- sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;) m# c2 v! P! Y8 E5 R# @6 {3 e
- sFilterConfig.FilterID1 = 0x1111111;0 m; ~' G% S( \/ G& G6 b
- sFilterConfig.FilterID2 = 0x2222222;
/ B9 J; u% d/ a) S - if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)& B) z4 F9 e0 E; x% j: w" U1 s$ X
- {2 Q2 U2 n7 H: t1 G. ^/ r- e
- Error_Handler();
# _2 ? [3 J! F, a$ X+ B - }
9 {8 q& a, J* E' j. X
3 v- T8 l+ `2 ~, s/ [- /*##-2 Start FDCAN controller (continuous listening CAN bus) ##############*/
, B5 J+ q N( n7 v/ |' ]" A: U - if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)- F: c6 ]8 B( H: Y
- {
$ Z/ S$ [6 c! Z# B: M - Error_Handler();
4 m, t1 ~& O2 I- L5 E! g3 Z) a - }
: Y( b2 S0 s! F& l. d( O6 z: I K - /* USER CODE END 2 */
复制代码
0 d. E% H8 g1 c- w6 L发送数据
" I5 e4 Q4 G; E3 m' S8 f. d( Y$ A. X$ y9 ~2 \' f- l
- /*##-3 Transmit messages ##################################################*/; V4 ?7 X) f% W7 E* l: ^ B4 A$ t. p
- /* Add message to Tx FIFO */. a/ U1 w# Z/ _1 }5 z
- TxHeader.Identifier = 0x444;% t/ Q3 T+ \; J0 X
- TxHeader.IdType = FDCAN_STANDARD_ID;
7 E6 m# `7 n1 P, N - TxHeader.TxFrameType = FDCAN_DATA_FRAME;* |% E! N' Y. S
- TxHeader.DataLength = FDCAN_DLC_BYTES_8;
, d$ g: v1 I* q - TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;: U F7 B* s7 q! ~/ y0 y) U: e; w
- TxHeader.BitRateSwitch = FDCAN_BRS_ON;/ R3 `& \( V3 N3 J
- TxHeader.FDFormat = FDCAN_FD_CAN;9 C& ^3 G6 Z( ^1 P8 `
- TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
# D$ @( v, k( m$ z3 @+ X - TxHeader.MessageMarker = 0x52;
3 j! i `9 n* T; C! e) t6 f, m; ? - if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData0) != HAL_OK)
/ Y$ a& Z. D% a6 |# e% X - {
$ W$ G' l* |( }5 _ C0 A - Error_Handler();
# ^7 k) S0 y# b! [ - }
复制代码
2 \8 h! \( e& V* |0 b等待发送完成 e1 u5 B5 c: m# r: o5 k
2 @0 z3 U' A6 O2 L- ?' A% K- /* Check transmission occurred before timeout */' ]; q: S& y% ~ b, F
- while(HAL_FDCAN_IsTxBufferMessagePending(&hfdcan1, FDCAN_TX_BUFFER0 | FDCAN_TX_BUFFER1 | FDCAN_TX_BUFFER2) != 0)2 j( P; b) Z1 B
- {: v- g f& a% R
- if((HAL_GetTick() - Tickstart) > TX_FAST_TIMEOUT)+ ^9 `+ R; K3 m7 a7 t# k* t
- {
: s# v8 Y/ v5 L8 n c- d - Error_Handler();
1 [0 G3 j9 e. H5 q - break;$ k2 }5 B% n0 M
- }8 q2 T5 \8 z% N1 w; V( j2 ?" H
- }
复制代码
5 p; h; R$ f8 T/ A$ Q查询接收到的can数据$ J* V0 k& y# b0 q/ t' j
; w, Z3 d8 h4 o) b- while(HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO0) != 1)
* {6 y/ A( y" J( \& `3 r - {
0 W3 X0 r r1 K6 R. ~ - if((HAL_GetTick() - Tickstart) > RX_FAST_TIMEOUT)! I- l6 C8 J! A; h1 f6 k
- {
/ x- v7 K+ T; ~4 Z9 y - Error_Handler();5 ~: c k) t/ ^* W1 `- _ `
- break;8 m `( z1 S E' p4 D6 A
- }
3 b( H7 q: H3 {, v$ R' y& R - }
复制代码
& @- j; J5 H1 r- D获取数据3 U7 m; i+ D' B3 J7 P1 E
9 ?0 M% E. j) ]
- if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)' f& L! L# X$ m
- {% {" q0 o+ P( F
- Error_Handler();
2 i2 K6 F# h1 j - }
复制代码 # @' V$ P7 a1 r
————————————————& Q- n1 `3 K! n
版权声明:少侠来一本秘籍吧: N' o* h% b S/ E
1 h- |5 c& B+ P# k) X$ ~
6 C: K+ S0 s0 Z/ Z! s3 B
|