• 利用逻辑分析仪处理CAN协议数据


    1.设置逻辑分析仪

    采用的是正点原子的CAN程序。

    通过CAN发送的数据,在数据帧的数据段里;发送时标识符ID表示发送优先级,接收时标识符ID用于判断是否接收对应消息(而非靠地址来进行选择)

    设置合适的采样频率和软件定义的波特率500K

    2.数据分析

    实测SOF的宽度是2us,因此可计算出波特率为500K,与实际程序设置的速率一致。

    取图中的一部分数据分析,从左往右看:

    0|| 000 0[1]001 0010 0|| 000 1000 ||00 [1] 00 1110||0000 [1]1111 || [0] 000 10000||[1]0001 0001||...

    SOF|| ID RTR||  IDE r0 DLC|| data0 || data1 || CRC ||CRC界定符 ACK槽 ACK界定符

    注意:当连续输出5个相同的位,则需要插入一个反码位 ,如连续输出5个0则需要插入一个1,但这个1在读数时要去掉,上面[1]就是需要忽略的;连续输出5个1则需要插入一个0,但这个0在读数时要去掉,上面[0]就是需要忽略的

    数据帧的构成图解如下(标准帧和扩展帧只有中间一部分不同):

    注意这里抓的波形是标准帧

    解析信息:

    (1)SOC:起始帧  “0”
    (2)11位ID
            000 0001 0010 从右到左每4位一个字段,即为0x12

    (3)RTR:"0" 

             IDE:"0"

             r0   :"0"

    (4)DLC
            1000
            转换成十进制为8 表示这一帧中有8个数据,接下来的64个字节便表示8个数据

    (5)      Data1
            00 [1] 00 1110 = 0x0E   十进制为14

              Data2
            0000 [1]1111 = 0x0F       十进制为15

             Data3
            [0] 000 10000 = 0x10       十进制为16

            Data4
            [0] 000 10000 = 0x11       十进制为17

     剩下的数据依次类推。。。

    3.实验现象:

    4.理解过滤器

            (1)STM32F103ZET6 只有 14 个(增强型)。
            

            每个筛选器组由两个32位寄存器CAN_FxR1和CAN_FxR2组成。根据不同的实际需求,筛选器支持设置筛选范围和筛选模式。

    筛选范围可设置为32位和16位,两种方式筛选的范围有所差异:

    •     32位方式:筛选报文的STDID[10:0]、EXTID[17:0]、IDE、RTR;
    •     16位方式:筛选报文的STDID[10:0]、EXTID[17:15]、IDE、RTR;筛选模式可设置为列表模式和掩码模式,前者常用于筛选单个标识符,后者常用于筛选单组标识符:
    •     列表模式:此时两个寄存器都作为标识符寄存器,这两个标识符寄存器组成一个表,只有在此列表中的ID,才能通过筛选器,存入FIFO;
    •     掩码模式:此时两个寄存器作为标识符寄存器和掩码寄存器,根据掩码寄存器指定的哪些位与标识符寄存器匹配的ID,才能通过筛选器,存入FIFO;

            举个例子,如表 23.1.3 所示,ID为0xF,掩码为0x7FC。掩码位为1表示必须与ID一致,掩码位为0表示可不与ID一致,因此结果bit[1:0]为任意值,其它都需要与ID一致,则最后结果为11XX,即0xC~0xF之间的ID都可经过筛选器存入FIFO,其它则无法通过;

            结合上图举个例子,假设CAN总线上有ID为0至99的100个报文,现在只需要ID为0-5的报文,筛选器该如何设置?首先设置筛选器组0处于32位掩码模式,ID为0x0,掩码为0x7FC,结果将筛选出0x0-0x3。接着设置筛选器组1处于32位列表模式,列表两个ID分别设为0x04和0x05。最后ID为0x0~0x05的报文将通过筛选。
    (2)正点原子的例子:
            
          在举个简单的例子,我们设置过滤器组 0 工作在: 1 32 为位过滤器 - 标识符屏蔽模式,然
    后设置 CAN_F0R1=0XFFFF0000 CAN_F0R2=0XFF00FF00 。其中存放到 CAN_F0R1 的值就是
    期望收到的 ID ,即我们希望收到的映像( STID+EXTID+IDE+RTR )最好是: 0XFFFF0000 。而
    0XFF00FF00 就是设置我们需要必须关心的 ID ,表示收到的映像,其位 [31:24] 和位 [15:8] 16
    个位的必须和 CAN_F0R1 中对应的位一模一样,而另外的 16 个位则不关心,可以一样,也可
    以不一样,都认为是正确的 ID ,即收到的映像必须是 0XFFxx00xx ,才算是正确的( x 表示不
    关心)。

             配合程序代码来看,过滤器的作用是过滤一些不想要的报文,如果掩码设置成0x00000000,就是全部报文都接收,任何ID都不关心。

            

            当CAN总线网络中有多个CAN节点设备时,某一CAN设备发出数据帧,总线上所有设备(无过滤时)都获取该数据帧中仲裁段中的ID,如果是自己关注ID的数据,则获取数据段的内容,完成数据的传输。

     

  • 相关阅读:
    Python模块 adorner 的使用示例
    Java中String,Int,Date,Timestamp类型转化
    【通信原理课设--基于MATLAB/Simulink的2ASK数字带通传输系统建模与仿真】Simulink的使用介绍以及在本实验中的使用
    深度神经网络压缩与加速技术
    会议OA项目-首页->flex弹性布局,轮播图后台数据获取及组件使用(后台数据交互mockjs),首页布局
    leetcode 70.爬楼梯 动态规划
    【发表案例】IF6.5+,中科院2区,2个月录用,6天见刊!
    【数据结构】经典八大排序(Plus版)
    正则表达式(JAVA)
    3年亏9亿,达美乐比萨再次冲击港股IPO结局难料
  • 原文地址:https://blog.csdn.net/xc_123/article/details/126628713