前言在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符的值决定软件是否需要该报文;如果需要,就拷贝到RAM里;如果不需要,报文就被丢弃且无需软件的干预。为满足这一需求,beCAN为应用程序提供了个可配置的、位宽可变的6个(0-5)过滤器组,用于只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件进行过滤,从而占用一定的CPU资源。
滤波器设置滤波器设置包括下面几个寄存器:CAN滤波模式寄存器1 (CAN_FMR1)和CAN滤波模式寄存器2(CAN_FMR2)、CAN滤波配置寄存器1 (CAN_FCR1)、CAN滤波配置寄存器2 (CAN_FCR2)和CAN滤波配置寄存器3 (CAN_FCR3),CAN滤波组i寄存器x (CAN_FiRx) (i = 0 。。 5, x = 1 。。 8)。
滤波模式寄存器用于设置滤波器为标识符列表模式和掩码模式,滤波配置寄存器用于开启或关闭滤波器和滤波器的宽度设置,滤波组用于具体滤波设置。6个可配置的位宽可变的过滤器组,通过FSCx0(x=1..6)和FSCx1(x=1..6)设置滤波宽度,就32位滤波器设置进行解读,CAN报文分为标准帧和扩展帧,标准帧ID11位,扩展帧29位,ID与滤波配置映射关系如上表所示,如滤波模式设置可知可以分为两个ID或者一个ID+Mask。当需要过滤某一段ID时,使用ID+Mask模式,当过滤具体ID时直接使用ID模式即可。如果我的扩展id是0x12345678 ;想只接收0x12xxxxxx的标识符号,该如何设置滤波器,此处采用32位滤波器0进行滤波配置,因此FSC00 = 1;FSC01 = 1;FMH0 = 0;FML0 = 0;扩展id为0x12345678 (0001,0010,0011,0100,0101,0110,0111,1000)将扩展帧ID填入CAN帧ID格式中
RTR位我们设置为0表示数据帧,IDE位设置为1表示扩展ID,因为我们的ID是29位的,所以RTR = 0;IDE = 1;
如果要关心到具体的某一个比特位置;如果要过滤让它只接收0x12xxxxxx的表示符号;这时候要根据它实际在identify中的位置去修改idmask ; 前八个比特,对应的就是黄色和绿色的部分,所以其他的颜色,可以都填0表示不需要关心,则这里填入:1 1 1 1 ,1 x x x,我们这里填0xF8 ;CAN_F0R1 = 0x91; CAN_F0R2 = 0x00; CAN_F0R3 = 0x00; CAN_F0R4 = 0x00;CAN_F0R5 = 0x91; CAN_F0R6 = 0x00; CAN_F0R7 = 0x00; CAN_F0R8 = 0x00;同理,对于下面的配置是只接收标准id= 0x321(0011,0010,0001)的ID(也是32位过滤器),因为也是数据帧,所以RTR = 0,标准的id,所以IDE = 0 ;
CAN_F0R1 = 0x64; CAN_F0R2 = 0x20; CAN_F0R3 = 0x00; CAN_F0R4 = 0x00;CAN_F0R5 = 0xFF; CAN_F0R6 = 0xE0; CAN_F0R7 = 0x00; CAN_F0R8 = 0x00;
设置过滤器0只接收ID为0x1828A0EF和0x1828A0EE的数据帧。(工作在标识符列表模式)首先我们把这两个ID写成二进制:0x1828A0EF:0001 1000 0010 1000 1010 0000 1110 11110x1828A0EE:0001 1000 0010 1000 1010 0000 1110 1110然后我们将0x1828A0EF
二进制的格数据组成如上图mapping所示的格式Can_fxr1:1100 0001 0xc1Can _fxr2:0100 1001 0x49 //这里有个RTR位我们设置为0表示数据帧,IDE位设置为1表示扩展ID,Can _fxr3:0100 0001 0x41Can _fxr4:1101 1110 0xDE
这时我们工作在标识符列表模式,identifier/Mask的寄存器相当于identifier使用。
再将0x1828A0EE二进制的格数据组成如上图mapping所示的格式Can _fxr5:1100 0001 0xc1Can _fxr6:0100 1001 0x49 //这里有个RTR位我们设置为零表示数据帧,IDE设置为1表示扩展IDCan _fxr7:0100 0001 0x41Can _fxr8:1101 1100 0xDC
16位配置模式也经常使用,如CAN网络管理中往往涉及到网络管理ID-0x4xx,因此需要利用ID和Mask模式,其余的采用ID模式,可以建立滤波器设置寄存器数组。
0x400网段,0x330,0x3200x400:
展开 0000 0100 0000 0000,采用标准帧数据帧格式0x330: 展开 0000 0011 0011 00000x320:
展开 0000 0011 0010 0000CAN_F0R1: 100 0000 0 0x80CAN_F0R2: 000 00 000 0x00CAN_F0R3:
111 0000 0 0xE0CAN_F0R4:
00000000 0x00CAN_F0R5: 011 0011 0 0x66CAN_F0R6: 00000000 0x00CAN_F0R7: 011 0010 0 0x64CAN_F0R8: 00000000 0x00FSC00 = 0; FSC01 = 1; FMH0 = 1; FML0 = 0; FACT0 = 1;
在以往的项目中用过多个品牌的单片机,包括国产的,一直感觉ST的滤波器设置比较麻烦,每次用到的时候都要花较长时间去回忆。
上一篇:STM8S之TIM4自学笔记
下一篇:基于STM8主控的物美价廉的毫欧表设计
推荐阅读最新更新时间:2024-11-10 12:08
推荐帖子
- 怎么样打包驱动程序
- 本人想做一个关于IDCamera的驱动程序现在有个需要从新硬件发现然后搜索的那个东西但是需要的是,做出一个像EXE一样的打包出来,让人家方便点安装请问需要有那些环境,和配置支持怎么样打包驱动程序可以参考一下winpcap,就是你说的那种方式。如果是普通的Camera驱动程序?都没有人知道吗?
- dqlm016 嵌入式系统
- 继电器的使用
- 这款继电器能不能用作控制33V的通断?本来继电器是用于风扇的控制(风扇12V),但现在要求对加热块的电源输入处加一个继电器作为故障保护;电源电33V的;加热块功率60W,电流小于2A继电器是28V10A的,但我用来控制33V直流,请问我如果还用这个继电器,是否会有大的影响?继电器具体参数在附件图片中,线圈电压是5V继电器的使用可以的,继电器的控制通断能力,看触点的接触的电流电压大小。与线包没有关系的。可以使用,没有问题。但是继电器的生产厂家肯定不给你服安全责任我觉得用着肯定没问
- mark0908 单片机
- STM8还有准备送demo板吗?
- SWIM协议已经都看完了,想试试看(硬件已经准备好了,需要测试一下底层)。STM8还有准备送demo板吗?如果分析没有错的话,应该支持STM8是没有问题的相关链接:http://group.ednchina.com/1065/14987.aspx对SWIM的分析以及实现方法我们是ST的代理,已与多家STM32客人在合作,经验丰富,可以提供你需要的帮助,需要在STM32上了解的请与我联系,谢谢!邓世宏SimonDeng文晔集团/庆成企业
- abncat stm32/stm8
- 求助!! 我想学习WinCE方向的驱动编程(主要是网卡驱动),请问该怎么入门啊,我没写过驱动,只做过上层应用程序,或者给介绍基本好书也行,谢谢啦!!
- 麻烦各位高手指点!!求助!!我想学习WinCE方向的驱动编程(主要是网卡驱动),请问该怎么入门啊,我没写过驱动,只做过上层应用程序,或者给介绍基本好书也行,谢谢啦!!我也是的哈~~请求帮助
- nankeey WindowsCE
- 我用C8051f想编modbus协议
- 本帖最后由似是而非君于2015-8-117:20编辑 我想问如果编程modbus协议,我用单片机写的串口程序,发的是ASCll模式的,然后用串口助手接收的话收到的对(下边的图),,但是用modbus调试助手收到的就不对(第一张图),有不一样的,还有不是完整收到的。是有可能是什么情况,求大家踊跃发言我用C8051f想编modbus协议modbus可以用RS232作为物理层,但它并不完全是RS232,
- 似是而非君 51单片机
- [X-NUCLEO-53L4A3 TOF评估板]2.传感器光谱、激光功率、温度测试
- 下面分别从板子功率、激光功率、温度、光谱进行测试。首先进行板子的功率测试,使用USB功率测试仪,板子的工作电压5V,电流0.1A,总功耗0.5W左右。然后进行激光高功率测试,测试结果:正常工作时约2mW左右。接下来进行光谱测试,由测试结果可知激光的波长约940nm左右,这与官方参数基本一致。最后进行温度测试,使用后外热成像分辨率160*120,工作时单片机温度约为32℃左右,传感器温度约为27℃左右。总结: 测试项目 结果 板
- 镜花水月000 传感器
设计资源 培训 开发板 精华推荐
- #第五届立创电子设计大赛#20键数字小键盘
- 使用 Analog Devices 的 LT1425 的参考设计
- LT1021DCS8-5 电压基准的典型应用,具有无电流限制的升压输出电流
- 【征集令】云lineの热敏打印机
- MAXREFDES1209:使用MAX17501的非隔离12V/0.5A 6W降压转换器
- LED clock
- LTC1293 的典型应用——单芯片 12 位数据采集系统
- EVAL-AD974CBZ,用于 AD974 4 通道、16 位、200 kSPS ADC 的评估板
- ZXLD1374 60V 高精度 1.5A 降压 LED 驱动器转换器的典型应用降压配置
- 具有 400mA 突发模式操作、2.25MHz 同步降压稳压器的 LTC3621EMS8E-5 5Vout 的典型应用