你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 CUBE:CAN总线收发

[复制链接]
STMCU小助手 发布时间:2023-3-7 14:00
1、默认STM32CAN1就是主站。CAN2是从站. ?4 ~' t" z+ w! y
2、主站配置如下:参考时钟是72M/2=36M
) M" M5 G- m7 K& o+ ?
波特率:36M/9/(2+2+1)=800K.所以通讯频率800K。$ @2 A9 J+ B0 N0 G6 [# t
注意此处BUS-Off一定要enable。否则出现插上下载器两个站就不能同时发送的情况7 L3 P8 }6 h# ^

% K' v( w: f! c# f" d& N
2019082716413958.png 5 T6 M) e0 m" S

0 U8 Y1 \7 Y6 |3 l+ V  j% P3、中断设置& N; s1 U/ W: p# R, L9 Q$ w
( s% o. n! O: K- b# u& l
20190827164354890.png
# s4 x: G" Z8 g, z7 K0 q2 z# I% f. g) U- S+ h0 p
; h! q+ e  @* l8 @
4、can开启函数:5 r1 h6 t9 [/ l6 R' k
HAL_CAN_Start(&hcan1);! l6 Y: ?5 F9 r) v3 I( G8 ]# D
HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);
$ s- s# U; |: Zcan发送函数:
, q" u1 F9 T1 n) p; E( _void CAN_TRANSMIT1(void)
, s1 v# d& L$ }& I{- {8 y4 _# R' l* k3 M
TxMessage2.DLC=8;) w9 T3 m6 z; m- u' F" [
TxMessage2.StdId=0x314;$ m' D" c* b2 r
TxMessage2.ExtId=0x00001314;7 b* X* a- [' R/ K! d* R- _4 y
TxMessage2.IDE=CAN_ID_EXT;7 s! M  D" |1 m( r) @+ m- h
TxMessage2.RTR=CAN_RTR_DATA;
8 J$ s' g6 p5 d8 J% _uint8_t TR_BUF[8]=“22222222”;; L: I% ]4 z/ @( X6 P/ o$ p1 z
if(HAL_CAN_AddTxMessage(&hcan1,&TxMessage2,TR_BUF,(uint32_t*)CAN_TX_MAILBOX1)!=HAL_OK)
& Q" ]. R7 ]5 S, u0 E{
; R) _; S: P* P$ Q  ]+ Nprintf("???1");: s5 ?( E$ b6 K) V# k* T5 ~. T6 I) ]
}
. a) P% D. h/ N" A. x}( O" m4 I) @" p, }
7 K  [: R% H$ h$ u+ D2 ~. r

+ [/ `* X* h% s  j3 Z- E% l5、can1配置
2 P# ?# x9 M, l$ M2 r; ?  y7 Dstatic void MX_CAN1_Init(void)
2 x0 H! [6 ^/ S{
# s1 Q( t9 h1 X* s
# n' [: R7 T- C% x
1 d; G+ B! _) R$ v* e
/* USER CODE BEGIN CAN1_Init 0 /
7 Q& |1 H* B! A" P) h7 Y2 \CAN_FilterTypeDef sFilterConfig;& s+ j" ?5 X! R3 Z1 p' q
/ USER CODE END CAN1_Init 0 */. k0 {6 |8 O: P  J
2 i% \$ Q! U/ {, c0 F) o) \1 x7 T

  w8 M& a1 z+ G4 Q$ J9 y+ Z# f/* USER CODE BEGIN CAN1_Init 1 */% U, P( G( H$ b7 K: e

' \$ S; r9 m3 O- w% K& N

' z0 K3 v* w5 C/* USER CODE END CAN1_Init 1 /
4 B# g: E1 R6 ^5 mhcan1.Instance = CAN1;
) U6 E5 {$ R5 {' W4 [, J, t  Fhcan1.Init.Prescaler = 18;
* T: P& t6 K8 s( Z, Qhcan1.Init.Mode = CAN_MODE_NORMAL;
8 f% S* r! q* X. o0 e5 @: phcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;! i7 D- |+ O9 U7 _% [0 E
hcan1.Init.TimeSeg1 = CAN_BS1_2TQ;0 T% _4 i' i  l% ^6 q# i, I; H2 a2 _
hcan1.Init.TimeSeg2 = CAN_BS2_1TQ;' ]0 h" @; t7 t, Y" q# b7 n
hcan1.Init.TimeTriggeredMode = DISABLE;4 m7 g7 O& J- d* s( V  x/ u4 v
hcan1.Init.AutoBusOff = ENABLE;
( E. }$ m8 @; j4 s/ P1 g- Khcan1.Init.AutoWakeUp = DISABLE;% e$ G) p0 m! G7 e5 d: D: ]
hcan1.Init.AutoRetransmission = DISABLE;/ g% [/ q2 ~6 f# L
hcan1.Init.ReceiveFifoLocked = DISABLE;/ \# y( R; v. y( w
hcan1.Init.TransmitFifoPriority = DISABLE;; x' F) ]; U* s& a( d$ ?: k
if (HAL_CAN_Init(&hcan1) != HAL_OK)% R4 N, {. K+ @' W' c$ z5 ^
{
" a, l6 l3 @: `& ZError_Handler();- x# [# b( a( T# S- F# O+ p
}, e2 x2 w+ f1 W1 y& e
/ USER CODE BEGIN CAN1_Init 2 */
1 \% Y. {" A" @; ^! bsFilterConfig.FilterBank = 0;  v  A8 J# k" L
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
5 N& p! }9 p' s: x4 H6 g% |# e# ~4 hsFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;) u  w& i# T( e
sFilterConfig.FilterIdHigh = 0x0000;
3 j; S( p2 s  ]8 X9 j' `sFilterConfig.FilterIdLow = 0x0000;$ R, K: |$ Y1 K+ s& }
sFilterConfig.FilterMaskIdHigh = 0x0000;, \+ @- `. I2 @' e2 W5 ^
sFilterConfig.FilterMaskIdLow = 0x0000;
. s# O% |' ]' y( G- IsFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;$ H, Q' `) V& R
sFilterConfig.FilterActivation = ENABLE;; }8 C3 t5 r% N. u8 w; x3 D
sFilterConfig.SlaveStartFilterBank = 14;! _& y9 R* Q/ I# i; }, s9 g( y

# `. n% a& F0 t& z% h! ~% Y
* n! |- p/ X" e
if(HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig)!=HAL_OK)
3 H- S* F1 ?& W1 |{& K: C5 s7 F$ I  ]& H% x
Error_Handler();" w" K6 M5 I7 n) X* t3 o
}
- Q8 b0 ?* v( Q! ]6 S5 L- M
2 J9 i8 Y5 J1 D  I+ B4 x# h: D
5 I; E: k" n8 b1 Y4 j! R. e- d; w
/* USER CODE END CAN1_Init 2 */9 y- C8 _0 l% y* h- O. B0 ]/ X

; M* d! Z$ i# N9 B6 X5 O
4 S8 t9 z1 T7 t2 M. }' B8 s
}
( j, `& G) d9 R, S, O4 `* q' Z/ J7 Y4 @& M0 E

7 v% V' v! S7 Y% R: h0 x7 g# t  P6、CAN1中断函数
4 I# s, M: S- W' O! y
7 I% [+ [3 ]& [& w! w5 g
  I' p4 T( m/ q# M: j6 B8 C/ C
void CAN1_RX0_IRQHandler(void)
. Z$ Z+ i( Y1 @4 M5 V! ?4 F! u{4 T9 a; U* z# ]# y- s7 j
/* USER CODE BEGIN CAN1_RX0_IRQn 0 */+ }2 z) ]# z3 I9 D
7 V3 T) p& V5 t' W8 `% f8 J+ X3 y

/ G1 d/ F, R2 S) w+ y( r9 l- G$ ZHAL_CAN_GetRxMessage(&hcan1,CAN_RX_FIFO0,&RxMessage1,RXBUF);
3 {( e" h8 p: u& {2 K9 m/ I5 f; U1 P6 @( P
/* USER CODE END CAN1_RX0_IRQn 0 /& T: ]- ^, j* t! |
HAL_CAN_IRQHandler(&hcan1);
( j6 q6 ^2 r4 g+ H  N/ USER CODE BEGIN CAN1_RX0_IRQn 1 */. g4 c8 Y6 o! }7 z5 |4 Z
1 X& a! F6 g2 `. \. `& t
$ {$ @, x0 ^% Y! K5 h
/* USER CODE END CAN1_RX0_IRQn 1 */
0 z5 Z4 B+ v! z' f+ I% x0 B}
& D6 @& Y6 Y( @& [  A1 s
" d( e' V2 f$ O( I& \

0 p0 S8 [3 r3 u0 Z8 x4 v7、CAN2配置
" \( G( A8 S! Q& ]$ T$ Pstatic void MX_CAN2_Init(void)* O& l% p: s2 C5 X  C' w- L- x
{
4 S  _3 q) H9 }3 L
& n, G9 i2 M9 ?$ Y1 ]8 A  @# y5 e

& u2 D7 U3 x- t0 m: k, A/* USER CODE BEGIN CAN2_Init 0 /
* x$ T5 O/ m: U( j* mCAN_FilterTypeDef sFilterConfig;
' `$ {+ ~* O; z/ USER CODE END CAN2_Init 0 */
* K! p  l3 g' V9 b4 \, `6 o$ }
# h% l7 F4 L6 f% e1 t& H
2 m- f; T% _4 s5 k
/* USER CODE BEGIN CAN2_Init 1 */
2 p! q8 d  @  t' G( G* g' q0 c3 P; Y1 g( p

8 O! [$ B0 G5 C* G/* USER CODE END CAN2_Init 1 /
  K3 U9 \) ?) C" {: H7 ehcan2.Instance = CAN2;. m9 |% r5 [9 b- J
hcan2.Init.Prescaler = 18;
& ]) z' f# b; W8 O- D$ G; g- jhcan2.Init.Mode = CAN_MODE_NORMAL;( a* i% i8 w/ a9 M, ]
hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ;7 A! d- l# k! f; j( T: y+ s
hcan2.Init.TimeSeg1 = CAN_BS1_2TQ;
1 ?9 T; l* }/ H$ g( \. g: _hcan2.Init.TimeSeg2 = CAN_BS2_1TQ;& ~2 M4 k1 S" h! T( I0 A
hcan2.Init.TimeTriggeredMode = DISABLE;
8 @) c, ^: z3 A' B7 \hcan2.Init.AutoBusOff = ENABLE;
+ @& ]4 `: U7 |3 S4 Yhcan2.Init.AutoWakeUp = DISABLE;+ q! b+ f. U: b  m7 n) `/ A4 P, }
hcan2.Init.AutoRetransmission = DISABLE;
3 @; `% D/ g1 c9 i' Nhcan2.Init.ReceiveFifoLocked = DISABLE;. g, i7 Q, `) s/ ^
hcan2.Init.TransmitFifoPriority = DISABLE;7 b- D) L7 R8 l
if (HAL_CAN_Init(&hcan2) != HAL_OK)
. k: R; u* ?, E& T4 X5 ]) q{- I& F" \, D% H9 j8 u" y1 P
Error_Handler();" b: ^! H. t3 {' ~
}
* Y! U' a. Q9 k7 i0 K2 E/ USER CODE BEGIN CAN2_Init 2 */+ I, V" F$ S6 }" `. H

/ ~% D- U5 u: Z0 q6 x

4 w8 `) L, r5 I9 n+ ^sFilterConfig.FilterBank = 14;; o' J5 S0 t, D
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;4 Q1 W: y: I4 J
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;/ D0 o5 q$ C$ l+ T2 D# f- b: |
sFilterConfig.FilterIdHigh = 0x0000;
, H5 c9 \+ s. hsFilterConfig.FilterIdLow = 0x0000;
' F9 \7 L; x, ^7 Q( J) FsFilterConfig.FilterMaskIdHigh = 0x0000;
& w7 |' b1 y7 {; |- u7 t, H1 wsFilterConfig.FilterMaskIdLow = 0x0000;" ~; \$ I% ^8 ^7 B/ z2 }
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;$ Z5 b% W4 K4 B- \- }/ Q
sFilterConfig.FilterActivation = ENABLE;
# C7 ^$ u& Q. bsFilterConfig.SlaveStartFilterBank = 14;
: e% D& k: l( |1 k0 K, g
' p" j( x% f, Y
# n2 O* }2 P: @- e
if(HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig)!=HAL_OK)" v* u7 i# h3 X2 t' R7 M2 p: x, q
{3 p; }8 r3 N3 i1 N& h
Error_Handler();
9 n8 x+ l9 d6 l  ]( S}0 P) j4 [) w' r, r2 O! C, s8 a

0 E5 K7 C9 Z$ A        HAL_CAN_Start(&hcan2);& M/ Y+ I' D+ ~# g1 W1 c
        HAL_CAN_ActivateNotification(&hcan2,CAN_IT_RX_FIFO0_MSG_PENDING);               
6 F' l3 E' L0 c4 u: l( E/* USER CODE END CAN2_Init 2 */. i; r6 j# G/ Z: d
4 J) x7 U; P& o. V
}' e. x9 C) w6 F" D9 e
8、CAN2中断函数
2 r& i, w. Q2 E' n, G: e8 R6 @  cvoid CAN2_RX0_IRQHandler(void)0 T# d* P- C* W" s
{
( t+ n  v; {6 Z  L/* USER CODE BEGIN CAN2_RX0_IRQn 0 /, S; G3 V# m: j3 M2 o4 `
HAL_CAN_GetRxMessage(&hcan2,CAN_RX_FIFO0,&RxMessage1,RXBUF);
) Q7 O( M; t5 L7 B( F/ USER CODE END CAN2_RX0_IRQn 0 /% ^- }4 f+ H2 Y- G3 K9 t
HAL_CAN_IRQHandler(&hcan2);1 o9 j3 |6 Q4 b4 v' [7 Z& s
/ USER CODE BEGIN CAN2_RX0_IRQn 1 */
$ ?. _8 V) J3 f" p. a* c

# [  f; e: f. T& K5 i/* USER CODE END CAN2_RX0_IRQn 1 */
; J6 |" C# _. p; b# ]0 V. L( ^}* M( g+ B' a- B' L6 d2 t/ B) G
6 W, T9 M# Y" k( s+ [$ P

0 O- Z# L$ V6 k6 W, f9、CAN2发送函数2 m) f9 q) m) A5 u: E4 B8 N5 n9 a5 |
void CAN_TRANSMIT1(void)
; j8 q5 O3 U+ G{- ^% I. A5 \) X8 i6 n0 T$ X
static uint8_t ll;3 ]& M9 _, J0 {1 O6 ]4 c# F* o
TxMessage2.DLC=8;9 j9 s. ]6 [4 \
TxMessage2.StdId=0x003;
( c+ m2 V3 B, c+ }' k) ETxMessage2.ExtId=0x00000003;
9 z, _* O* m6 d" k6 s) y* U+ z9 i& ZTxMessage2.IDE=CAN_ID_EXT;
- Q+ t' }* `( V) p/ @7 WTxMessage2.RTR=CAN_RTR_DATA;
+ g9 A& I, \, u, B- Ell++;3 Y* I: o7 i* S1 q& E
if(ll>100) {ll=0;}3 h9 j( q8 h3 r/ M1 j5 B
uint8_t TR_BUF[8]={0,1,2,3,4,5,6,ll};! P* X; G; M; q% n- L* G  i
if(HAL_CAN_AddTxMessage(&hcan2,&TxMessage2,TR_BUF,
) z) v6 W7 r. m/ d(uint32_t*)CAN_TX_MAILBOX1)!=HAL_OK)
1 t" ~3 r0 {$ g{3 B' \, U( \6 c8 f
//5 p2 M1 @; Q9 o; S# \
}6 `8 c$ ]% t  a
}
5 W& ?; R+ E6 {: i$ B4 q
————————————————( @6 p9 a+ U5 i& K0 Q- k# _3 M$ G7 M
版权声明:冬麻麻
' r6 M  n" g$ x6 d; ]4 s$ s) g
7 l- Y, Q. t. L3 f: m3 }, X; R' p8 l
赞 收藏 评论0 发布时间:2023-3-7 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版