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

STM32 CUBE:CAN总线收发

[复制链接]
STMCU小助手 发布时间:2023-3-7 14:00
1、默认STM32CAN1就是主站。CAN2是从站1 Q. E- y/ x% h0 q7 @# V- {# K
2、主站配置如下:参考时钟是72M/2=36M
& A7 {9 Y( R. S! P5 l
波特率:36M/9/(2+2+1)=800K.所以通讯频率800K。- G! \) ]1 }) E2 q' P; x7 l
注意此处BUS-Off一定要enable。否则出现插上下载器两个站就不能同时发送的情况
% ~7 y3 }# W+ x/ W! g+ K8 `: O
2 U4 `* J1 U3 }( C% y: G
2019082716413958.png
$ V5 e5 F' {1 `2 Z( J1 q6 D
7 H2 N9 q2 }& }# R9 @" t
3、中断设置% q* ?1 I& V- ]: T! H9 R
% x' M# o! v+ R- Y
20190827164354890.png , T/ D+ O: I& P0 z7 w4 v; R3 _
9 ?+ u" W# p  U! ^

5 L, K% J' }6 ?# `  k( P4、can开启函数:. [3 c6 z  @( W% H7 `3 B5 f
HAL_CAN_Start(&hcan1);9 X: h  k- m/ u1 u1 p$ W1 m
HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);# W. t0 r2 l0 h) z
can发送函数:5 F! F: t+ w% R
void CAN_TRANSMIT1(void). |. `4 L; C  M2 H0 ?! ^& }' Z
{
; R7 `* }6 ]* O0 O" STxMessage2.DLC=8;! }0 }4 J' s" X0 O) `9 b
TxMessage2.StdId=0x314;. d2 r# i+ x% J2 r) m1 }6 @
TxMessage2.ExtId=0x00001314;
9 i/ f' V$ a1 }* [6 F* F9 C, S$ lTxMessage2.IDE=CAN_ID_EXT;
; r: o4 G) l, }/ _0 n7 `" V3 GTxMessage2.RTR=CAN_RTR_DATA;
$ c$ s2 U- l' S9 L3 e  Yuint8_t TR_BUF[8]=“22222222”;% q) f5 o( `) n; k
if(HAL_CAN_AddTxMessage(&hcan1,&TxMessage2,TR_BUF,(uint32_t*)CAN_TX_MAILBOX1)!=HAL_OK)
- Q& s1 `: e7 {, [' H9 _{
  s: G+ f2 ~$ ]' A1 k- A; M" Dprintf("???1");
6 D" M7 K3 X6 h4 N+ S* k9 V' }}
4 j5 r; D: s" l# P. Z( u/ K}
8 ], \' C5 o* K: C3 H( o
$ ~3 m3 ?& t$ C$ |6 H3 |5 E
4 Z' c4 K7 ~9 Q
5、can1配置" v. x( z" k  s9 N5 ]
static void MX_CAN1_Init(void)5 N7 ]" F8 ?- V8 {
{& j8 _8 ]* X% b# J. ?" B
+ {9 y: A4 }3 I

0 v: ?0 _1 H2 x+ n& l/* USER CODE BEGIN CAN1_Init 0 /0 ?9 V( k( s% c
CAN_FilterTypeDef sFilterConfig;7 t/ M3 b- S2 q6 a* s4 L
/ USER CODE END CAN1_Init 0 */( h& \% ?, a9 l% L- {  [8 [# ]
  O; o* Z8 U3 U
8 J3 V7 j, \* g) W3 t
/* USER CODE BEGIN CAN1_Init 1 */8 E) Q6 `/ M: b0 s* P1 T0 K$ r
3 l# i5 s/ ^) ^& Z9 @; C
4 s# ~: K" s- v' L/ K( `9 @
/* USER CODE END CAN1_Init 1 /
' u% i. \; m: E2 m: ^, F- d: [; ^hcan1.Instance = CAN1;
* v; u) Q7 P3 |, i4 x' E$ jhcan1.Init.Prescaler = 18;- t! r0 ~; t0 L
hcan1.Init.Mode = CAN_MODE_NORMAL;+ ^- K5 D9 S0 a/ `3 t0 ^; c
hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;7 u, B& @' P% @0 ~/ \
hcan1.Init.TimeSeg1 = CAN_BS1_2TQ;5 N+ U$ p( e. v, K: y
hcan1.Init.TimeSeg2 = CAN_BS2_1TQ;
8 L( Y0 {: M6 b3 O$ v2 P; Z9 qhcan1.Init.TimeTriggeredMode = DISABLE;- u, k5 M3 m6 y2 U
hcan1.Init.AutoBusOff = ENABLE;' w2 {( Z8 k# ^3 \
hcan1.Init.AutoWakeUp = DISABLE;0 s( w. n) d" ?/ H1 A) y4 f
hcan1.Init.AutoRetransmission = DISABLE;" F9 E2 B* N. y9 H) L
hcan1.Init.ReceiveFifoLocked = DISABLE;, Q/ T" y, O/ x, _
hcan1.Init.TransmitFifoPriority = DISABLE;
: Q  V. [/ z# V# @, [if (HAL_CAN_Init(&hcan1) != HAL_OK)
7 H& y# |# _, P/ v$ T{- H% h, J6 F3 q4 V7 o) y% A+ }
Error_Handler();) F# G2 ]- Q4 X4 C
}# ?8 a( v% W$ U+ @$ q
/ USER CODE BEGIN CAN1_Init 2 */
  ]8 d& e; P* J) v6 s3 g3 Z! O$ csFilterConfig.FilterBank = 0;
; q# K: _4 W. J6 Z' m! s1 @4 [" ksFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
9 ~  w" D- M0 r1 dsFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;6 K0 A( M* ^- M, n' B* x: Q
sFilterConfig.FilterIdHigh = 0x0000;) K: w2 ?* \( V3 O% E4 R4 K
sFilterConfig.FilterIdLow = 0x0000;
- n3 h4 W# e) {sFilterConfig.FilterMaskIdHigh = 0x0000;
3 X4 X% b$ ^$ jsFilterConfig.FilterMaskIdLow = 0x0000;
# d+ ^; x# M% \) N+ L( R" C1 jsFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
# {9 v: C4 |# c# f1 msFilterConfig.FilterActivation = ENABLE;
* r0 _  k7 A# W8 d2 KsFilterConfig.SlaveStartFilterBank = 14;6 J8 m4 G" |% m7 f6 C2 f

' D. q  B4 R$ }$ _( Z( I

; {: y( @- |0 O" E3 z, Qif(HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig)!=HAL_OK)
% ~7 `8 t* p2 T/ E0 V) W{5 }. l- W  [: t7 @
Error_Handler();
& G  r) ?' Q* r4 I}
% h) W- P5 r+ q; @
: |! ~" l( @  i8 O  P5 ]! V( ^
8 B7 p  _4 r- M& ?/ t
/* USER CODE END CAN1_Init 2 */3 x5 y, q5 J, U6 D* Z' I8 _; N( \5 P
- A; f+ s8 C7 c

$ i4 d% ~4 i) d; ~$ A; R/ l& G4 p}
, ]7 D" R+ _( ?' A7 e& r- R4 H, t7 x" z

3 r4 c* O6 f" M6、CAN1中断函数
* R, h( K$ a5 f' _/ d) M
- Z. s/ c# o: f

4 O+ n! F1 j, _" ~0 m7 vvoid CAN1_RX0_IRQHandler(void): _9 L! R% o" u) G% p  q) V5 Z( u
{( i4 g" d3 O( N) O6 v# u
/* USER CODE BEGIN CAN1_RX0_IRQn 0 */" [5 Q1 e, I. x: n! m
- O% U$ @8 p, T" \+ _

3 i- \+ u) W. V/ F8 X8 t; eHAL_CAN_GetRxMessage(&hcan1,CAN_RX_FIFO0,&RxMessage1,RXBUF);
0 m0 y, X  ^/ o. w2 n+ G
- i- m; ?6 v' b$ G; a/* USER CODE END CAN1_RX0_IRQn 0 /* ~* S& O# m, t0 [  H* j+ m* O
HAL_CAN_IRQHandler(&hcan1);
7 ~- k7 Z5 h# Y3 p3 b" e/ USER CODE BEGIN CAN1_RX0_IRQn 1 */
! N/ d2 U4 e' ]5 G8 R) W
9 l! U, Z; A$ y& D
/ I, X0 v6 B! b$ c! g" L9 U
/* USER CODE END CAN1_RX0_IRQn 1 */1 |2 t, B6 q0 S7 {& w$ {1 v- w" ?
}
, O4 z4 z/ h8 f$ z8 m1 C# @
2 O4 d" m8 N8 a; k' D! n
2 `/ N  H7 W, R9 I( @0 K' Q' ~
7、CAN2配置
7 c, b$ P9 x5 |5 a2 \$ ^static void MX_CAN2_Init(void)7 K; n9 D& i7 t3 x) s% w' p
{
2 U/ ^6 Z) G+ J0 C( ~" a2 m& x( k* H' d2 U" J/ L

! a  W$ S5 P* v- q" {/* USER CODE BEGIN CAN2_Init 0 /+ \: U# k7 o) p% }$ W
CAN_FilterTypeDef sFilterConfig;
& |6 y1 ]' u3 a8 m) K! x- _, _/ USER CODE END CAN2_Init 0 */7 [: T7 N& @/ v8 \8 O3 C8 F/ r
* e/ V2 {6 |! `9 v' a

) R2 ^7 \. @+ u9 {! e4 ^/* USER CODE BEGIN CAN2_Init 1 */& B/ q2 X* j4 R3 A5 K
  Z  L$ T4 z, \4 O

" D6 B5 n/ u. _8 b% g; E$ s/* USER CODE END CAN2_Init 1 /
$ N1 g) B' V- c* _hcan2.Instance = CAN2;
6 T7 a# i* M- n* a4 N6 phcan2.Init.Prescaler = 18;
! b7 J/ M3 S, khcan2.Init.Mode = CAN_MODE_NORMAL;* e7 C/ I+ M% s# U. r. O2 o
hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ;
! w' |, E+ f0 n6 y5 whcan2.Init.TimeSeg1 = CAN_BS1_2TQ;; ^! D  @) @2 {9 ~1 W& q. F9 F
hcan2.Init.TimeSeg2 = CAN_BS2_1TQ;
, m  C$ j# ?$ ^9 |. Q8 chcan2.Init.TimeTriggeredMode = DISABLE;
+ k/ R: H# w  l' Whcan2.Init.AutoBusOff = ENABLE;
$ Z) o+ d5 h5 c9 ?hcan2.Init.AutoWakeUp = DISABLE;1 B$ B1 t( z* O0 M# S. m+ K
hcan2.Init.AutoRetransmission = DISABLE;1 `9 g/ n  f* ^5 m3 X) Y1 z! V
hcan2.Init.ReceiveFifoLocked = DISABLE;( j9 U2 z7 t" |7 U4 z1 s/ f6 T
hcan2.Init.TransmitFifoPriority = DISABLE;7 d' U3 D3 {$ l9 P5 g2 e
if (HAL_CAN_Init(&hcan2) != HAL_OK)
/ {5 j% {0 [9 x) J% x- M{
: r, q. |9 A" Z' g* Z& g& EError_Handler();( y! ~+ F1 B/ ]! }5 i4 N0 \
}% A$ o( q( |# {/ C7 D
/ USER CODE BEGIN CAN2_Init 2 */$ |- |) a( \  ^" T. S& m
4 v# c7 o2 M! L
8 D$ U* L- O) ~- X
sFilterConfig.FilterBank = 14;0 V( x. v+ j* U. y8 w  J
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;: M2 i+ n& p/ O) o
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;0 m* @3 W" p3 V& c
sFilterConfig.FilterIdHigh = 0x0000;
  t; B( G' I! C8 I; e. p6 M- msFilterConfig.FilterIdLow = 0x0000;
4 g/ k7 n7 V8 N; ?6 B0 a7 h. {sFilterConfig.FilterMaskIdHigh = 0x0000;7 @# y9 ?, R( R: b
sFilterConfig.FilterMaskIdLow = 0x0000;
* x9 Z% ^; c" i0 O/ A2 o; `4 y# OsFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;: m/ o- r- Y: t# C) z5 k
sFilterConfig.FilterActivation = ENABLE;1 P5 s/ e# O9 ]8 t6 Q
sFilterConfig.SlaveStartFilterBank = 14;
, q  I* {8 d  O3 g: D  W' u% `$ i1 d$ V, J3 s2 v3 k* q2 K

8 H8 T6 S/ L2 C! W) f0 r( yif(HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig)!=HAL_OK): {3 k1 `/ Y4 G' ?* L4 H6 S8 W
{
$ G8 |$ R" C/ r0 |  S7 |Error_Handler();
, A/ v) z+ A" Z3 Z, T}
# j% a8 x1 K! v, o( q* I3 n! Q0 ~1 V
        HAL_CAN_Start(&hcan2);$ ]' b0 y7 ~. H0 y& |6 {
        HAL_CAN_ActivateNotification(&hcan2,CAN_IT_RX_FIFO0_MSG_PENDING);               & c% c' u9 ~: y5 H+ W2 i, j. u! r
/* USER CODE END CAN2_Init 2 */
% N( U( g, d" K

& w' {7 Q) g1 F9 |# r}
8 a; K+ [; ^* V2 N, T  F1 ^3 G
8、CAN2中断函数) E. M- r6 o8 U- B: B: b
void CAN2_RX0_IRQHandler(void)% d6 L7 c8 j8 Y4 e! ]1 b
{  v: Z; _: @: {' L) k7 o
/* USER CODE BEGIN CAN2_RX0_IRQn 0 /
7 C9 k$ q. D! _4 yHAL_CAN_GetRxMessage(&hcan2,CAN_RX_FIFO0,&RxMessage1,RXBUF);0 l, Y/ J. e) H) R" s7 O2 p
/ USER CODE END CAN2_RX0_IRQn 0 /
# y4 e$ ^( c* ?HAL_CAN_IRQHandler(&hcan2);
9 v' p0 x! ~1 {# z: X/ }- Z2 t/ USER CODE BEGIN CAN2_RX0_IRQn 1 */! l9 W2 L4 Y& [

* ~/ T) L4 X2 g/* USER CODE END CAN2_RX0_IRQn 1 */
1 Z' j3 _  z( y}0 t1 z& e4 A0 d, f! f
+ N8 V: x; h0 n: ~$ G

8 r9 m' y, @# i7 L  h% b9、CAN2发送函数
% _+ M( \4 J* f% B( I0 b& W  vvoid CAN_TRANSMIT1(void)
4 k' ?4 `: H" y{
- v7 G) a7 O1 Ostatic uint8_t ll;! _/ h. ?+ o0 j+ z% A/ n
TxMessage2.DLC=8;$ P7 U4 T3 o. L
TxMessage2.StdId=0x003;
2 v+ O7 k6 y6 z: S# s7 G( ]TxMessage2.ExtId=0x00000003;
/ S5 @; E3 i/ y7 l) [% K5 H5 gTxMessage2.IDE=CAN_ID_EXT;2 o" k$ `* i, r! P; b5 z8 ]  v
TxMessage2.RTR=CAN_RTR_DATA;
- O7 Z6 o% S+ q  C' \7 i) tll++;; q+ ]) ?$ Q* i8 [1 B" T
if(ll>100) {ll=0;}
% F7 ^0 q+ r+ `0 @9 D. u: n' fuint8_t TR_BUF[8]={0,1,2,3,4,5,6,ll};8 S* }' @2 N  I$ _) B
if(HAL_CAN_AddTxMessage(&hcan2,&TxMessage2,TR_BUF,0 n* {% @* J4 G$ d* j. Q/ }+ h
(uint32_t*)CAN_TX_MAILBOX1)!=HAL_OK)9 n" N, X  y' j! c2 s( _( W$ e' E
{
. C2 R4 Q9 K( V4 a//
3 n* R7 o1 K8 L}
0 ^2 \! c# ^! D$ v4 `- H}+ i3 ]8 o! b4 M( z
————————————————& D  y+ N' C* @8 t6 i! E
版权声明:冬麻麻
/ B8 ]4 D, O% U; r0 p2 L9 V, |# @7 j3 i& v8 k  S) l
5 k; \" V0 H" H0 X/ @( h8 O& r/ j( F
收藏 评论0 发布时间:2023-3-7 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版