欢迎光临散文网 会员登陆 & 注册

stm32的can配置,获取标识符(ID)

2021-06-07 17:38 作者:GXTon_阿通  | 我要投稿

关于stm32的can的特性,从手册上可以查到:

手册上面的内容比较杂,所以截取了一些有用的片段:(大家也可以查看手册,)

关于can的硬件接线:

寄存器的主要功能:

整个的流程可以从这张图中看出,这张图是很重要的:

从下面这张图中,可以看出很多东西,可以看出数据流,

1,从图中可以看出,stm32里有两个can;

2,从图中可以看出,stm32里每个can有3个发送邮箱,两个接收fifo,每个fifo有三个深度.

3,从图中可以看出,数据经过过滤器,进入到fifo,需要设置过滤器决定数据进入哪个fifo.

  实际上,can的fifo0和fifo1是两个不同的中断名字,

can的发送:

上面的图片说明了发送的过程,

  1. 发送前,需要将CAN_TIxR的TXRQ位置1,用来表示有数据要发送.

  2. 选择一个邮箱,这个邮箱的选择是硬件自己完成的,根据CAN的结构图(上面),

    可以看出有0,1,2这三个发送邮箱,但是用那个邮箱是你决定不了的,需要根据规则:

    硬件自己会查询当前哪个邮箱是空的,如果哪个邮箱有空闲,就先用哪个.

  3. 当有多个邮箱被装满数据的时候,哪个会先发送? 这里有两个方法,可以通过软件挑选:

    方法一:发送顺序有邮箱中存储消息的标识符来确定,如果标识符一样,则按照邮箱号小的发送.(可以理解为按照紧急程度发送); 这里会出现一些奇怪的现象,就是你先发A后发B,对方可能现接受到B然后再接收到A.因为B比较紧急,所以即使先发送了A,也不一定第一个收到A.

    方法二:按照请求顺序发送,通过设置CAN_MCR寄存器中的TXFP位,变成FIFO模式发送,这样就会按照请求顺序发送.(可以认为,先到先发); 这个模式对分段发送很有用,如果你的数据特别长,需要分成好几条报文,那么就用方法二.

  4. 等待总线变空闲,空闲后就会发送了.

  5. 检测是否发送成功,can发送出数据后,还会检测是否发送成功,这个是硬件帮助我们完成的,如果发送成功,CAN_TSR寄存器的RQCP和TXOK会置一.

    如果发送失败,CAN_TSR寄存器的ALST位(仲裁丢失) \ TERR位(发送错误)会置一.

    这也是can的优点,它发送完成之后会检测是否成功.

can会帮助我们完成很多事,比如重新发送,只需要操作寄存器就可以,并不需要软件的重新发送,硬件会自动重发失败的信息,如果不需要这个功能,可以通过配置寄存器关闭,

下面是邮箱发送的过程中,这个邮箱寄存器变化图,这个图也很重要,它可以帮助啊我们了解整个的过程:(要记住一些必要的寄存名字,这样看起来会舒服些,也容易弄懂)

can的接收

接收缓存的寄存器变化.

根据can的结构框图(上面),可以看到一个can有两个FIFO,分别是FIFO0和FIFO1,FIFO是硬件管理的.

FIFO的长度是有限的,如果超出,就会溢出,

溢出的处理有两种方法,

筛选器的配置:

一共有28个或14个筛选器组.

筛选器组,可以进行伸缩配置,分为,一个32位的筛选器,或两个16位的筛选器.

筛选器组的用法,掩码模式和标识符列表模式.

筛选器的配置模式,

can的错误管理:

邮箱的构成:

如何获取can接收到的数据:

首先从库里调用函数,

can接收到的数据都到了RxMessage中,

原型是,(里面就有获取ID)

注意CanRxMsg这个结构体

跳进,CanRxMsg这个结构体里面,可以看到结构体的定义,

然后就可以查看手册,和它的英文说明,就可以知道接收的都是些什么了.

手册上的说明,

参考:

https://blog.csdn.net/Leisure_ksj/article/details/106788852

stm32的can配置,获取标识符(ID)的评论 (共 条)

分享到微博请遵守国家法律