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

《STM32学习笔记》From Zero To Hero | CAN总线收发数据常见问题...

[复制链接]
STMCU-管管 发布时间:2020-5-28 12:25
CAN,Controller AreaNetwork(控制器局域网络),在汽车电子、工业控制领域的应用比较多,通常用于局域组网。
这是第9篇学习分享文章,《STM32学习笔记》之CAN总线收发数据常见问题分析。
+ B$ R5 P, |6 `
CAN总线和UART、I2C、SPI总线最大的区别主要在于取消了传统的地址编码方式,理论上讲总线上的互联节点数不受限制,拥有强大的握手与出错管理及重发机制,具有很强的抗干扰能力。
6 n. p" m0 r2 A1 r$ D
STM32 CAN 基础内容
1 x" n; |' H) \/ O* e5 ~4 I: h
CAN网络中主要由CAN控制器和CAN收发器组成,大部分STM32内部都集成了CAN控制器,如果需要使用CAN功能,还需要在外部连接一个CAN收发器才能使用。

3 Z5 t& T! T$ m' ~8 \% T5 J2 y
11.png
& W+ o$ ?" ]6 W( H
STM32内部集成的CAN控制器,支持 2.0A 和 B 版本的 CAN 协议。还有通信速度更快的CAN FD、 CAN XL,目前一部分STM32支持CAN FD(比如STM32H7)。
下面结合STM32F4描述一下关于CAN基本的信息:
/ j. d# P( F6 `- `- n2 ]
1. CAN总线
CAN总线上的数据是基于差分信号,通常只有两根线:CAN_L和CAN_H。从STM32芯片引出来的两个信号脚CAN发送和CAN接收,有点类似UART的收发引脚,但内部控制逻辑完全不一样。经过CAN收发器后形成两根信号线CAN_L和CAN_H挂到CAN总线上。

1 t( \* I+ P5 J) G" f
2. CAN波特率
CAN 总线属于异步通信,和UART类似,因此具有通信的波特率,标准 CAN 波特率通常支持高达 1 Mb/s。当然,也可以配置成500Kb/s、 250Kb/s等。
CAN 波特率由多个参数决定,下面章节会讲述波特率配置。

: z1 L1 i9 Z  T% c, e( g
3. CAN发送
STM32集成的CAN控制器支持三个发送邮箱,也就是说可以支持队列发送消息(数据),如果同一时间发送数据比较多,使用邮箱就比较高效,不用消耗CPU资源,CAN控制器自动发送,直到完成。

' g& k9 d6 v( P' P% L: U; k7 b3 r2 o! {
4. CAN接收
和发送类似,CAN接收支持接收FIFO,可以连续接收多个消息(数据),CPU空闲了再去处理接收到的数据。
同时,CAN控制器还支持接收过滤配置,也就是说,有些数据我不需要,CAN控制器可以自动过滤掉。
通过一张CAN框图来认识CAN控制器:

/ s4 l! n( R7 Y" k' V
22.png
; y. m) p# F* F
关于CAN的更多信息,可以参看芯片对应的手册和CAN相关协议资料。

7 c5 [0 R% n/ c3 i4 l1 Z
STM32 CAN 常规配置

, N# ?6 K) d6 w+ s2 N
STM32 CAN控制器需要配置的参数比较多,对于初学者而言,重点就是波特率。如果你只使用一些基本的功能,不使用的功能建议参考官方代码默认配置即可。
6 |9 `! C  S" M3 j& L- R4 J
1. CAN引脚时钟配置
引脚和时钟是使用外设基本的配置,比如F4例程:
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK,ENABLE);
RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);
GPIO_PinAFConfig(CAN_GPIO_PORT,CAN_RX_SOURCE, CAN_AF_PORT);
GPIO_PinAFConfig(CAN_GPIO_PORT,CAN_TX_SOURCE, CAN_AF_PORT);
GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN |CAN_TX_PIN;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType =GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;

% L! Y- G: V& t( L% c& f+ m4 C' M
GPIO_Init(CAN_GPIO_PORT,&GPIO_InitStructure);
% z3 r1 y. w4 }4 |- A
2. CAN常规配置
这些基本参数,需要进一步功能的作用,默认DISABLE。
CAN_InitTypeDef CAN_InitStructure;
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
6 a% f2 h- z: X8 l- T
CAN_InitStructure.CAN_Mode =CAN_Mode_Normal;
3. CAN波特率配置
波特率是第一步需要掌握的,波特率不对,就不能正常通信。
波特率 = 时钟 ÷Prescaler ÷ (SJW + BS1 + BS2);
比如:42M / 2 / (1 + 12 +8) = 1M
2 d4 Z  V6 O/ a1 Z" ^' @
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;

% m) B( k$ K, z5 z9 B( D
CAN_InitStructure.CAN_Prescaler = 2;
- z0 j  x/ D* _: H2 f
4. CAN过滤配置
CAN过滤是相对更高级的功能,建议深入了解,否则建议默认配置即可。

2 R- b; i* B5 \; e# X9 f  Y
CAN_FilterInitTypeDef  CAN_FilterInitStructure;
CAN_FilterInitStructure.CAN_FilterNumber =0;
CAN_FilterInitStructure.CAN_FilterMode =CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale =CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh =0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow =0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh= 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow= 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment= 0;
CAN_FilterInitStructure.CAN_FilterActivation= ENABLE;

! [$ ^0 `! y+ ]3 H
CAN_FilterInit(&CAN_FilterInitStructure);
. O5 M/ |/ b7 O( |. Q# p  ~- x' s
以上是通过标准外设库配置的参数,使用STM32CubeMX就可以很轻松的一键配置了。

, ^5 S% b( f& H, O. O" A  d
33.png

7 n( w6 J/ e6 M2 m3 N0 Q) Z
对CAN有一定基础了解,同时掌握HAL库使用方法的人,建议直接使用STM32CubemMX 配置并生成初始化代码。

0 f) @* i% |2 D% P0 n6 V
STM32 CAN 常见问题

# C4 w8 H1 [' t- ^
STM32的CAN控制器功能相对比较强大,实际开发过程中容易遇到问题,软件硬件都有可能导致通信异常,下面整理几点常见问题。
+ ?! o6 d9 d/ A6 v1 d4 `% t* V; q+ _
问题一:CAN总线接线问题
CAN控制器出来的信号为CAN_TX和CAN_RX,有点类似UART,但它和外面的收发器接法是TX对应TX,不是UART交叉连接。
同时,CAN总线和485类似是差分信号,具有极性。通常CAN总线只有两根线CAN_L和CAN_H。
上面指出来的两点,任意一处接线错误都会导致通信失败。所以,建议参考官方给出的电路原理图。

4 o' w$ R4 _' v2 }+ x
问题二:通信波特率配置问题
CAN属于异步通信,如果波特率不对,就会通信失败,或者接收到乱码。影响波特率的因素有很多:CAN时钟、分频值、位时序。
CAN时钟也就是RCC出来进入CAN控制器的APB时钟,比如上面代码中配置的是APB1,42M时钟。(一定要分清,不能认为是84M)。
44.png
6 I& H: m7 A7 D$ J" L4 E
位时序也是比较重要的一个配置,包含同步段、位段等,需要根据实际情况调整对应的值。
* d' B0 o  D) M# A) p9 B/ i
55.png

# O8 @& c% q$ f' `$ t+ x
问题三:CAN接收数据丢包问题
通常来说,CAN组网之后,总线上的数据量比较大,如果你配置或者处理不正确,就会导致丢失数据的情况。
1. CAN接收数据,通常使用中断
CAN中断入口和CAN中断函数处理比较容易引起数据丢失的问题。
有些CAN中断入口和其它外设的共用,比如STM32F103的CAN和USB共用一个中断入口。
通信时,由于CAN中断频率较高,中断函数不能占用太多时间,通常来说,只对接收到的数据进行一些简单搬运处理,不建议在中断程序里处理较为复杂的逻辑或算法运算。
, {. ]" H( j$ h! N
2. 双CAN过滤器管理问题
部分STM32芯片具有双CAN模块,从整体功能上讲,两个CAN是独立的。但是,两个CAN共用过滤器管理模块,对于STM32芯片来讲,该过滤器控制模块由CAN1统一管理,所以即使只是单独使用CAN2进行收发,也须开启CAN1,否则会因为过滤器未能开启,导致单独使用CAN2时无法收发的情形。
0 V: X3 b; E" u. w
3.CAN接收过滤
CAN总线接收可以通过配置,对一些“无用”或不需要的信息进行过滤,换言之即对总线上的信息选择性地进行接收。这个功能也算是CAN总线的高级功能,只有深入理解该功能之后方能灵活使用之。否则会因为过滤配置不当导致收发异常。

7 D' j- a& D8 s) M! S; Y" ^
复盘一下
▼CAN 基础内容:CAN总线、波特率、发送和接收;
▼CAN 常规配置:引脚时钟、常规配置、波特率配置、过滤配置;
▼CAN 常见问题:接线问题、波特率配置问题、接收数据丢包问题;

5 t+ r% b, e$ T" Z6 `2 U  `/ J8 G5 Z6 F* E+ J9 X
收藏 1 评论0 发布时间:2020-5-28 12:25

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版