嵌入式单片机基础篇(三十九)之CAN通讯以及STM32F1单片机程序

CAN通讯以及STM32F1单片机程序1、CAN通讯基本概念:(1)定义:CAN是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。由德国电气商博世公司在1986 年率先提出。此后,CAN 通过ISO11898 及ISO11519 进行了标准化。现在在欧洲已是汽车网络的标准协议。CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准
摘要由CSDN通过智能技术生成

CAN通讯以及STM32F1单片机程序

1、CAN通讯基本概念:

(1)定义:
CAN是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。由德国电气商博世公司在1986 年率先提出。此后,CAN 通过ISO11898 及ISO11519 进行了标准化。现在在欧洲已是汽车网络的标准协议。
CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。
其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准(闭环),而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准(开环)。
注:
Kbps:总线的通信速率,指的是位速率。或称为比特率(和波特率不是一回事),表示的是:单位时间内,通信线路上传输的二进制位的数量,其基本单位是 bps 或者 b/s (bit per second)。(依据位时序实现传输数据的同步)
CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。
(2)特点:
①,多主控制。总线空闲时,所有单元都可发送消息,而两个以上的单元同时开始发送消息时,根据标识符(ID,非地址)决定优先级。两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较。仲裁获胜(优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
②,系统柔软性。 连接总线的单元,没有类似“地址”的信息,因此,在总线上添加单元时,已连接的其他单元的软硬件和应用层都不需要做改变。
③,速度快,距离远。 最高1Mbps(距离<40M),最远可达10KM(速率<5Kbps)。
④ ,具有错误检测、错误通知和错误恢复功能。 所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
⑤,故障封闭功能。 CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
⑥,连接节点多。 CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
(3)硬件构成:
CAN的组成一般有两种方式:一种是CPU与CAN控制器集成到一起、再外接CAN收发器;另一种是CPU与CAN控制器分开的,使用的时候需要配置CAN接口电路。STM32中就是采用第一种方式,将CAN接口集成在芯片内,使用的时候再外接CAN收发器(顾名思义,可发送,可接收),常用的有TJA1050或者82C250。
在这里插入图片描述***(4)数据传输原理:***
CAN通信只由两根线完成的,一条称为CAN_H(CAN High),一条称为CAN_L(CAN Low),共同构成一组差分信号线。整个过程是以差分信号的形式进行通讯的,即信号的逻辑 0 和逻辑 1 由两根差分信号线的电压差来表示。
在这里插入图片描述
CAN 控制器根据CAN_L和CAN_H上的电位差来判断总线电平。总线电平分为显性电平(对应逻辑:0,CAN_H和CAN_L之差为2V左右。)和隐性电平(隐性电平对应逻辑:1,CAN_H和CAN_L之差为0V。),二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
CAN_Rx和CAN_Tx分别是从MCU中接出来的引脚,比如MCU要发送一个逻辑1,则只要将CAN_Tx设置为1,经过CAN收发器转换,CAN_High和CAN_Low 线上的电压均为 2.5v,即传到总线的电压差 Vh-Vl=0V,总线上的状态则就是逻辑1。同样,当CAN_High和CAN_Low 读取到 CAN总线电压分别3.5V和1.5V,即压差为2V,经过收发器转换,MCU则可通过CAN_Rx读取到信号0。
显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在CAN总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。
注:
–发送方通过使总线电平发生变化,将其信息传递到CAN总线上。
–接收方通过监听总线电平,将总线上的消息读入自己的接收器
(5)空闲状态:
所谓的空闲状态就是指没有节点正在传输数据的时候,在CAN协议中,当总线上的上出现连续的11位隐性电平,那么总线就处于空闲状态。也就是说对于任意一个节点而言,只要它监听到总线上连续出现了11位隐性电平,那么该节点就会认为总线当前处于空闲状态。(可以简单的理解为总线在初始状态,每个节点输出的都是隐性电平
(6)帧:
CAN通信是以以下5种类型的帧进行的:
在这里插入图片描述其中,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID 。
(7)数据帧:

在这里插入图片描述 图中D表示显性电平,R表示隐形电平
数据帧由7个段组成:
①,帧起始。
表示数据帧开始的段。标准帧和扩展帧都是由1个位(SOF)的显性电平(0)表示帧起始。(也就是总线出现显性电平时开始传输数据)
②,仲裁段。
在这里插入图片描述
表示该帧优先级的段。
ID:高位在前,低位在后。基本ID,禁止高7位都为隐性,即不能:ID=1111111XXXX。
RTR,远程请求位。0,数据帧;1, 远程帧(命令帧);
SRR,替代远程请求位。设置为1(隐性电平);
IDE,标识符选择位。0,标准标识符;1,扩展标识符;
③,控制段。
表示数据的字节数及保留位的段。
r0,r1:保留位。必须以显现电平发送,但是接收可以是隐性电平。
DLC:数据长度码。0~8,表示发送/接收的数据长度(字节)。
IDE,标识符选择位。0,标准标识符;1,扩展标识符;
④,数据段。
数据的内容,一帧可发送0~8个字节的数据。从最高位(MSB)开始输出
⑤,CRC段。
检查帧的传输错误的段。该段用于检查帧传输错误。由15个位的CRC顺序和1个位的CRC界定符(用于分隔的位)组成。CRC的值计算范围包括:帧起始、仲裁段、控制段、数据段。
接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。
⑥,ACK段。
表示确认正常接收的段。此段用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位组成。
发送单元ACK段:发送2个隐性位。
接收单元ACK段:接收到正确消息的单元,在ACK槽发送显性位,通知发送单元,正常接收结束。称之为 发送ACK /返回ACK。
注意: 发送 ACK的是 既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送ACK)。正常消息是指:不含填充错误、格式错误、CRC 错误的消息。

⑦,帧结束(EOF)。
表示数据帧结束的段。由 7个位的隐性位 组成。
(8)同时多个单元发送数据时,总线仲裁过程(决定发送优先级):
在这里插入图片描述规律:1,总线空闲时,最先发送的单元获得发送优先权,一但发送,其他单元无法抢占。
2,如果有多个单元同时发送,则连续输出显性电平多的单元,具有较高优先级。(仲裁失利的单元会在下一位自动转为接收状态)
从ID开始比较,如果ID相同,还可能会比较RTR和SRR等位。
(9)实现传输发送数据与接收数据同步的核心——位时序
位时序的作用就是为了保证数据同步发送与接收。
位速率。由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位一般可以分为如下四段:
同步段(SS)
传播时间段(PTS)
相位缓冲段1(PBS1)
相位缓冲段2(PBS2)
这些段又由可称为 Time Quantum(以下称为Tq)的最小时间单位构成。
1 位分为4 个段,每个段又由若干个Tq 构成,这称为位时序。
位时间=1/波特率,因此,知道位时间,我们就可以知道波特率。
1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。
在这里插入图片描述
 SS 段(SYNC SEG):同步段,比如当总线上出现帧起始信号(SOF)时,其它节点上的控制器根据总线上的这个下降沿,对自己的位时序进行调整,把该下降沿包含到 SS 段内,这样根据起始帧来进行同步的方式称为硬同步。其中 SS 段的大小为 1Tq。总线上信号的跳变沿被包含在节点的 SS 段的范围之内,则表示节点与总线的时序是同步的,采样点采集到的总线电平即可被确定为该位的电平。
 PTS 段(PROP SEG):传播时间段,这个时间段是用于补偿网络的物理延时时间,包括发送单元的输出延迟、总线上信号的传播延迟、接收单元的输入延迟,这个段的时间为以上各延迟时间的和的两倍。大小可以为 1~8Tq。
 PBS1 段(PHASE SEG1):相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。 PBS1 段的初始大小可以为 1~8Tq。
 PBS2 段(PHASE SEG2):另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。 PBS2 段的初始大小可以为 2~8Tq。
(对于PBS段而言,当信号边沿不能被包含于 SS 段中时,可在此段进行补偿,以及可以吸收时钟误差)
 SJW (reSynchronization Jump Width):重新同步补偿宽度,即在重新同步的时候,PBS1 和 PBS2 段的允许加长或缩短的时间长度,SJW 加大后允许误差加大,但通信速度下降。SJW 为补偿此误差的最大值(即每一次误差补偿都不能超过这个值,1~4Tq)。
在这里插入图片描述注: 图中采样时间加大或减少量的最大值就是SJW
 CAN 的同步分为硬同步和重新同步:

硬同步:在帧起始信号时同步总线上所有器件的位时序,无法确保后续一连串的位时序都是同步的。
重新同步:在检测到总线上的时序与节点使用的时序有相位差时(即总线上的跳变沿不在节点时序的 SS 段范围),通过延长 PBS1 段或缩短 PBS2 段,来获得同步。
采样点: 读取总线电平的时刻,并将读到的电平作为位值的点。位置在 PBS1 结束处。
延长/缩短PBS段来达到同步: PTS+PBS1小而PBS2加大时采样点前移,PTS+PBS1大而PBS2减小时采样点后移。
(10)STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下:
支持CAN协议2.0A和2.0B主动模式
–波特率最高达1Mbps
–支持时间触发通信
–具有3个发送邮箱
–具有3级深度的2个接收FIFO
–可变的筛选器组(也称过滤器组,最多28个)
CAN控制器框图:
在这里插入图片描述CAN的标识符不表示目的地址而是表示发送优先级。接收节点根据标识符的值,来决定是否接收对应消息。
STM32 CAN控制器,提供了28个可配置的筛选器组(F1仅互联型才有28个,其他的只有14个),可降低CPU处理CAN通信的开销。
STM32 CAN控制器每个筛选器组由2个32位寄存器组成(CAN_FxR1和CAN_FxR2,x=0~27)。根据位宽不同,每个筛选器组可提供:
● 1个32位筛选器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位
● 2个16位筛选器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位
筛选器 可配置为:屏蔽位模式标识符列表模式
在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。屏蔽寄存器相应位为1代表必须匹配位,相应位为0代表不用关心。比如:屏蔽寄存器为101,标识符寄存器为001,那么FIFO可接收的报文(数据帧)ID可以为001或者011;
而在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟筛选器标识符相同。比如,标识符寄存器为001,屏蔽寄存器也必须为001,FIFO可接收的报文(数据帧)ID也必须为001。
通过CAN_FM1R和CAN_FS1R可配置筛选器的位宽和模式:
在这里插入图片描述

为了过滤出一组标识符,应该设置筛选器组工作在屏蔽位模式。
为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。
应用程序不用的筛选器组,应该保持在禁用状态(通过CAN_FA1R设置)。
筛选器组中的每个筛选器,都被编号为(即:筛选器编号)从0开始,到某个最大数值-取决于筛选器组的模式和位宽的设置。
通过CAN_FFA1R的设置,可以将筛选器组关联到FIFO0/FIFO1
例:设置筛选器组0工作在:1个32位筛选器-标识符屏蔽模式,然后设置CAN_F0R1=0XFFFF0000,CAN_F0R2=0XFF00FF00。其中存放到CAN_F0R1的值就是期望收到的ID,即(STID+EXTID+IDE+RTR)最好是:0XFFFF0000。而0XFF00FF00就是设置我们需要必须关心的ID,表示收到的映像,其位[31:24]和位[15:8]这16个位的必须和CAN_F0R1中对应的位一模一样,而另外的16个位则不关心,可以一样,也可以不一样,都认为是正确的ID,即收到的映像必须是0XFFxx00xx,才算是正确的(x表示不关心)。
Tx Mailboxes(发送邮箱)
STM32 的 CAN 中共有 3 个发送邮箱供软件来发送报文。发送调度器根据优先级决定哪个邮箱的报文先被发送。
Accepttance Filters( 接收过滤器 )
STM32 的 CAN 中共有 14 个位宽可变/可配置的标识符过滤器组,软件通过对它们编程,从而在 CAN 收到的报文中选择它需要的报文,而把其它报文丢弃掉。
Receive FIFO( 接收 FIFO )
STM32 的 CAN 中共有 2 个接收 FIFO,每个 FIFO 都可以存放 3 个完整的报文。它们完全由硬件来管理。

(11)模式:
–工作模式
①初始化模式(INRQ=1,SLEEP=0)
②正常模式(INRQ=0,SLEEP=0)
③睡眠模式(SLEEP=1)
通过CAN_MCR寄存器控制INRQ和SLEEP
–测试模式
①静默模式( LBKM=0,SILM=1 )
②环回模式( LBKM=1,SILM=0 )
③环回静默模式(LBKM=1,SILM=1)
通过CAN_BTR寄存器控制LBKM和SILM
–调试模式
(12)发送与接收数据流程:
CAN发送流程为:
程序选择1个空置的邮箱(TME=1)设置标识符(ID),数据长度和发送数据>>设置CAN_TIxR的TXRQ位为1,请求发送>>邮箱挂号(等待成为最高优先级)>>预定发送(等待总线空闲)>>发送>>邮箱空置。
在这里插入图片描述CAN接收流程为:
FIFO空>>收到有效报文挂号_1(存入FIFO的一个邮箱,这个由硬件控制,我们不需要理会)>>收到有效报文>>挂号_2>>收到有效报文>>挂号_3>>收到有效报文>>溢出。
在这里插入图片描述CAN收到的有效报文,存储在3级邮箱深度的FIFO中。FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文。
报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,不锁定则新数据将替代老数据
(13)波特率设置:
在这里插入图片描述STM32的CAN将传播时间段和相位缓冲时间段1合并成时间段1
STM32F103,设TS1=8、TS2=7、BRP=3,波特率=36000/[(9+8+1)*4]=500Kbps。
STM32F407,设TS1=6、TS2=5、BRP=5,波特率=42000/[(7+6+1)*6]=500Kbps。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

2、CAN相关寄存器:

(1)CAN主控制寄存器(CAN_MCR)
在这里插入图片描述该寄存器的我们仅介绍下INRQ位,该位用来控制初始化请求。
设置INRQ=0,可使CAN从初始化模式进入正常工作模式。
设置INRQ=1,可使CAN从正常工作模式进入初始化模式 。
CAN初始化时,先设置INRQ=1 ,进入初始化模式,进行初始化(尤其是CAN_BTR的设置,该寄存器,必须在CAN正常工作之前设置),之后再设置INRQ=0,进入正常工作模式。
(2)CAN位时序寄存器(CAN_BTR)
在这里插入图片描述用于设置分频、Tbs1、Tbs2以及 Tsjw 等非常重要的参数,直接决定了 CAN 的波特率,还可以设置 CAN 的工作模式。(保留位由硬件强制为0)
–正常模式,此时SILM=0,LBKM=0,这种状态时节点可以正常向节点发送和接收数据。
–静默模式下,节点的输出端的逻辑0数据会直接传输到自己的输入端,逻辑1可以被发送到总线,所以它不能向总线发送显

  • 11
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值