AutoRetransmission 设置为enable 可以防止通讯速度过快时丢包
" n" G( X8 W* X& r1 }
, U1 h M( A; ?9 p. G
6 F4 J- \- M" k/ L9 _+ m
下图所示的TxBuffersNbr 和 TxFifoQueueElmtsNbr 貌似是共享32个地址的,两者加起来不能超过328 A- Z7 U5 H4 p
6 e+ q+ M: i# A$ W, y( V$ f
+ z# H- j) G+ f3 o8 y& d) s
5 Y* q3 C0 K8 g1 P& S) v' ?, u1.设置硬件参数(引脚,时钟)
* s' [: j. _# A4 f8 j; G+ E1.1 启用FDCAN1,并设置参数
) Z! m) _8 W2 ]+ Z( K/ ]4 D8 @- k4 l' g启用FDCAN后参数设置如下:. F9 q2 t5 T- u) X# l$ I5 F4 _; P. }. ]
设置FDCAN引脚,手头板子tx rx分别为PH13 PI94 P: z3 F6 T/ G. D% @4 ^
/ ~) y# |5 l- h6 w
+ D+ y1 R( S5 j, D. }
z S' e" Q5 E1 W; b# B设置参数5 F6 Q. l" d- O1 s
- L& D1 y8 H2 s8 ?& Q
# w) B0 E8 ^' n7 C- b" G
! q9 a4 h' P8 N' `) u' \其中elmets Size因为采用classicmode 所以选用8bytes,注意 buffers nbr MP157rx和tx最多有32个buffer,offset貌似不设置也没事, \% J) h1 C( v4 Q+ J% x, R3 S
2 N& |4 ~8 |7 X8 B0 R" b时钟设置! t3 p0 k \- c$ |
- L/ X* S% M, q7 `5 P3 Y. _: {2 S8 A2 s
$ p, `: {1 k) a; [' E2 H3 G0 |; n5 u9 ?( h$ }& k4 Q! n* U" j
1.2启用FDCAN
/ o6 W! e- m4 j2 v0 f. ?2 Q首先可以设置过滤器,随后启动FDCAN
5 E- U6 J9 A! j0 `) r' r* ]& \5 p. M: \1 P; Z9 Q
- /*##-1 Configure the FDCAN filters ########################################*/
( f; O* @0 b* U. j& w5 r - /* Configure standard ID reception filter to Rx FIFO 0 */
2 V; N0 D7 L+ f0 A5 G6 Y4 D - sFilterConfig.IdType = FDCAN_STANDARD_ID;0 d" L; y) n4 O5 G+ g; W- ]
- sFilterConfig.FilterIndex = 0;% c; K* }% _4 H9 z" b
- sFilterConfig.FilterType = FDCAN_FILTER_MASK;
1 S9 |! S9 @1 p& L - sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;( g: [/ T- m! q# q5 o$ Z% G7 p) X
- sFilterConfig.FilterID1 = 0x444;5 Y: S$ R$ C0 s. f5 I
- sFilterConfig.FilterID2 = 0x555;
8 j- z2 X: t: @- l9 u' `6 P F - if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
0 f9 J% a. X1 C0 q$ j* ^ - {" d+ {" L0 @9 l$ S" u: f3 ^
- Error_Handler();
3 h3 P" g; A! W - }
8 v2 }; K! U J: R$ b - + L- I2 B: L1 w6 k0 Y" M
- /* Configure extended ID reception filter to Rx FIFO 1 */
3 E5 p- T& t8 i2 v - sFilterConfig.IdType = FDCAN_EXTENDED_ID;, B% ?$ Q I, X" j" }
- sFilterConfig.FilterIndex = 0;0 i* v# h# X6 }+ J
- sFilterConfig.FilterType = FDCAN_FILTER_MASK;
4 c: i" `# M) I; x1 S2 t+ G( S - sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;! I1 A* e. ^2 y ^9 Q
- sFilterConfig.FilterID1 = 0x1111111;4 Z N. c# E ~) X3 b0 r
- sFilterConfig.FilterID2 = 0x2222222;0 l; x1 L& i; h
- if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK) n" P, a; S0 V* z4 r3 j! k
- {9 b7 z% O3 X1 F* o
- Error_Handler();- W/ F- k5 ^% f, o
- }8 i# s6 O! Z M& g0 g
. \1 a* i- Q. _- /*##-2 Start FDCAN controller (continuous listening CAN bus) ##############*/0 W/ N5 C( S4 E$ U
- if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)6 S5 P: Z: r& ]
- {6 U3 u3 |( |6 F4 A( }' q6 F
- Error_Handler();
. F9 T& Y- f/ w8 f$ x# [0 w3 v - }
j( M* A+ k1 @! y. ] - /* USER CODE END 2 */
复制代码 . v7 |/ k* Y" Y" e0 r/ x
发送数据9 v! o/ n2 B. Q" R) \7 n7 v
' Q2 `. J6 E7 \3 k8 m- /*##-3 Transmit messages ##################################################*/, M$ T4 s) ]6 ~
- /* Add message to Tx FIFO */. t4 [$ C; Q# i% X- R* x
- TxHeader.Identifier = 0x444;
5 E- ^# i3 D4 v' k - TxHeader.IdType = FDCAN_STANDARD_ID;, }! q8 r& k' V7 ` i, ?5 `* u
- TxHeader.TxFrameType = FDCAN_DATA_FRAME;+ [3 v$ K8 C# w& K6 v
- TxHeader.DataLength = FDCAN_DLC_BYTES_8;6 i2 Q& G% y6 ~% G3 K
- TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
\: T1 f9 S' K# w - TxHeader.BitRateSwitch = FDCAN_BRS_ON;
& C5 }4 i% T, [7 F - TxHeader.FDFormat = FDCAN_FD_CAN;
/ L: U8 Y; q2 f - TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
, `1 X7 M3 q! l - TxHeader.MessageMarker = 0x52;6 Q: d! d0 i2 u) Z, _ n( O7 ~
- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData0) != HAL_OK)
* A- G' q$ X6 h0 ~$ S7 Q3 `3 r5 U+ |6 a6 V - {
9 p* c c9 w! l( Q - Error_Handler();
: X* F2 n6 g0 x$ j* K* U4 h E - }
复制代码
3 h3 D* {; }, V' |8 M' N等待发送完成5 Y, J9 N3 n9 e# ?6 @: ^
# ^/ Q+ J0 ^$ ]% W& K+ I. t$ ?3 s) k- /* Check transmission occurred before timeout */4 d9 [& ?2 |: }6 n
- while(HAL_FDCAN_IsTxBufferMessagePending(&hfdcan1, FDCAN_TX_BUFFER0 | FDCAN_TX_BUFFER1 | FDCAN_TX_BUFFER2) != 0)1 d \& S S" b+ D
- {, U7 V! N! t$ V7 o# D/ [5 n
- if((HAL_GetTick() - Tickstart) > TX_FAST_TIMEOUT)
8 V2 Y+ O" P6 ]# J0 m& G" I - {
) B: o8 ] u4 _; o: _ - Error_Handler();
. q+ C r4 k4 j5 s: W5 j [ W - break;
2 Q I: l% {% L1 b8 T - } B J6 O" k- c$ D# O+ \: ]1 f
- }
复制代码 " Y; Z" m6 Y6 E/ `
查询接收到的can数据
9 ~& X% y( X( Q/ g3 s, ^4 ?( b; _- L- a% h# ?+ L3 g
- while(HAL_FDCAN_GetRxFifoFillLevel(&hfdcan1, FDCAN_RX_FIFO0) != 1)3 K$ @' a5 n1 e+ F% d# O# L
- {
* E( j s8 P9 \* n: ] - if((HAL_GetTick() - Tickstart) > RX_FAST_TIMEOUT)
6 Q4 ]0 I' R# \) U/ F5 d. L* o: p - {
! z; c& U) G1 }3 w4 x, a - Error_Handler();$ u4 `/ w) U" P
- break;
. o1 D8 L2 S3 Q y3 { - }
$ R& N; ~# w# d# I+ T- w! l6 @5 S - }
复制代码 0 I2 i' K# C( `. @: A
获取数据, l" ^! ~: a$ Q- W7 ?+ N! v
" s% T7 V1 ^. m& r' r8 l/ ?9 D
- if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
" |$ W/ d! `. [1 f' Q - {
~4 S- H" I7 K" \# Q - Error_Handler();
- }8 w" _" C* t - }
复制代码 Z2 d; e7 q `: x/ _6 W& r) L
————————————————
) j2 S$ I' K6 p. {1 W7 @4 E版权声明:少侠来一本秘籍吧: r/ c: L$ u2 t- L
) i* s; ]/ r3 r, }
) l7 U2 B) r6 X9 T |