STM32自学笔记——CAN通讯

STM32⾃学笔记——CAN通讯
⼀.⼯作模式 通过CAN_MCR寄存器控制INRQ和SLEEP
1.初始化INRQ=1 SLEEP=0
软件初始化应该在硬件
2.正常INRQ=0 SLEEP=0
在初始化完成后,软件应该让硬件进⼊正常模式,以便正常接收和发送报⽂
3.睡眠SLEEP=1 bxCAN可⼯作在低功耗的睡眠模式
⼆.测试模式 通过CAN_BTR寄存器控制LBKM和SILM
1. 静默 可以接受不能发送
2. 循回 可以发送不能接受
3.环回静默 只能⾃发⾃收
三.调试模式
STM32标识符筛选器
在CAN协议⾥,报⽂的标识符不代表节点的地址,⽽是跟报⽂的优先级相关的。因此,节点在接收报⽂时-根据标识符的值-决定软件是否需要该报⽂;如果需要,就拷贝到SRAM⾥;如果不需要,报⽂就被丢弃且⽆需软件的⼲预。为满⾜这⼀需求,bxCAN为应⽤程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报⽂。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从⽽占⽤⼀定的CPU开销。
STM32普通型芯⽚的 CAN 有14组过滤器组(互联型有28组过滤器组) ,⽤以对接收到的帧进⾏过滤。每组过滤器包括了2个可配置的32位寄存器:CAN_FxR1和 CAN_FxR2。对于过滤器组,通过设置CAN_FM0R的FBMx位,
1.屏蔽位模式
这样 CAN_FxR0中保存的就是标识符匹配值,CAN_FxR2中保存的是屏蔽码,即 CAN_FxR2中如果某⼀位为1,则 CAN_FxR1中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器。CAN_FxR2中为0的位表⽰ CAN_FxR1中的相应位可不必与收到的帧进⾏匹配。
2.标识符列表模式
此时 CAN_FxR1和CAN_FxR2中的都是要匹配的标识符,收到的帧的标识符必须与其中的⼀个吻合才能通过过滤。
理解:标识符列表模式是为了过滤出⼀个标识符,⽽屏蔽位模式因为屏蔽了某些位所以可以过滤出⼀组标识符,对于不需要⽤筛选器组的应处以禁⽤状态
⼀般我们⽤的都是普通型的,所以在本⽂中可以说 STM32有14组过滤器组。根据配置,每1组过滤器组可以有1个,2个或4个过滤器。这
些过滤器相当于关卡,每当收到⼀条报⽂时,CAN 要先将收到的报⽂从这些过滤器上”过”⼀下,能通过的报⽂是有效报⽂,收进 FIFO,不能通过的是⽆效报⽂(不是发给”我”的报⽂),直接丢弃。通过对两个可配置寄存器值得改变可以选择过滤器的数量。在⼀组过滤器中,整组的过滤器都使⽤同⼀种⼯作模式。
另外,每组过滤器中的过滤器宽度是可变的,可以是32位或16位。按⼯作模式和宽度,⼀个过滤器组可以变成以下⼏中形式之⼀:
(1) 1个32位的屏蔽位模式的过滤器。
(2) 2个32位的列表模式的过滤器。
(3) 2个16位的屏蔽位模式的过滤器。
(4) 4个16位的列表模式的过滤器。
所有的过滤器是并联的,即⼀个报⽂只要通过了⼀个过滤器,就是算是有效的。每组过滤器组有两个32位的寄存器⽤于存储过滤⽤的”标准值”,分别是 FxR1,FxR2。
解读:
1.在32位的屏蔽位模式下:
有1个过滤器。
FxR2⽤于指定需要关⼼哪些位,FxR1⽤于指定这些位的标准值。
2.在32位的列表模式下:
有两个过滤器。
FxR1指定过滤器0的标准值,收到报⽂的标识符只有跟 FxR1完全相同时,才算通过。
FxR2指定过滤器1的标准值。
3.在16位的屏蔽位模式下:
有2个过滤器。
FxR1配置过滤器0,其中,[31-16]位指定要关⼼的位,[15-0]位指定这些位的标准值。
FxR2配置过滤器1,其中,[31-16]位指定要关⼼的位,[15-0]位指定这些位的标准值。
4.在16位的列表模式下:
有4个过滤器。
FxR1的[15-0]位配置过滤器0,FxR1的[31-16]位配置过滤器1。
FxR2的[15-0]位配置过滤器2,FxR2的[31-16]位配置过滤器3。
FIFO
STM32的 CAN 有两个 FIFO,分别是 FIFO0和 FIFO1。为了便于区分,下⾯ FIFO0写作FIFO_0,FIFO1写作 FIFO_1。
每组过滤器组必须关联且只能关联⼀个 FIFO。复位默认都关联到 FIFO_0。所谓“关联”是指假如收到的报⽂从某个过滤器通过了,那么该报⽂会被存到该过滤器相连的 FIFO。从另⼀⽅⾯来说,每个 FIFO 都关联了⼀串的过滤器组,两个 FIFO 刚好⽠分了所有的过滤器组。每当收到⼀个报⽂,CAN 就将这个报⽂先与 FIFO_0关联的过滤器⽐较,如果被匹配,就将此报⽂放⼊ FIFO_0中。如果不匹配, 再将报⽂与 FIFO_1关联的过滤器⽐较, 如果被匹配, 该报⽂就放⼊ FIFO_1中。如果还是不匹配,此报⽂就被丢弃。
每个 FIFO 的所有过滤器都是并联的,只要通过了其中任何⼀个过滤器,该报⽂就有效。如果⼀个报⽂既符合 FIFO_0的规定,⼜符合
FIFO_1的规定,显然,根据操作顺序,它只会放到 FIFO_0中。
每个 FIFO 中只有激活了的过滤器才起作⽤,换句话说,如果⼀个 FIFO 有20个过滤器,但是只激话了5个,那么⽐较报⽂时,只拿这5个过滤器作⽐较。⼀般要⽤到某个过滤器时,在初始化阶段就直接将它激活。需要注意的是,每个 FIFO 必须⾄少激活⼀个过滤器,它才有可能收到报⽂。如果⼀个过滤器都没有激活,那么是所有报⽂都报废的。⼀般的,如果不想⽤复杂的过滤功能, FIFO 可以只激活⼀组过滤器组,且将它设置成 32位的屏蔽位模式,两个标准值寄存器(FxR1,FxR2)都设置成0。这样所有报⽂均能通过。(STM32提供的例程⾥就是这么做的! )
过滤器匹配序号
过滤器编号⽤于加速 CPU 对收到报⽂的处理。收到⼀个有效报⽂时, CAN 会将收到的报⽂ 以及它所通过的过滤器编号, ⼀起存⼊接
邮箱中。CPU 在处理时,可以根据过滤器编号,快速的知道该报⽂的⽤途,从⽽作出相应处理。
不⽤过滤器编号其实也是可以的, 这时候 CPU 就要分析所收报⽂的标识符, 从⽽知道报⽂的⽤途。
由于标识符所含的信息较多,处理起来就慢⼀点了。
STM32使⽤以下规则对过滤器编号:
(1) FIFO_0和 FIFO_1的过滤器分别独⽴编号,均从0开始按顺序编号。
(2) 所有关联同⼀个 FIFO 的过滤器,不管有没有被激活,均统⼀进⾏编号。
(3) 编号从0开始,按过滤器组的编号从⼩到⼤,按顺序排列。
(4) 在同⼀过滤器组内,按寄存器从⼩到⼤编号。FxR1配置的过滤器编号⼩,FxR2配置
的过滤器编号⼤。
(5) 同⼀个寄存器内,按位序从⼩到⼤编号。[15-0]位配置的过滤器编号⼩,[31-16]位
配置的过滤器编号⼤。
(6) 过滤器编号是弹性的。 当更改了设置时,每个过滤器的编号都会改变。
但是在设置不变的情况下,各个过滤器的编号是相对稳定的。
这样,每个过滤器在⾃⼰在 FIFO 中都有编号。
在 FIFO_0中,编号从0 – (M-1), 其中 M 为它的过滤器总数。
在 FIFO_1中,编号从0 – (N-1),,其中 N 为它的过滤器总数。
⼀个 FIFO 如果有很多的过滤器,,可能会有⼀条报⽂, 在⼏个过滤器上均能通过,这时
候,,这条报⽂算是从哪⼉过来的呢?
STM32在使⽤过滤器时,按以下顺序进⾏过滤:
(1) 位宽为32位的过滤器,优先级⾼于位宽为16位的过滤器。
(2) 对于位宽相同的过滤器,标识符列表模式的优先级⾼于屏蔽位模式。
(3) 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号⼩的优先级⾼。
按这样的顺序,报⽂能通过的第⼀个过滤器,就是该报⽂的过滤器编号,被存⼊接收邮箱中。
上⾯的例⼦说明了bxCAN的过滤器规则:在接收⼀个报⽂时,其标识符⾸先与配置在标识符列表模式下的过滤器相⽐较;如果匹配上,报⽂就被存放到相关联的FIFO中,并且所匹配的过滤器的序号被存⼊过滤器匹配序号中。如同例⼦中所显⽰,报⽂标识符跟#4标识符匹配,因此报⽂内容和FMI4被存⼊FIFO。如果没有匹配,报⽂标识符接着与配置在屏蔽位模式下的过滤器进⾏⽐较。如果报⽂标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报⽂,且不会对软件有任何打扰。
发送
发送报⽂的流程
应⽤程序选择1个空置的发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR寄存器的TXRQ位置’1’,来请求发送。TXRQ位置’1’后,邮箱就不再是空邮箱;⽽⼀旦邮箱不再为空置,软件对邮箱寄存器就不再有写的权限。 TXRQ位置1后,邮箱马上进⼊挂号状态,并等待成为最⾼优先级的邮箱,参见发送优先级。⼀旦邮箱成为最⾼优先级的邮箱,其状态就变为预定发送状态。⼀旦CAN总线进⼊空闲状态,预定发送邮箱中的报⽂就马上被发送(进⼊发送状态)。⼀旦邮箱中的报⽂被成功
发送后,它马上变为空置邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明⼀次成功发送。如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置’1’,由于发送错误引起的就对TERR位置’1’。
发送优先级
⼀.标识符决定
当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报⽂的标识符决定。根据CAN协议,标识符数值最低的报⽂具有最⾼的优先级。如果标识符的值相等,那么邮箱号⼩的报⽂先被发送。由发送请求次序决定。
⼆.由发送请求次序决定
通过对CAN_MCR寄存器的TXFP位置’1’,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。该模式对分段发送很有⽤。
中⽌
通过对CAN_TSR寄存器的ABRQ位置’1’,可以中⽌发送请求。邮箱如果处于挂号或预定状态,发送请
求马上就被中⽌了。如果邮箱处于发送状态,那么中⽌请求可能导致2种结果。如果邮箱中的报⽂被成功发送,那么邮箱变为空置邮箱,并且CAN_TSR寄存器的TXOK位被硬件置’1’。如果邮箱中的报⽂发送失败了,那么邮箱变为预定状态,然后发送请求被中⽌,邮箱变为空置邮箱且TXOK位被硬件
清’0’。因此如果邮箱处于发送状态,那么在发送操作结束后,邮箱都会变为空置邮箱。
接受
接受流程
FIFO从空状态开始,在接收到第⼀个有效的报⽂后, FIFO状态变为挂号_1(pending_1),硬件相应地把CAN_RFR寄存器的FMP[1:0]设置为’01’(⼆进制01b)。软件可以读取FIFO输出邮箱来读出邮箱中的报⽂,然后通过对CAN_RFR寄存器的RFOM位设置’1’来释放邮箱,这样FIFO⼜变为空状态了。如果在释放邮箱的同时,⼜收到了⼀个有效的报⽂,那么FIFO仍然保留在挂号_1状态,软件可以读取FIFO 输出邮箱来读出新收到的报⽂。如果应⽤程序不释放邮箱,在接收到下⼀个有效的报⽂后, FIFO状态变为挂号_2(pending_2),硬件相应地把FMP[1:0]设置为’10’(⼆进制10b)。重复上⾯的过程,第三个有效的报⽂把FIFO变为挂号_3状态(FMP[1:0]=11b)。此时,软件必须对RFOM位设置1来释放邮箱,以便FIFO可以有空间来存放下⼀个有效的报⽂;否则,下⼀个有效的报⽂到来时就会导致⼀个报⽂的丢失。
溢出

本文发布于:2024-09-21 00:48:56,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/89014.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:过滤器   邮箱   发送   标识符   模式   状态
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议