STM32 CAN 通信滤波器配置总结 2012-09-20 16:28:34| 分类: 默认分类|举报|字号订阅首先声明 stm32 手册写的太蛋疼,让我看了好长时间没看懂,后来根据实践再回头看了,才看懂一些,在这里还要感激网友发表的博客,下面内容为转载: 一、在 STM32 互联型产品中, CAN1 和 CAN2 分享 28 个过滤器组,其它 STM32F103xx 系列产品中有 14 个过滤器组,用以对接收到的帧进行过滤。每组过滤器包括了 2个可配置的 32 位寄存器: CAN_FxR0 和 CAN_FxR1 。这些过滤器相当于关卡,每当收到一条报文时, CAN 要先将收到的报文从这些过滤器上"过"一下,能通过的报文是有效报文,收进相关联 FIFO ( FIFO1 或 FIFO2 ), 不能通过的是无效报文(不是发给"我"的报文),直接丢弃。(标准 CAN 的标志长度是 11 位。扩展格式 CAN 的标志长度是 29 。 协议规定 CAN 控制器必须有一个 11 位的标识符。 协议中规定 CAN 控制器的标示符长度可以是 11 位或 29 位。 STM32 同时支持 协议。) 每组过滤器组有两种工作模式:标识符列表模式和标识符屏蔽位模式。标识符屏蔽位模式:可过滤出一组标识符。此时,这样 CAN_FxR0 中保存的就是标识符匹配值, CAN_FxR1 中保存的是屏蔽码,即 CAN_FxR1 中如果某一位为 1,则 CAN_FxR0 中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器; CAN_FxR1 中为 0的位表示 CAN_FxR0 中的相应位可不必与收到的帧进行匹配。标识符列表模式:可过滤出一个标识。此时 CAN_FxR0 和 CAN_FxR1 中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。注意: CAN_FilterIdHigh 是指高 16 位 CAN_FilterIdLow 是低 16 位应该将需要得到的帧的和过滤器的设置值左对齐起。所有的过滤器是并联的,即一个报文只要通过了一个过滤器,就是算是有效的。按工作模式和宽度,一个过滤器组可以变成以下几中形式之一: (1) 1个 32 位的屏蔽位模式的过滤器。(2) 2个 32 位的列表模式的过滤器。(3) 2个 16 位的屏蔽位模式的过滤器。(4) 4个 16 位的列表模式的过滤器。每组过滤器组有两个 32 位的寄存器用于存储过滤用的"标准值",分别是 FxR1 , FxR2 。在 32 位的屏蔽位模式下: 有1个过滤器。 FxR2 用于指定需要关心哪些位, FxR1 用于指定这些位的标准值。在 32 位的列表模式下: 有两个过滤器。 FxR1 指定过滤器 0的标准值 FxR2 指定过滤器 1的标准值。收到报文的标识符只有跟 FxR1 与 FxR1 其中的一个完全相同时,才算通过。在 16 位的屏蔽位模式下: 有2个过滤器。 FxR1 配置过滤器 0,其中, [31-16] 位指定要关心的位, [15-0] 位指定这些位的标准值。 FxR2 配置过滤器 1,其中, [31-16] 位指定要关心的位, [15-0] 位指定这些位的标准值。在 16 位的列表模式下: 有4个过滤器。 FxR1 的[15-0] 位配置过滤器 0, FxR1 的[31-16] 位配置过滤器 1。 FxR2 的[15-0] 位配置过滤器 2, FxR2 的[31-16] 位配置过滤器 3。 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 个过滤器,但是只激话了
can总线配置 来自淘豆网m.daumloan.com转载请标明出处.