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

【经验分享】STM32F103:CAN总线通信——初始化/波特率

[复制链接]
STMCU小助手 发布时间:2022-5-4 22:00
一、CAN总线通信初始化配置# _) h1 y1 G! ?; \6 k
1. CAN总线通信初始化配置流程
( j/ u, x1 Z8 M- n3 k6 n+ \: R
CAN总线GPIO和时钟配置$ J, B) e8 J+ M* v- }
CAN总线接收中断优先级配置. g- p* p2 @* I
CAN总线初始化配置
1 U  w' a- e" p- T2. CAN总线GPIO和时钟配置9 J* b# n' M) g# [9 u- ]
CAN引脚配置% l+ @( e: O8 @

* f- N4 n# i1 I# ^8 h ${BDSWRF4[GB%I%MZOLXC@3.png
/ g: C6 v  y0 S8 h8 D: |$ k$ x& ] P10HG5ZV(V(V~N6$YL1(]ES.png
9 P0 @5 F& J, K* L* r. J
8 T$ P8 g8 q* R  q
  C: H% l) Y! }" A1 J0 ECAN时钟配置:

% H6 T8 W" A. [6 x4 [0 a: N
! x6 C- T% m. i( M8 G NO5_I7]74%~`$QQWH_NT{EA.png : p7 Q, e+ w  s9 x- ?' Z
- W1 N& k+ y& h7 M2 Y8 P
W3B$Z~7_)%U47070WW%_AUY.png $ h8 W4 U# e( J' l# `4 P& _
  X$ q1 G" _. {# L) f: M! M; s
2 Z9 M$ k0 b6 @& u
PA11和PA12引脚,CAN GPIO初始化,具体代码如下:
" V: E  R: r0 K9 _& u2 j" \+ v, Y% N) h3 @' ^$ F3 O6 S8 K" Q# P  \% Z) Z
  1. /*CAN GPIO 和时钟配置 */
    , V, k9 n1 A1 p$ s7 S! H
  2. void CAN_GPIO_Config(void)
    & m2 x8 M7 {) y1 O' o6 Y) X4 h
  3. {" x7 Y3 c; w- @/ d' {' X
  4.         GPIO_InitTypeDef GPIO_InitStructure; ! f! o# T$ @' |; V0 u- L8 \
  5.         /*GPIOA端口时钟使能*/         9 t7 E1 y* P: J, ^
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);                                                                                                                        
    * E0 E3 {0 r; A+ k+ L- c7 l! H
  7.         /* CAN1 模块时钟使能 */. Y  N0 g# n# f$ z* k. ^9 ^
  8.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
    6 t# e: T6 G7 w" G" C

  9. # L! W$ a, P0 v9 g, e0 x6 V) n7 r
  10.         /* Configure CAN pin: RX */         // PA11
    . i/ |1 u6 l2 j8 W4 y
  11.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    ' s" G1 @4 P% {5 I) m
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         // 上拉输入
    / f; d0 U* p( m( s5 |: c. F0 a% e/ K0 ~
  13.         GPIO_Init(GPIOA, &GPIO_InitStructure);/ b7 i2 @8 r5 O6 }; y

  14. , p* e5 p: X9 J: u/ C) U
  15.         /* Configure CAN pin: TX */   // PA12
    # e3 O- R% S/ j  ^+ r
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;3 P% Y' g7 M. \! P
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
    3 V5 Z3 A9 A; O1 n" ^- J1 D
  18.         GPIO_Init(GPIOA, &GPIO_InitStructure);
    / {( e5 U/ @$ m/ Q2 p# T
  19. }
复制代码
+ L4 t. R9 P, ]6 L! `4 @
PB8和PB9引脚,CAN GPIO初始化,具体代码如下:! |9 V% B  F7 C5 O
' C. `" y; d# g% C3 _! Q* A! V* Y
  1. /*CAN GPIO 和时钟配置 */
    + R# B: A2 F" |7 j$ u9 M$ H" S
  2. void CAN_GPIO_Config(void)
    " x0 v( U7 y0 @' b- O1 k. m/ ?
  3. {: y# ]* N4 @! |' z- ~4 V' f
  4.         GPIO_InitTypeDef GPIO_InitStructure; 0 d" {5 \- d" R: X  A4 E6 H
  5.         /* 复用功能和GPIOB端口时钟使能*/         
    ; }. c0 y$ u8 p1 y
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);                                                                                                                         5 N. {% u, g$ R8 S2 T, h/ |, ?
  7. . V8 s- z  k3 I1 T; i; P0 h
  8.         /* CAN1 模块时钟使能 */% D" U; {% d1 L8 t1 ^
  9.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
    ( j7 n* t: n9 U3 u! Y- {1 p
  10. # H( k- s1 {7 f. n5 Z" s4 p* e
  11.         /* Configure CAN pin: RX */         // PB8
    # m! n9 m" _4 |$ Z% R2 l
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    0 b/ n+ G# r. M3 {3 s& {
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         // 上拉输入
    # E4 B* X( c. N8 K9 Q( o
  14.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    + [+ H" |  z8 q6 Q* ~2 l
  15. . d: x' @$ R2 @, V, x' c2 }
  16.         /* Configure CAN pin: TX */   // PB9
    # D- C, m) n! G  r# \
  17.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;9 {) ?; e- [! e% d2 ^4 w1 n
  18.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出0 `: ], A* l; w" t' M
  19.         GPIO_Init(GPIOB, &GPIO_InitStructure);% y' F8 H. R; R& Q  U) K8 A( a

  20. 9 n3 u; j' n3 n2 _5 `
  21.         //#define GPIO_Remap_CAN    GPIO_Remap1_CAN1   R) |' ], ~1 e& z3 ?6 |
  22.         GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);  
    " z3 ]* B& M* F7 c; }0 s) U
  23. }
复制代码
5 n0 ^* t4 f( L, H; I! e
3. CAN总线接收中断优先级配置
- S- f* _; t, T0 d: i$ T- g/ E( F具体代码如下:
- k. N; d& t6 a9 L2 n2 P. U. }6 D4 H4 M7 D
  1. /*CAN RX0 中断优先级配置  */
    1 M+ d8 G% S7 J2 s" [1 y- }) X# w
  2. void CAN_NVIC_Configuration(void)
    7 b  W/ \( E# \! g" _4 f" ^+ E! M9 \
  3. {+ P2 ~% Y5 R) B
  4.     NVIC_InitTypeDef NVIC_InitStructure;
    7 p3 ^4 R% `2 b: [6 ?8 w# q
  5.           /* Configure the NVIC Preemption Priority Bits */  2 @) E' p2 K" |
  6.           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/ d& W& D( J4 H6 A- D* c, q- E
  7. . Z& P& D3 r- N- G; Z
  8.         /* enabling interrupt */
    & u) o; w* L' q3 o8 r: a+ k1 z
  9.           NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;;) ]9 X) }. E9 m6 O9 Z) ]! W3 @
  10.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    6 Y0 e. |- ]7 J8 o8 A
  11.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;; e1 f, J$ X- |9 w/ @( `: P, R6 R
  12.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;) e  ~; Z2 L% s" J) I5 A* y
  13.           NVIC_Init(&NVIC_InitStructure);
    6 Q) s+ q3 d* W7 ~" A
  14. }
复制代码
4 {- S. K+ \5 O+ }; U! s7 p
4. CAN总线初始化配置
% S+ C" k+ P1 t) C) k: l! E
具体代码如下:
/ N  {9 k: }* }: U4 f
. `3 }- V5 |# G! h. z
  1. void CAN_INIT(void)
    9 {' J" N* d" F/ |, l! g1 V
  2. {
    , Z/ L6 T  P+ N# N( E, o
  3.         CAN_InitTypeDef        CAN_InitStructure;
    / D9 ?3 B) x% y" O/ A! r
  4.         CAN_FilterInitTypeDef  CAN_FilterInitStructure;
    ( a) R7 r* X9 |6 J; E2 J0 i9 b
  5. 7 ]% _  \; Z+ g9 P
  6.         /* CAN register init */  _# c/ `% o0 f. y* G
  7.         CAN_DeInit(CAN1);        //将外设CAN的全部寄存器重设为缺省值
    & }. Z- ^# R4 ~9 b9 x+ ?" s
  8.         CAN_StructInit(&CAN_InitStructure);//把CAN_InitStruct中的每一个参数按缺省值填入
    " T3 X, |: Q/ d" S% B  k2 E' `
  9. # X0 Q, @4 H& s% {; n. p
  10.         /* CAN cell init */
    " v1 c! ^3 o+ b! U, y6 E
  11.         CAN_InitStructure.CAN_TTCM=DISABLE;//没有使能时间触发模式
    6 J" P4 W( M6 u$ l$ p
  12.         CAN_InitStructure.CAN_ABOM=DISABLE;//没有使能自动离线管理2 m' z7 j2 ^/ ~1 R7 X
  13.         CAN_InitStructure.CAN_AWUM=DISABLE;//没有使能自动唤醒模式7 u" O  H: r: K5 a& }& e( i. V1 p
  14.         CAN_InitStructure.CAN_NART=DISABLE;//没有使能非自动重传模式7 B  s* y. M* d" f6 l" ?# V, w
  15.         CAN_InitStructure.CAN_RFLM=DISABLE;//没有使能接收FIFO锁定模式! Z6 l3 B6 U* r
  16.         CAN_InitStructure.CAN_TXFP=DISABLE;//没有使能发送FIFO优先级8 ]- |  ?% `, @4 ^/ e
  17.         CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;        //CAN设置为正常模式8 ?1 g! o, G3 P/ I3 h
  18.         CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;                 //重新同步跳跃宽度1个时间单位) @4 B$ D* ]# V4 F/ V
  19.         CAN_InitStructure.CAN_BS1=CAN_BS1_3tq;                 //时间段1为3个时间单位
    9 h" M9 G, r* c2 I
  20.         CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;                 //时间段2为2个时间单位- _) Z  k5 }" |9 L
  21.         CAN_InitStructure.CAN_Prescaler=24;                  //时间单位长度为24           250k( D6 {5 I6 g9 C6 a3 \6 ^3 j
  22.         CAN_Init(CAN1,&CAN_InitStructure);. G& Q# ?' I; l& h8 Z- P
  23.                                                       //波特率为:36M/24(1+3+2)=0.25 即250K/ z4 i) o/ P( f# I

  24. ; ]8 w8 j. _8 e5 t& w7 x5 _
  25.         /* CAN filter init */5 d, N$ r8 \* M" z* o6 ~5 j& `9 F
  26.         CAN_FilterInitStructure.CAN_FilterNumber=1;//指定过滤器为1
    : r0 c( ~( h. v6 H1 _
  27.         CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定过滤器为标识符屏蔽位模式; D1 z' @1 T4 v# I2 m( e& {' n' U; [0 U9 g
  28.         CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//过滤器位宽为32位
    & j. s6 B+ ^8 H
  29.         CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;// 过滤器标识符的高16位值
    4 p: v' Q  Q. N. A9 y& n
  30.         CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//         过滤器标识符的低16位值1 C. f- F& p* d3 M1 W5 B* t4 v
  31.         CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//过滤器屏蔽标识符的高16位值: d5 H* {! ?& [; b1 C- \) G4 f
  32.         CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//        过滤器屏蔽标识符的低16位值
    ( R" V2 _4 i( e* T3 h. Q6 b3 {
  33.         CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;// 设定了指向过滤器的FIFO为0" V5 R* ~* H( o1 I
  34.         CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;// 使能过滤器
    $ @  S- a/ I# H
  35.         CAN_FilterInit(&CAN_FilterInitStructure);//        按上面的参数初始化过滤器1 l+ {! y$ w8 M7 m( A# {5 N3 j

  36. 2 S5 v: v" ~$ ]- i& u
  37.         /* CAN FIFO0 message pending interrupt enable */ - ^& i* P0 V- s2 j$ J0 H" o
  38.         CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //使能FIFO0消息挂号中断4 G& }6 o, b9 v" P
  39. }  
复制代码

) ?4 N1 l9 R" X二、CAN总线通信——波特率计算) w# S! z, a  ]9 x& y" p
1. CAN总线时间特性$ ]5 e% H  N- R/ b
同步段(SYNC_SEG):通常期望位的变化发生在该时间段内。其值固定为1个时间单元(1 x tCAN)。
& g( k3 e, r4 I* }& @- R9 ^时间段1(BS1):定义采样点的位置。它包含CAN标准里的PROP_SEG和PHASE_SEG1。其值可以编程为1到16个时间单元,但也可以被自动延长,以补偿因为网络中不同节点的频率差异所造成的相位的正向漂移。4 U. `) }1 F% N- z! p% G' }" g0 Y
时间段2(BS2):定义发送点的位置。它代表CAN标准里的PHASE_SEG2。其值可以编程为1到8个时间单元,但也可以被自动缩短以补偿相位的负向漂移。
* G; _0 @, ~3 y% v
; ~5 A. W+ ~8 M" Z) r8 [ GMOO5VVLO[FLC9U6]W{ZH.png
9 l' }3 I- S5 h4 b5 c* A% q9 G- |2 `2 P- j8 x' Q, U& D
2. 波特率计算公式( k. w& ~8 M8 P- q3 Y$ n6 Y/ E
CAN波特率=APB1时钟频率/BRP分频器/(1+tBS1+tBS2)) W( M. E* w5 a4 E& q5 U

- |8 {( i( r! p# d$ A! ~; u一般APB1时钟频率为36Mhz。如下图常见CAN总线的波特率设置。+ y+ z$ Y/ f( V& n  z% D
; m2 n. W. |% k, l7 N2 K
KPILTGAY5}$UF_PKKT5NJLU.png
6 s( M+ \4 N. j8 r$ y Z[5DG6T[ZC]06389K9H3}QI.png
) V) ]* i, U: f' S: A* ]* i. B" q4 m1 r6 ~  m. o
3. CAN波特率有关的寄存器5 ]4 E( i) s3 }8 O0 q( H

6 G7 a) J1 [1 G- Y %JE[TE(VB2MHP0~NY)O$QUG.png
: q+ E% e- N1 K
( i9 ?% l+ |: B! I3 a9 P C2JRU3{U}`BHN)[4D(KIZN1.png & @; y! Q2 e  ?$ W; @+ L$ R
( X* T3 T! ~, Y/ O0 u5 b
( s' q. l  C$ S/ Y9 K7 C

7 c$ S+ q5 Z9 z& T
赞 收藏 评论0 发布时间:2022-5-4 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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