stm32的can配置,获取标识符(ID)
关于stm32的can的特性,从手册上可以查到:
手册上面的内容比较杂,所以截取了一些有用的片段:(大家也可以查看手册,)

关于can的硬件接线:



寄存器的主要功能:

整个的流程可以从这张图中看出,这张图是很重要的:
从下面这张图中,可以看出很多东西,可以看出数据流,
1,从图中可以看出,stm32里有两个can;
2,从图中可以看出,stm32里每个can有3个发送邮箱,两个接收fifo,每个fifo有三个深度.
3,从图中可以看出,数据经过过滤器,进入到fifo,需要设置过滤器决定数据进入哪个fifo.
实际上,can的fifo0和fifo1是两个不同的中断名字,



can的发送:

上面的图片说明了发送的过程,
发送前,需要将CAN_TIxR的TXRQ位置1,用来表示有数据要发送.
选择一个邮箱,这个邮箱的选择是硬件自己完成的,根据CAN的结构图(上面),
可以看出有0,1,2这三个发送邮箱,但是用那个邮箱是你决定不了的,需要根据规则:
硬件自己会查询当前哪个邮箱是空的,如果哪个邮箱有空闲,就先用哪个.
当有多个邮箱被装满数据的时候,哪个会先发送? 这里有两个方法,可以通过软件挑选:
方法一:发送顺序有邮箱中存储消息的标识符来确定,如果标识符一样,则按照邮箱号小的发送.(可以理解为按照紧急程度发送); 这里会出现一些奇怪的现象,就是你先发A后发B,对方可能现接受到B然后再接收到A.因为B比较紧急,所以即使先发送了A,也不一定第一个收到A.
方法二:按照请求顺序发送,通过设置CAN_MCR寄存器中的TXFP位,变成FIFO模式发送,这样就会按照请求顺序发送.(可以认为,先到先发); 这个模式对分段发送很有用,如果你的数据特别长,需要分成好几条报文,那么就用方法二.
等待总线变空闲,空闲后就会发送了.
检测是否发送成功,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这个结构体里面,可以看到结构体的定义,

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


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