STM8 CAN总线的IdMask模式的讲解

2023-05-16

http://www.stmcu.org/article/id-328212

STM8 CAN总线的IdMask模式的讲解

发布时间:2016-08-27
来源:ST社区
标签: STM8 CAN总线 IdMask
分享到:

前言
在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时根据标识符的值决定软件是否需要该报文;如果需要,就拷贝到RAM里;如果不需要,报文就被丢弃且无需软件的干预。为满足这一需求,BeCAN为应用程序提供了个可配置的、位宽可变的6个(0-5)过滤器组,用于只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件进行过滤,从而占用一定的CPU资源。

1


一、IdMask模式
首先,需要明白IdMask的作用:
举个例子吧,过滤器长度为32位,模式为屏蔽模式,假如我要发送的标示符为0x1314;那过滤器设置如下
1、过滤器完全无效 接收到的标示符全部通过
0x1314 二进制码: 00000000 0000 0000 0001 0011 0001 0100
CAN_Filter xxxx xxxx xxxx xxxx xxxx xxxxxxxx xxxx
CAN_FilterMask 0000 0000 0000 0000 00000000 0000 0000
因为 CAN_FilterMask屏蔽寄存器所有位都是0 ,对应标识符全为“不关心”,也就是接收到数据的ID(标识符)不用与 CAN_Filter寄存器的任何一位进行匹配。
2、过滤器完全有效 接收到的标识符要跟据CAN_FilterMask寄存器指定需要匹配的位进行与CAN_Filter比较。
部分匹配 :
0x1314 二进制码:    00000000 0000 0000 0001 0011 0001 0100
CAN_Filter       xxxx xxxx xxxx xxxx xxxx xxx1 xxxx xxxx
CAN_FilterMask    0000 0000 0000 0000 0000 0001 0000 0000
CAN_FilterMask 寄存器指定接收到的标示符要与第8位进行匹配,其他位不管。也就是说接收到的标示符第8位必须为1,否则报文就会被丢弃。

全部匹配:
0x1314 二进制码:    00000000 0000 0000 0001 0011 0001 0100
CAN_Filter      0000 0000 0000 0000 0000 0011 0001 0100
CAN_FilterMask    1111 1111 1111 1111 1111 1111 1111 1111
这种情况最为严格,接收到的标示符必须每一位都得与过滤器中的标示符的每一位进行匹配,有一位不对报文就会被丢弃。(这个标示符匹配的工作是CAN 模块内部硬件自动完成的)


二、IdMask库代码
本程序中,使用的软件代码是:
软件:
\STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Examples\CAN\CAN_Networking路径下面的代码。
硬件:
STM8/128 EVAL板子,上面的MCU为STM8S208MBT6B ;
程序里面打开了接收的中断:

2


为了能够更有效的操作实践这一功能,我使用了如上图的CAN总线的分析仪器USB-CAN200 以及它的上位机.
在这里需要说明一点,将R0+与R0-相短接,则内部的120欧姆的电阻会被接入总线,不需要画蛇添足,在R0+与R0-之间自己再找一个120欧姆的电阻外部接上!!

3

4
在接收中断里面已经有现成的标准桢结构,所以设置好Idfliter或者Idmask就可以。

5

也就是上面的 这一段函数;
按照刚才的理解,
如果我的扩展id是0x12345678 ;想只接收0x12xxxxxx的标识符号,那么是否填入
CAN_FilterID1 = 0x12 ;
CAN_FilterIDMask = 0xFF
就可以了呢? 本以为是这样,结果通过上位机发出去之后,led板上的符号并没有变化;说明并没有接收到。这是为什么呢?



三、分析

6

所以对于扩展的ID号码它有29位,但是程序中设计的过滤器位32位,所以:
如果假设扩展id为0x12345678(0001,0010,0011,0100,0101,0110,0111,1000)

7

所以扩展id的顺序填入如上图所示意,这儿假设:
RTR位我们设置为0表示数据帧,IDE位设置为1表示扩展ID,因为我们的ID是29位的,所以RTR = 0; IDE = 1;
再来看我们参考手册中,定义的 :

8
将上面数据中的标示符号位再填入到过滤器中:

9

所以可以看到颜色的顺序已经被打乱了,
如果要关心到具体的某一个比特位置;如果要过滤器让它只接收0x12xxxxxx的标识符号;
这时候要根据它实际在identifier中的位置去修改idmask ; 前八个比特,对应的就是黄色和绿色的部分,
所以其他的颜色,可以都填0表示不需要关心,则这里填入:1 1 1 1 ,1 xx x,我们这里填入0xF8 ;
即:
CAN_FilterID1=0x91;
CAN_FilterID2=0x00;
CAN_FilterID3=0x00;
CAN_FilterID4=0x00;
CAN_FilterIDMask1=0xF8; //0
CAN_FilterIDMask2=0x00; //0
CAN_FilterIDMask3=0x00; //0x0
CAN_FilterIDMask4=0x00; //
同理,对于下面的配置是只接收标准id=0x321(0011,0010,0001)的ID(也是32位过滤器),
因为也是数据帧,所以RTR = 0,标准的id,所以IDE= 0 ;所以填入到:

10

CAN_FilterID1=0x64;
CAN_FilterID2=0x20;
CAN_FilterID3=0x00;
CAN_FilterID4=0x00;
CAN_FilterIDMask1=0xFF; //0
CAN_FilterIDMask2=0xE0; //0
CAN_FilterIDMask3=0x0; //0x0
CAN_FilterIDMask4=0x0; //
如下图,测试通过

11


四、附录
在CAN规范中并未定义代表逻辑电平的物理状态(例如电压),iCAN网络使用符合ISO11898-2标准的电平信号,一般来讲,CAN总线为“隐性”(逻辑1)时,CAN_H和CAN_L的电平为2.5V(电位差为0V);CAN总线为“显性”(逻辑0)时,CAN_H和CAN_L的电平分别是3.5V和1.5V(电位差为2.5V)。

识别符
识别符—标准格式 识别符的长度为11 位,相当于扩展格式的基本ID(Base ID)。这些位按ID-28 到ID-18 的顺序发送。最低位是ID-18。7 个最高位(ID-28- ID-22)必须不能全是“隐性”。

识别符—扩展格式 和标准格式形成对比,扩展格式由29 位组成。其格式包含两个部分:11 位基本ID、18 位扩展ID。

基本ID:基本ID 包括11 位。它按ID-28 到ID-18 的顺序发送。它相当于标准识别符的格式。基本ID定义扩展帧的基本优先权。

扩展ID:扩展ID 18 位。它按ID-17 到ID-0 顺序发送。 标准帧里,识别符其后是RTR 位。 RTR 位(标准格式以及扩展格式) RTR 的全称为“远程发送请求位(RemoteTransmission Request BIT)”。 RTR 位在数据帧里必须为“显性”,而在远程帧里必须为“隐性” 。

扩展格式里,基本ID 首先发送,其次是IDE 位和SRR 位。扩展ID 的发送位与SRR 位之后。
SRR 位(扩展格式)
SRR 的全称是“替代远程请求位(SubstituteRemote Request BIT)”。
SRR 是一隐性位。它在扩展格式的标准帧RTR 位位置,因此代替标准帧的RTR 位。
标准帧与扩展帧的冲突是通过标准帧优先于扩展帧这一途径得以解决,扩展帧的基本ID(参见以下的“扩展识别符”)如同标准帧的识别符。
IDE 位(扩展格式) IDE 的全称是“识别符扩展位(IdentifierExtension Bit)”
IDE 位属于:
- 扩展格式的仲裁场
- 标准格式的控制场
标准格式里的IDE位为“显性(逻辑0)”,而扩展格式里的IDE位为“隐性”。

在标识符列表模式下,屏蔽寄存器当作标识符寄存器用。因此,使用2个标识符来代替上面的标识符加屏蔽位的方式。接收报文标识的每一位都必须跟过滤器标识符相同。
设置过滤器0只接收ID为0x1828A0EF和0x1828A0EE的数据帧。(工作在标识符列表模式)
首先我们把这两个ID写成二进制:
0x1828A0EF: 00011000001010001010000011101111
0x1828A0EE: 00011000001010001010000011101110
然后我们将0x1828A0EF二进制的格数据组成如上图mapping所示的格式
Cna_fxr1:1100 0001 0xc1
Cna_fxr2:01001001 0x49 //这里有个RTR位我们设置为0表示数据帧,IDE位设置为1表示扩展ID,
Cna_fxr3:0100 0001 0x41
Cna_fxr4:1101 1110 0xDE
这时我们工作在标识符列表模式,identifier/Mask的寄存器相当于identifier使用。
再将0x1828A0EE二进制的格数据组成如上图mapping所示的格式
Cna_fxr5:1100 0001 0xc1
Cna_fxr6:01001001 0x49 //这里有个RTR位我们设置为0表示数据帧,IDE设置为1表示扩展ID
Cna_fxr7:0100 0001 0x41
Cna_fxr8:1101 1100 0xDC
以下是用库函数配置的程序小片段:
CAN_FilterNumber =CAN_FilterNumber_0;
//注意这是的模式是跟IdMask例不一样的

CAN_FilterMode =CAN_FilterMode_IdList;
CAN_FilterScale =CAN_FilterScale_32Bit;
CAN_FilterID1=0xc1;
CAN_FilterID2=0x49;
CAN_FilterID3=0x41;
CAN_FilterID4=0xde;
CAN_FilterIDMask1=0xc1;
CAN_FilterIDMask2=0x49;
CAN_FilterIDMask3=0x41;
CAN_FilterIDMask4=0xdc;
相信看到这里你对这两种工作模式都会有了一定的了解。好了,到此例子就介绍完了,算是抛砖引玉。8位、16位的位宽是相似的,跟上面的分析一样。

 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM8 CAN总线的IdMask模式的讲解 的相关文章

  • Python 使用can模块(记录稿)

    直接安装 xff1a pip install python can 如果报这个错 更新一下pip pip3 install upgrade pip 或者是 pip install upgrade pip 再安装wrapt pip insta
  • G2O库和Eigen库can not find 问题——FindG2O.cmake FindEigen3.cmake

    目录 CMakeLists设置FindG2O cmake文件内容FindEigen3 cmake 文件内容 CMakeLists设置 在CMakeLists里加入如下这句话 xff0c 并在项目文件夹中新建cmake文件夹 LIST APP
  • Linux下CAN总线速率设置,socketCAN。

    背景 xff1a 飞思卡尔Freescale的ARM9处理器i MX25系列 socketCAN对于在Linux下操作CAN总线非常的快捷方便 xff0c 其配置方法和在Linux下对网卡的配置相似 xff0c 方法如下 xff1a 1 i
  • CAN报文解析—案例

    1 CAN报文定义 CAN报文是指发送单元向接受单元传送数据的帧 我们通常所说的CAN报文是指在CAN线 xff08 内部CAN 整车CAN 充电CAN xff09 上利用ECU和CAN卡接收到的十六进制报文 2 CAN协议中CAN报文种类
  • CAN总线多帧即连续帧数据发送 拆包与重装

    1939协议支持多帧数据发送即数据超过8个的帧发送 用户可以通过ID来识别当前帧是否为多帧发送 xff08 连续帧 xff09 xff0c 如果是多帧发送ID xff0c 举例 xff1a 1C EC F4 56 其中 F4和56为目标地址
  • 大疆M3508、M2006必备CAN总线知识与配置方法

    大疆M3508 M2006必备CAN总线知识与配置方法 文章目录 大疆M3508 M2006必备CAN总线知识与配置方法前言 xff1a 0x00 需要 额外的 CAN收发器 xff01 xff01 xff01 0x01 硬件层面分析为什么
  • linux-can编程(一)

    建立can的socket int can create socket char name int fd struct sockaddr can addr struct ifreq ifr socklen t len 61 sizeof ad
  • 基于NRF24L01的CAN数据透传

    闲谈 xff1a 闲来无聊 xff0c 恰好公司又经常用CAN数据的传输 xff0c 自己觉得要是用无线传送多好 xff0c 然后 xff0c 就是一个奇想 xff0c 就想做一个无线数据的透传 xff0c 恰好身边又有NRF24L01 那
  • 使用STM32F103做CAN的收发通信

    下面也是搭建嵌入式系统所必须的一个部分 参考网站 xff1a https www cnblogs com craigtao p 3645148 html https blog csdn net qq 29413829 article det
  • RT-thread 中CAN总线的应用

    准备 xff1a RT thread Studio 2 2 5 CubeMX 6 6 1 rt thread驱动包 4 0 3 1 新建项目 2 打开CubeMX Settings xff0c 设置CAN 找到CAN1 xff0c 并勾选激
  • CAN2.0和J1939协议的关系

    转发自http www cankau cn support help can vs j1939 html 很长时间没搞明白j1939与CAN2 0的关系 这篇文章让我明白了 CAN2 0是一种总线规范 是数据链路层的技术 J1939是SAE
  • 【汽车电子】浅谈汽车四大总线:LIN、CAN、FlexRay、MOST

    目录 1 前言 2 汽车四大总线 2 1 LIN总线 2 1 1 LIN总线概述 2 1 2 LIN总线工作原理 2 2 CAN总线 2 2 1 CAN总线概述 2 2 2 CAN总线工作原理 2 2 3 CAN总线的优点 2 3 Flex
  • 基于STM8的TIM定时器操作---STM8-第三章

    1 综述 STM8S提供三种类型的 TIM 定时器 高级控制型 TIM1 通用型 TIM2 TIM3 TIM5 和基本型定时器 TIM4 TIM6 它们虽有不同功能但都基于共同的架构 此共同的架构使得采用各个定时器设计应用变得非常容易与方便
  • 电池充放电自动测试系统介绍

    电池是国民经济的基础产品 广泛运用在交通运输 通讯 电力 铁路 国防 计算机 应急设备等各个领域 传统电池检测生产方式已经很难满足电池产品的市场需求 那么如何高效快速的进行电池产品的性能检测呢 今天就给大家介绍一款全能型电池测试系统 电池充
  • 关于使用IAR软件stlink下载stm8程序失败问题

    以前一直使用IAR很正常 这次使用使用stlink下载 stlink莫名其妙的就不能下载了 断电 重启 有时候能用 有时候真的就不能用了提示信息如下图 Failed to initialize communcation with hardw
  • Canoe 安装流程

    硬件 VN5620 软件 CANoe V15 0 软件 Vector License Client 6 2 驱动 Vector Driver Setup license 购买硬件时 vector会分配 参考文档 First Steps to
  • STM8单片机串口驱动的深度解析

    串口是单片机最重要的外设之一 在很多项目开发中都有应用 Lora模块的外部通讯方式就是串口 本节简单的和大家解析一下串口通讯及驱动代码的编程 STM8L101F3单片机支持一路串口通讯 我们先看一下Lora模块的硬件接口 如下图所示 串口的
  • 基于STM8的ADC0832采集及蓝牙通信系统

    为了方便大家学习 工程已经打包上传 http download csdn net detail devintt 8029389 最近在淘宝逛的时候发现了一款单片机 STM8 相比之前一直使用的也是8位的AVR相比 感觉STM8更为强大 芯片
  • CAN协议详解-01

    CAN 是控制器局域网络 Controller Area Network 的简称 它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的 并最终成为国际标准 ISO11519以及ISO11898 是国际上应用最广泛的现场总线之一 差
  • STM8的ADC的五种工作模式

    STM8的ADC的五种工作模式 STM8的ADC是10位的逐次比较型模拟数字转换器 多达16个多功能的输入通道 拥有5种转换模式 转换结束可产生中断 STM8 ADC的初始化顺序如下 1 AD输入通道对应的IO设置为上拉输入 2 配置AD参

随机推荐

  • Python+OpenCV颜色识别 物体追踪

    Python 43 OpenCV颜色识别 物体追踪 对于颜色识别和imutils包的用法请浏览我得另一篇博客 xff1a OpenCV学习笔记 文章目录 Python 43 OpenCV颜色识别 物体追踪代码原理代码最终效果图 个人博客原址
  • OpenCV模板匹配识别图片中的数字

    OpenCV模板匹配识别图片中的数字 前言 本博客主要实现利用OpenCV的模板匹配识别图像中的数字 xff0c 然后把识别出来的数字输出到txt文件中 xff0c 如果识别失败则输出 读取失败 操作环境 xff1a OpenCV 4 1
  • Python + Skimage + OpenCV 使用技巧 实现连通区域染色

    Skimage库使用 前言 个人博客地址 最近发现Skimage库挺好用的 xff0c 可以和OpenCV搭配一起使用 xff0c 让图像处理更加灵活和方便 本博客只对Skimage库做简单的介绍 xff0c 细节使用的话推荐官网查看或百度
  • Atlas200DK环境配置

    Atlas200DK环境配置 个人博客网站 dd镜像安装 推荐使用dd镜像安装环境 xff0c 这种方式更快更方便 直接去网站下载需要版本的dd镜像 xff0c 然后利用Etcher烧录到sd卡中就行 参考链接 xff1a Atlas 20
  • Matlab搭建AlexNet实现手写数字识别

    Matlab搭建AlexNet实现手写数字识别 个人博客地址 文章目录 Matlab搭建AlexNet实现手写数字识别环境内容步骤准备MNIST数据集数据预处理定义网络模型定义训练超参数网络训练和预测 代码下载 环境 Matlab 2020
  • [DIY]自制一个有漂亮外观的90W 203H高频焊台 ---【up项目终于完结了】

    于2019年4月23日完成一体式多功能焊接工具的高频烙铁部分 xff1b https www bilibili com video av50217593 论坛帖子发于数码之家 https www mydigit cn forum php m
  • sklearn实现基于TF-IDF的KNN新闻标题文本分类

    sklearn实现基于TF IDF的KNN新闻标题文本分类 文章目录 sklearn实现基于TF IDF的KNN新闻标题文本分类数据集下载读取数据集中文分词去除停用词TF IDF算法提取文本特征KNN分类器的设计完整代码下载 数据集下载 点
  • java序列化

    引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点 xff0c 在大部分情况下 xff0c 开发人员只需要了解被序列化的类需要实现 Serializable 接口 xff0c 使用
  • stm32串口中断收发数据环形缓冲区的设计

    Function Name USART2 IRQHandler Description This function handles USART2 global interrupt request Input None Output None
  • 图解快速区别——串口、COM口、UART、TTL、RS-232、RS-485

    参考 xff1a 串口 COM口 UART口 TTL RS 232 RS 485区别详解 作者 xff1a flyingju 发布时间 xff1a 2017 09 16 10 30 31 网址 xff1a https blog csdn n
  • P900数传端口定义

    P900数传端口引脚
  • P900数传配置教程

    typec线连接后按住SB2不松手后按住SB1 xff0c 分别松开SB2 SB1 xff0c 点击XCTU软件 http www pc6 com softview SoftView 602005 html 大写的 AT amp F7 设置
  • ubuntu查看软件安装路径

    ubuntu怎么查看软件安装位置在哪 服务器 亿速云 1 执行程序查看 在终端使用type执行软件程序查看 type google chrome 2 通过进程查看对应的软件程序 在终端使用以下命令查看所有进程名 ps e 再使用以下过滤命令
  • Ubuntu中wine程序安装windows软件中文乱码问题

    Ubuntu中wine程序安装windows软件中文乱码如何解决 1 安装wine sudo apt install wine 2 安装中文程序方法 下载exe文件在命令行执行 wine 文件名 exe 3 中文乱码原因分析 查看 home
  • ubuntu通过Trickle,wondershaper限制网速(上传下载速度)

    原文连接 xff1a https www ngui cc 51cto show 727932 html action 61 onClick 在Linux下没有Windows使用360那样去限制某个软件的速度 但是通过Trickle可以设置某
  • Ubuntu 16.04 重置密码(忘记密码)

    Ubuntu 16 04 重置密码 xff08 忘记密码 xff09 http blog topspeedsnail com archives 6042 忘记了你的Ubuntu用户密码 xff0c 登录不了系统 xff1b 不要紧 xff0
  • ubuntu下socket通信

    第一部分为C 43 43 实现 xff0c 第二部分为python实现 第一部分 该socket 的功能是在客户端输入了两个浮点数组成的字符串 xff0c 在服务端接受后将其转换为浮点数输出 xff0c 统一时刻只能有一个客户端连接 服务端
  • 关于螺旋桨的计算

    关于螺旋桨的计算 转载 http blog sina com cn s blog 4c2264b80100086z html 发给大家一些关与螺旋桨的计算公式 2007 02 07 13 08 46 功率 xff08 W xff09 直径
  • PID参数整定快速入门(调节器参数整定方法)

    转载地址 http yunrun com cn tech 440 html PID 参数整定方法很多 xff0c 常见的工程整定方法有临界比例度法 衰减曲线法和经验法 云南昌晖仪表制造有限公司以图文形式介绍以临界比例度法和衰减曲线法整定调节
  • STM8 CAN总线的IdMask模式的讲解

    http www stmcu org article id 328212 STM8 CAN总线的IdMask模式的讲解 发布时间 xff1a 2016 08 27 来源 xff1a ST社区 标签 xff1a STM8 CAN总线 IdMa