
学习 STM32F1 的控制器区域网络(以下简称 CAN),利用STM32F1 自带的 CAN 控制器实现两个开发板之间的 CAN 通信,通过按键控制通信模式和数据发送。要实现的功能是:通过K_UP 键切换CAN 通信模式, K_DOWN键控制数据发送,将切换的 CAN 模式,发送和接收的数据通过串口打印输出,整个过程D1 指示灯不断闪烁,提示系统正常运行。学习时可以参考《STM32F10x中文参考手册》-22 控制器区域网络(bxCAN)章节,特别是寄存器介绍部分。如果对CAN 通信不了解的话还可以参考《can 入门教程》。 CAN 总线介绍 CAN 是 Controller Area Network 的缩写(以下称为 CAN),中文意思是控制器局域网络,是 ISO 国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后, CAN 通过ISO11898 及ISO11519 进行了标准化。CAN 是国际上应用最广泛的现场总线之一,在欧洲已是汽车网络的标准协议。 CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。 CAN 通信只具有两根信号线,分别是 CAN_H 和 CAN_L,CAN 控制器根据这两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。 下面我们来看下 CAN协议具有哪些特点: (1)多主控制。在总线空闲时,所有单元都可以发送消息(多主控制), 而两个以上的单元同时开始发送消息时, 根据标识符( Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。 (2)系统的柔软性。与总线相连的单元没有类似于“地址”的信息。因此 在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改 变。 (3)通信速度较快,通信距离远。最高 1Mbps(距离小于 40M),最远可 达 10KM(速率低于 5Kbps)。 (4)具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误 (错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能), 正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。 (5)故障封闭功能。CAN 可以判断出错误的类型是总线上暂时的数据错误 (如外部噪声等) 还是持续的数据错误 (如单元内部故障、 驱动器故障、 断线等) 。 由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。 (6)连接节点多。CAN 总线是可同时连接多个单元的总线。可连接的单元 总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。 正是因为 CAN 协议的这些特点, 使得 CAN 特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。 CAN 已通过 ISO11898 及 ISO11519 进行了标准化,这两种标准在物理层的主要不同点如下图所示: 8 h5 O; k1 Y7 D2 K+ s2 C ![]() ![]() 从这两种标准可以看出,ISO11898 标准可以组建一个高速、短距离“闭环 网络”,此标准要求总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个“ 120 欧”的电阻,此电阻可作为阻抗匹配功能,以减少回波反射。而 ISO11519-2 标准可以组建一个低速、远距离“开环网络”,它的最大传输距离为 1km,最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2 千欧”的电阻。 本采用的是ISO11898 标准,从该标准特性图中可以看出,显性电平对应逻辑 0,CAN_H 和 CAN_L 之差为 2.5V 左右。而隐性电平对应逻辑 1,CAN_H 和 CAN_L 之差为 0V。在总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平, 总线上才为隐性电平 (有点类似于I2C 总线 SDA 的 “线与”关系)。 前面我们介绍了 CAN总线具有多节点可组网特性,其网络拓扑结构如下: [attachimg]49**[/attachimg] 从上图可以看到,CAN 总线和 CAN 控制器间需要一个 CAN 收发器将信号进行转换。我们开发板上使用的 CAN收发器是 TJA1040。 CAN 通信主要是通过 5 种类型的帧进行,分别是数据帧、遥控帧、错误帧、过载帧和帧间隔。 其中数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(ID),扩展格式有 29 个位的 ID。各种帧的用途如下图所示: + Y3 B V5 ~. Z' s; Z! ] ![]() 由于篇幅所限,我们这里仅对数据帧进行详细介绍,数据帧一般由 7 个段 构成,即: (1)帧起始。表示数据帧开始的段。 (2)仲裁段。表示该帧优先级的段。 (3)控制段。表示数据的字节数及保留位的段。 (4)数据段。数据的内容,一帧可发送 0~8 个字节的数据。 (5)CRC 段。检查帧的传输错误的段。 (6)ACK 段。表示确认正常接收的段。 (7)帧结束。表示数据帧结束的段。 数据帧的构成如下图所示: ![]() 图中 D 表示显性电平, R 表示隐形电平(下同)。 ①.帧起始是由 1 个位的显性电平表示,标准帧和扩展帧相同。 ②.仲裁段,表示数据优先级的段,标准帧和扩展帧格式在本段有所区别, 如下图所示: 8 z0 _) I) G9 g8 ~+ l% M1 [ ![]() 从图中可以看出,标准格式的 ID 有 11 个位。从 ID28 到 ID18 被依次发 送。禁止高 7 位都为隐性(禁止设定:ID=1111111XXXX)。扩展格式的 ID 有29 个位。基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0 表示。基本 ID和标准格式的 ID 相同。禁止高 7 位都为隐性(禁止设定:基本ID=1111111XXXX)。 其中 RTR 位用于标识是否是远程帧( 0,数据帧;1,远程帧), IDE 位 为标识符选择位( 0,使用标准标识符;1,使用扩展标识符), SRR 位为代替远程请求位,为隐性位,它代替了标准帧中的 RTR 位。 ③.控制段由 6 个位构成,表示数据段的字节数。标准帧和扩展帧的控制 段稍有不同,如下图所示: ![]() 上图中, r0 和 r1 为保留位。保留位必须全部以显性电平发送,但接收方可以接收显性、隐性及其任意组合的电平。DLC 为数据长度码,数据长度码与数据的字节数的对应关系如下图所示: ![]() 数据的字节数必须为 0~8 字节。但接收方对 DLC = 9~15 的情况并不视 为错误。 ④.数据段,该段可包含 0~8 个字节的数据。从 MSB(最高位)开始输出, 标准帧和扩展帧此段相同。如下图所示: ![]() ⑤.CRC 段,该段用于检查帧传输错误。由 15 个位的 CRC 顺序和 1 个位 的 CRC 界定符(用于分隔的位)构成,标准帧和扩展帧此段也是相同的。如下图所示: ![]() CRC 顺序是根据多项式生成的 CRC 值, CRC 的计算范围包括帧起始、仲裁段、控制段、数据段。接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。 ⑥.ACK 段,此段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界 定符 2 个位构成。标准帧和扩展帧此段也是相同的。如下图所示: 4 Z* w8 ^6 E/ R) Y" o, ` ![]() 发送单元在 ACK 段发送 2 个位的隐性位。接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位, 通知发送单元正常接收结束。这称作“发送 ACK” 或者“返回 ACK”。发送 ACK 的是在既不处于总线关闭态也不处于休眠态的所 有接收单元中,接收到正常消息的单元(发送单元不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、 CRC 错误的消息。 ⑦.帧结束,它表示该帧的结束的段,由 7 个位的隐性位构成。标准帧和 扩展帧此帧是相同的。如下图所示: ![]() 到这里,我们就将数据帧的 7 个段介绍完了,其他帧的介绍,大家可以参 考《can入门教程》相关章节。接下来,我们再来看看 CAN 的位时序。 由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。 · 同步段( SS) · 传播时间段( PTS) · 相位缓冲段 1( PBS1) · 相位缓冲段 2( PBS2) 这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。 1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。 1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和 Tq 数如下图所示: ![]() 1 个位的构成如下图所示: ![]() 上图中的采样点是指读取总线电平,并将读到的电平作为位值的点。位置在PBS1 结束处。根据这个位时序,我们就可以计算 CAN 通信的波特率了。具体计算方法,我们等下再介绍,前面提到的 CAN 协议具有仲裁功能,下面我们来看看是如何实现的。 在总线空闲态,最先开始发送消息的单元获得发送权。当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。仲裁的过程如下图所示: / I, t7 _3 V/ L/ o/ V1 {![]() 从上图中可以看到,单元 1 和单元 2 同时开始向总线发送数据,开始部分 他们的数据格式是一样的,故无法区分优先级,直到图中红色部分时刻,单元 1输出隐性电平,而单元 2 输出显性电平,此时单元 1 仲裁失利,立刻转入接收状态工作,不再与单元 2 竞争,而单元 2 则顺利获得总线使用权,继续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。 通过以上介绍,我们对 CAN 总线有了个大概了解,接下来我们介绍下 STM32F1 的 CAN 控制器。 1 I6 K% u2 x! K1 L |
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化
【Hot!】STM32全系列开发板都支持Arduino开发,你知道吗?
【经验分享】STM32 HAL库移植FreeModbus详细步骤