本章我们将向大家介绍如何使用STM32自带的CAN控制器来实现两个开发板之间的CAN通讯,并将结果显示在TFTLCD模块上。本章分为如下几个部分:
30.1 CAN简介
30.2 硬件设计
30.3 软件设计
30.4 下载验证
30.1 CAN简介
CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。
现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。
CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
CAN协议具有一下特点:
1) 多主控制。在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
2) 系统的若软性。与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
3) 通信速度较快,通信距离远。最高1Mbps(距离小于40M),最远可达10KM(速率低于5Kbps)。
4) 具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
5) 故障封闭功能。CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
6) 连接节点多。CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
正是因为CAN协议的这些特点,使得CAN特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。
CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。
本章,我们使用的是450Kbps的通信速率,使用的是ISO11898标准,该标准的物理层特征如图30.1.1所示:
图30.1.1 ISO11898物理层特性
注:ISO11898标准和ISO11519-2标准下,显性电平和隐形电平定义是有区别的。只不过都是隐形电平为1,显性电平为0.
l 数据帧
l 要控帧
l 错误帧
l 过载帧
l 帧间隔
另外,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID。各种帧的用途如表30.1.1所示:
帧类型
帧用途
数据帧
用于发送单元向接收单元传送数据的帧
遥控帧
用于接收单元向具有相同 ID 的发送单元请求数据的帧
错误帧
用于当检测出错误时向其它单元通知错误的帧
过载帧
用于接收单元通知其尚未做好接收准备的帧
间隔帧
用于将数据帧及遥控帧与前面的帧分离开来的帧
表30.1.1 CAN协议各种帧及其用途
(1) 帧起始。表示数据帧开始的段。
(2) 仲裁段。表示该帧优先级的段。
(3) 控制段。表示数据的字节数及保留位的段。
(4) 数据段。数据的内容,一帧可发送0~8个字节的数据。
(5) CRC段。检查帧的传输错误的段。
(6) ACK段。表示确认正常接收的段。
(7) 帧结束。表示数据帧结束的段。
数据帧的构成如图30.1.2所示:
图30.1.2 数据帧的构成
图中D表示显性电平,R表示隐形电平(下同)。
帧起始,这个比较简单,标准帧和扩展帧都是由1个位的显性电平表示帧起始。
仲裁段,表示数据优先级的段,标准帧和扩展帧格式在本段有所区别,如图30.1.3所示:
图30.1.3 数据帧仲裁段构成
标准格式的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个位构成,表示数据段的字节数。标准帧和扩展帧的控制段稍有不同,如图30.1.4所示:
图30.1.4 数据帧控制段构成
数据段,该段可包含0~8个字节的数据。从最高位(MSB)开始输出,标准帧和扩展帧在这个段的定义都是一样的。如图30.1.5所示:
图30.1.5 数据帧数据段构成
图30.1.6 数据帧CRC段构成
图30.1.7 数据帧CRC段构成
发送单元的ACK,发送2个位的隐性位,而接收到正确消息的单元在ACK槽(ACK Slot)发送显性位,通知发送单元正常接收结束,这个过程叫发送ACK/返回ACK。发送 ACK 的是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。
帧结束,这个段也比较简单,标准帧和扩展帧在这个段格式一样,由7个位的隐性位组成。
由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。
l 同步段(SS)
l 传播时间段(PTS)
l 相位缓冲段1(PBS1)
l 相位缓冲段2(PBS2)
这些段又由可称为 Time Quantum(以下称为Tq)的最小时间单位构成。
1 位分为4 个段,每个段又由若干个Tq 构成,这称为位时序。
1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和 Tq 数如表30.1.2所示:
表30.1.2 一个位各段及其作用
图30.1.8 一个位的构成
在总线空闲态,最先开始发送消息的单元获得发送权。
当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。实现过程,如图30.1.9所示:
图30.1.9 CAN总线仲裁过程
STM32的bxCAN的主要特点有:
l 支持CAN协议2.0A和2.0B主动模式
l 波特率最高达1Mbps
l 支持时间触发通信
l 具有3个发送邮箱
l 具有3级深度的2个接收FIFO
l 可变的过滤器组(最多28个)
在STM32互联型产品中,带有2个CAN控制器,而我们使用的STM32F103ZET6属于增强型,不是互联型,只有1个CAN控制器。双CAN的框图如图30.1.10所示:
图30.1.10 双CAN框图
STM32每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:
● 1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位
● 2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位
此外过滤器可配置为,屏蔽位模式和标识符列表模式。
在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。
而在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。
通过CAN_FMR寄存器,可以配置过滤器组的位宽和工作模式,如图30.1.11所示:
图30.1.11 过滤器组位宽模式设置
为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。
为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。
应用程序不用的过滤器组,应该保持在禁用状态。
过滤器组中的每个过滤器,都被编号为(叫做过滤器号,图30.1.11中的n)从0开始,到某个最大数值-取决于过滤器组的模式和位宽的设置。
图30.1.12 发送邮箱
图30.1.13 FIFO接收报文
图30.1.14 STM32 CAN位时序
图30.1.15 寄存器CAN_MCR各位描述
该寄存器的详细描述,请参考《STM32参考手册》22.9.2节(439页),这里我们仅介绍下INRQ位,该位用来控制初始化请求。
软件对该位清0,可使CAN从初始化模式进入正常工作模式:当CAN在接收引脚检测到连续的11个隐性位后,CAN就达到同步,并为接收和发送数据作好准备了。为此,硬件相应地对CAN_MSR寄存器的INAK位清’0’。
软件对该位置1可使CAN从正常工作模式进入初始化模式:一旦当前的CAN活动(发送或接收)结束,CAN就进入初始化模式。相应地,硬件对CAN_MSR寄存器的INAK位置’1’。
所以我们在CAN初始化的时候,先要设置该位为1,然后进行初始化(尤其是CAN_BTR的设置,该寄存器,必须在CAN正常工作之前设置),之后再设置该位为0,让CAN进入正常工作模式。
第二个,我们介绍CAN位时序寄存器(CAN_BTR),该寄存器用于设置分频、Tbs1、Tbs2以及Tsjw等非常重要的参数,直接决定了CAN的波特率。另外该寄存器还可以设置CAN的工作模式,该寄存器各位描述如图30.1.16所示:
图30.1.16 寄存器CAN_BTR各位描述
在环回模式下,bxCAN把发送的报文当作接收的报文并保存(如果可以通过接收过滤)在接收邮箱里。也就是环回模式是一个自发自收的模式,如图30.1.17所示:
图30.1.17 CAN环回模式
环回模式可用于自测试。为了避免外部的影响,在环回模式下CAN内核忽略确认错误(在数据/远程帧的确认位时刻,不检测是否有显性位)。在环回模式下,bxCAN在内部把Tx输出回馈到Rx输入上,而完全忽略CANRX引脚的实际状态。发送的报文可以在CANTX引脚上检测到。
图30.1.18 寄存器CAN_TIxR各位描述
图30.1.19 寄存器CAN_TDLxR各位描述
第七个,我们介绍CAN过滤器模式寄存器(CAN_FM1R),该寄存器各位描述如图30.1.20所示:
图30.1.20 寄存器CAN_FM1R各位描述
图30.1.21 寄存器CAN_FS1R各位描述
图30.1.22 寄存器CAN_FFA1R各位描述
图30.1.23 寄存器CAN_FiRx各位描述
1)配置相关引脚的复用功能,使能CAN时钟。
我们要用CAN,第一步就要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA11为上拉输入(CAN_RX引脚)PA12为复用输出(CAN_TX引脚),并使能PA口的时钟
2)设置CAN工作模式及波特率等。
这一步通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其他相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。 最后设置INRQ为0,退出初始化模式。
3)设置滤波器。
本章,我们将使用滤波器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,让过滤器组工作在初始化模式下,然后设置滤波器组0的工作模式以及标识符ID和屏蔽位。最后激活滤波器,并退出滤波器初始化模式。
至此,CAN就可以开始正常工作了。如果用到中断,就还需要进行中断相关的配置,本章因为没用到中断,所以就不作介绍了。
30.2 硬件设计
本章要用到的硬件资源如下:
1) 指示灯DS0
2) KEY0和WK_UP按键
3) TFTLCD模块
4) CAN
5) CAN收发芯片JTA1050
前面3个之前都已经详细介绍过了,这里我们介绍STM32与TJA1050连接关系,如图30.2.1所示:
图30.2.1 STM32与TJA1050连接电路图
这里还要注意,我们要设置好开发板上P13排针的连接,通过跳线帽将PA11和PA12分别连接到CRX(CAN_RX)和CTX(CAN_TX)上面,如图30.2.2所示:
图30.2.2 硬件连接示意图
来源