打印
[STM32F1]

STM32 基础篇——CAN

[复制链接]
3682|55
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
实验目标
1. 了解 CAN 通信原理
2. 学会操作 STM32 的 CAN 模块

沙发
aizaixiyuanqian|  楼主 | 2018-3-14 17:35 | 只看该作者
CAN  简介
CAN 是一种 ISO 国际标准化的串行通信协议,是 1986 年德国电气商博世公
司开发出面向汽车开发出来的,此后,CAN 通过 ISO11898 及 ISO11519 进行
了标准化,现在在欧洲已是汽车网络的标准协议。 现在,CAN 的高性能和可
靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方
面。

使用特权

评论回复
板凳
aizaixiyuanqian|  楼主 | 2018-3-14 17:35 | 只看该作者
CAN 传输数据只需要两根线就可以了。CAN 控制器根据两根线上的电位差
来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通
过使总线电平发生变化,将消息发送给接收方。

使用特权

评论回复
地板
aizaixiyuanqian|  楼主 | 2018-3-14 18:01 | 只看该作者
1.多主控制。
也就是在总线空闲的时候,所有的单元都可以发送消息,而两个或
者两个以上的单元同时发送消息的时候呢,它是根据标示符(也就是 ID)
来决定优先级的。所以这里的 ID 并不是地址,而是表示访问总线的消息
的优先级。

使用特权

评论回复
5
aizaixiyuanqian|  楼主 | 2018-3-14 19:37 | 只看该作者
系统的柔软性
与总线相连的单元没有类似于“地址”的信息。因此在总线上增加
单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。不
像 I2C 总线上面每个单元都有自己的地址。

使用特权

评论回复
6
aizaixiyuanqian|  楼主 | 2018-3-14 19:47 | 只看该作者
通信速度
根据整个网络的规模,可设定适合的通信速度。 在同一网络中,所有单
元必须设定成统一的通信速度。而且传输很快。最高 1Mbps(距离小于
40M),最远可达 10KM(速率低于 5Kbps)

使用特权

评论回复
7
aizaixiyuanqian|  楼主 | 2018-3-14 19:48 | 只看该作者
远程数据请求
可通过发送“遥控帧” 请求其他单元发送数据。

使用特权

评论回复
8
aizaixiyuanqian|  楼主 | 2018-3-14 19:50 | 只看该作者
错误检测功能·错误通知功能·错误恢复功能
测出错误的单元会立即同时通知其他所有单元(错误通知功能)。 正
在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束
发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复
功能)。

使用特权

评论回复
9
mmuuss586| | 2018-3-14 19:56 | 只看该作者
感谢分享;

使用特权

评论回复
10
aizaixiyuanqian|  楼主 | 2018-3-14 20:53 | 只看该作者
故障封闭
CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)
还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功
能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔
离出去。

使用特权

评论回复
11
aizaixiyuanqian|  楼主 | 2018-3-14 20:54 | 只看该作者
连接
CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上
是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负
载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可
连接的单元数减少。

使用特权

评论回复
12
aizaixiyuanqian|  楼主 | 2018-3-14 20:57 | 只看该作者
CAN 的传输主要通过 5 中类型的帧来进行的,如图

使用特权

评论回复
13
aizaixiyuanqian|  楼主 | 2018-3-14 20:58 | 只看该作者
而数据帧和遥控帧有标准帧和拓展帧两种格式,标准格式的 ID 有 11 个
位。从 ID28 到 ID18 被依次发送。禁止高 7 位都为隐性。(禁止设定:
ID=1111111XXXX)扩展格式的 ID 有 29 个位。基本 ID 从 ID28 到 ID18,
扩展 ID 由 ID17 到 ID0 表示。基本 ID 和标准格式的 ID 相同。禁止高 7 位
都为隐性。(禁止设定:基本 ID=1111111XXXX)

使用特权

评论回复
14
aizaixiyuanqian|  楼主 | 2018-3-14 21:01 | 只看该作者
CAN  模块原理图

使用特权

评论回复
15
aizaixiyuanqian|  楼主 | 2018-3-14 21:02 | 只看该作者
通过以上介绍,我们对 CAN 总线有了个大概了解(详细介绍参考光盘的:
《CAN 入门书.pdf》),而且有些时候光看,理解起来有点困难,接下来我们通
过分析程序,理解 CAN 通信,然后大家通过懂得怎么使用 CAN 通信之后再回
去理解 CAN 通信的详细知识,这样子可以好学习一点。

使用特权

评论回复
16
aizaixiyuanqian|  楼主 | 2018-3-14 21:04 | 只看该作者
打开时钟。
我们要使用的 CAN1 所以我们讲 CAN1 的时钟,还有要使用的 IO 口的
时钟。在这里我们看到 CAN 还有编号!其实呢,在互联型的 STM32 中是有
两个 CAN 的,一个主 CAN 一个从 CAN,不过我们开发板上面使用的是增
强型不是互联型,所以只有一个 CAN。
所以设置代码为:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

使用特权

评论回复
17
aizaixiyuanqian|  楼主 | 2018-3-14 21:07 | 只看该作者
配置 IO 的模式
我们使用的收发 IO 口是 PA11 和 PA12。在这里我们要把 PA11 设置为上
拉 输 入 : GPIO_Mode_IPD , PA12 设 置 为 复 用 推 挽 输 出 :
GPIO_Mode_AF_PP。代码为:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PA12
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PA11
GPIO_Init(GPIOA, &GPIO_InitStructure);

使用特权

评论回复
18
aizaixiyuanqian|  楼主 | 2018-3-14 21:11 | 只看该作者
复位 CAN 外设及结构体函数。
我们使用的初始化的结构体成员很多,有时候有些成员不用设置,所以
我们复位初始化一下。代码为:
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);

使用特权

评论回复
19
aizaixiyuanqian|  楼主 | 2018-3-14 21:14 | 只看该作者
CAN_TTCM:表示是否使用时间触发模式。那什么是时间触发模式
呢?时间触发通信模式下,CAN 硬件的内部定时器被激活,并且被
用于产生时间戳,分别存储在 CAN_RDTxR/CAN_TDTxR 寄存器中。
内部定时器在接收和发送的帧起始位的采样点位置被采样,并生成
时间戳,禁止自动重传模式,主要用于满足 CAN 标准中时间触发通
信选项的要求。在该模式下,发送操作只会执行一次。如果发送操
作失败了,不管是由于仲裁丢失或出错,硬件都不会再自动发送该
报文。在一次发送操作结束后,硬件认为发送请求已经完成,从而
对 CAN_TSR 寄存器的 RQCP 位置 1,同时发送的结果反映在
CAN_TSR 寄存器的 TXOK、ALST 和 TERR 位上。我们这里不使用
时间触发模式,所以我们设置为:DISABLE

使用特权

评论回复
20
aizaixiyuanqian|  楼主 | 2018-3-14 21:14 | 只看该作者
CAN_ABOM:表示是否使用自动离线管理。什么是自动离线管理
呢?其实设置当 CAN 处在离线状态下时,是否能够离开离线状态。
当它使能的时候,单片机工作的过程是:当硬件检测到 128 次 11 位
连续的隐形位,就自动退出离线状态;当它失能的时候,需要用软
件来设置 CAN_MCR 寄存器中的 INRQ,然后当硬件检测到 128 次
11 位连续的隐形位,就退出离线状态。现在我们知道自动离线管理
是怎么回事儿了,但是呢,我们又有点疑问,离线状态是怎么事儿?
这个呢,它是当 TEC 大于 255 时,BxCAN 就进入离线状态,那 TEC
又是什么呢?TEC 呢其实是一个 9 位的发送错误计数器的低 8 位,
在 CAN_ESR 寄存器里面,然后它根据 CAN 标准,接收出错时,根
据出错的条件,加 1 或者加 8。(详细的错误标准大家可以查看 CAN
手册)现在我们恍然大悟了吧,其实离线状态是 CAN 出错了之后
CAN 进入的状态。 (所以我们说 CAN 有故障隔离机制就是这么回事)
我们这里不使用,那么设置为:DISABLE。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

1353

帖子

6

粉丝