当前位置:   article > 正文

STM32学习100步之第六十一-六十四步——CAN总线协议_can邮箱号不一样可以接受文件吗

can邮箱号不一样可以接受文件吗

CAN总线介绍

CAN是Controller Area Network的缩写(以下称为CAN)是ISO国际标准化的串行通信协议。
由德国电气商博世公司在1986年率先提出。
此后,CAN通过ISO1 1 898及IS011519进行了标准化。现在在欧洲已是汽车网络的标准协议。
CAN协议经过ISO标准化后有两个标准: ISO1 1 898标准和ISO11519- 2标准。其中ISO1 1898是针对通信速率为125Kbps~1 Mbps的高速通信标准,而ISO1 1519-2是针对通信速率为125Kbps以下的低速通信标准。

CAN接口兼容规范2.0A和2.0B(主动),位速率高达1兆位/秒。它可以接收和发送11位标识符的标准帧,也可以接收和发送29位标识符的扩展帧。具有3个发送邮箱和2个接收FIFO,3级14个可调节的滤波器。

CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、,医疗设备、工业设备等方面。

CAN总线的通信层级

在这里插入图片描述

CAN总线优势

多主控制。总线空闲时,所有单元都可发送消息,而两个以上的单元同时开始发送消息时,根据标识符(ID,非地址)决定优先级。两个以上的单元同时开始发送消息时,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。系统柔软性。连接总线的单元,没有类似“地址”的信息,因此,在总线上添加单元时,已连接的其他单元的软硬件和应用层都不需要做改变。速度快,距离远。最高1Mbps (距离<40M),最远可达10KM ( 速率<5Kbps)。

同时具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误( 错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。

故障封闭功能。CAN可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线_上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。

连接节点多。CAN总线是可同时连接多个单元的总线。可连接的单元总数理论.上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
在这里插入图片描述

CAN总线发送部分

报文: CAN设备一次发送出去的完整数据信息
邮箱:用于发送报文的发送调度器
帧种类:不同用途的报文种类。有数据帧、遥控帧、错误帧、过载帧、帧间隔
帧格式:一个报文里包含的内容。
标识符: CAN总线上的设备可以用此判断数据是不是发给自己的。

帧的格式表如下:

在这里插入图片描述

所有CAN设备连接在CAN总线上的原理图如下:

在这里插入图片描述

其中报文的图标如下图:

在这里插入图片描述

两种格式下的寄存器配置如下图:

在这里插入图片描述
在这里插入图片描述

CAN控制器的发送端由三个邮箱组成,分别为1号、2号、3号,当单片机发送数据时,根据优先级的不同(邮箱1的优先级最高),先给邮箱1号传输数据,当邮箱1号存满时,会不断检测总线上的设备是否处于能接收的状态,若总线繁忙,则其处于等待状态,即一旦邮箱被存满之后,其必然处于发送状态或者等待状态,这时如果再有数据传输过来,若邮箱1中的数据还未被发送完,则存入第2号邮箱,以此类推,此种方式的优点是发送的任务由CPU交给了邮箱,而CPU不必处于等待发送状态,因此效率较高,发送方式如下图:

在这里插入图片描述

发送数据的数量

一次最多只能发送8个字节的数据,这是由CAN协议规定的。多于8个的需要第二次再发送,或者做一个上层的连续多数据发送的函数。

接收端有两个FIFO邮箱和过滤器

过滤器组
过滤器:可由硬件判断报文中的标识符,过滤掉标识符不匹配的报文。STM32F103系列单片机中的CAN总线控制器提供了14个过滤器组。过滤器是由硬件实现的,只有与过滤器匹配的报文才需要软件处理。

由于报文的标识符有两种方式,因此过滤器也有16位和32位的位宽之分,另外过滤器也有两种工作方式,其配置如下表所示:在这里插入图片描述
所谓的标识符列表方式是设定好过滤器的ID之后,与报文的ID进行对比,必须二者完全相同才允许通过。

在这里插入图片描述

屏蔽匹配模式的介绍如下图所示:

在这里插入图片描述
这里仅仅做8位的比较,实际情况是16位或者32位的比较。

由相应的寄存器设置可以将过滤器组一一标号,如下图所示:

在这里插入图片描述

列表过滤器和屏蔽过滤器的优先级不同,具体的判断报文标识符格式如下:

在这里插入图片描述

接收邮箱

FIFO: 表面的意思是“先入先出”,是指有层级深度的接收邮箱。STM32F103系列单片机.上有2个FIFO邮箱,每个FIFO有3层深度。与过滤器匹配的报文会被放入FIFO邮箱。
在这里插入图片描述

波特率

CAN总线是基于相同波特率通信的,所以设备接入前要知道总线上的波特率是多少。
波特率=(pclk1/((1 +8+7)*9))= 36Mhz/16/9= 250Kbits

具体的修改参数值可在下面修改波特率:

//设置模式和波特率
//波特率=(pclk1/((1+8+7)*9)) = 36Mhz/16/9 = 250Kbits设定了一个时间单位的长度9
#define tsjw	CAN_SJW_1tq	//设置项目(1~4)
#define tbs1	CAN_BS1_8tq	//设置项目(1~16)
#define tbs2	CAN_BS2_7tq	//设置项目(1~8)
#define brp		9	//设置项目
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

过滤器函数的设置如下:

	//设置过滤器
    CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;   //屏蔽位模式
    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;  //32位宽 
    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;    //32位ID
    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0
    CAN_FilterInit(&CAN_FilterInitStructure);           //滤波器初始化
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
可通过上面的函数具体设定需要检测的标识符的值,本次设定的是所有的值均可通过,无屏蔽,并且值得注意的是将过滤器组0关联到了FIFO0邮箱,值得注意的是每个过滤器组由两个32位寄存器,根据设定方式的不同可以拆分成几个小的滤波器。

具体使用CAN总线时,如果总线上只有两个设备,则使用方法基本和SART相同,同时具备了CAN总线的优势,方式完全相同,若有多个设备,则需要考虑CAN的通信协议。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/489389
推荐阅读
相关标签
  

闽ICP备14008679号